公共密鑰
公共密鑰
公共密鑰是指明文與加密密鑰一起採取不可逆數學運算進行組合變化,形成密文的一組秘鑰。
目錄
"密碼"已經是一個老少皆知的詞,想從銀行里把錢取出來嗎?沒密碼可萬萬不行。不知從什麼時候開始,這麼一個軍事級的辭彙已經走進了千家萬戶,婦孺皆知。不過知道“密鑰”這個詞的人就少多了,知道“公共密鑰”的人就更少了,不但知道而且了解其原理的人則少之又少,當然,如果你以前不清楚的話,那麼你即將加入這少之又少的行列:)
long long ago,隨著軍事的日益發展,情報的重要性日益提高,如何獲得準確的情報成為軍事上的一大重點,伴隨而來的另一個問題則是如何盡量保證自己的情報在被敵人截獲后(這總是無可避免的)敵人依然無法獲得該情報的信息,防止情報外泄。不妨讓我們以今人的智慧來設身處地的想一想,有什麼好的解決方法……首先想到的當然是用密文不要用明文,把明文按某種規則打亂為密文、或者讓明文與密文有某種一一對應的規則,這樣即使密文泄露,只要敵人不知道我的明文與密文之間轉換的規則,它將一無所獲。這是一種簡單且行之有效的方法,即便到了近代一戰二戰中,還被廣泛使用著,當然它的這個規則往往是動態的,甚至可能相當複雜。然而這樣的方案在理論上有一個重大的缺陷,那就是你如何安全地傳遞“規則”?兩地之間要確保能互相將密文變成明文,必須有共同的規則,那麼就至少需要"一次"安全地將“規則”從一地傳到另一地,這在理論上是無法保證的,所以整個的安全體系也就無法讓人完全地放心,一旦規則泄露,對密文體系的打擊則是致命的。有沒有什麼更好的辦法呢?嗯,如果你以前沒有接觸過的話,我估計你是想不出了。解決的方法正是公共密鑰體系。
讓我們再回頭來看一看我們是如何將明文變成密文的,最簡單的是將它重新打亂,或者進行某種線性或非線性變換,立刻就讓人難以閱讀,但這也是最容易破譯的,因為這種自身的變換在數學上相對容易求解,在現在的計算機的幫助下,通過一定量密文明文的統計分析,很容易找到其變化的規則。高級一點的,可以再用一組密碼(可以是動態改變的,譬如隨日期而改變),讓明文與這組密碼進行某種組合變化,從而得到一組密文,這樣,由於這個“組合變化”可能是非常複雜的一種數學變換,僅通過密文或者加上一定量的明文也很難找出這組密碼以及這個“組合變化”的規則。這就是目前絕大多數加/解密的根本原理。而這裡的這組密碼,我們就把它稱作密鑰。
但是這只是提高了獲得密文者的對密文的破譯難度,並沒有解決我們前面提出的問題。現在就要來看看“共公(共開)”的含義了。在數學上有一種運算是單向的(在數學理論上截止目前為止),從一個方向算過去很簡單,但是它的逆運算當缺少正向運算時加入的一些信息時,就會變得幾乎不可能(譬如大素數的分解,分解是困難到幾乎不可能的,分解后的兩個數乘回去是簡單的,小學生就會,這就是著名的RSA的原理)。這就構成了我們的“共公密鑰”的理論基礎。
具體使用如下:我們首先產生一對密鑰,一把稱為加密密鑰,一把稱為解密密鑰,它們是相關但不相同的。加密時我們把明文與加密密鑰一起採取“不可逆”數學運算進行“組合變化”,形成密文,解密時把密文與解密密鑰一起採取類似的運算進行解密,注意,這處因為加密密鑰與解密密鑰產生時即是相關連的,所以解密密鑰能夠完成這樣一個“逆運算”。同時,解密密鑰也可以用來加密,相應的,加密密解也可以用來解“用解密密鑰加密的密文”。具體使用的時候很簡單,把加密密鑰當作公共密鑰,分發給任何想要獲取的人,解密密鑰由自己妥善保管作為私鑰。當擁有加密密鑰的人要傳遞密文給自己時,他只要使用自由獲取的我的公共密鑰來加密該明文即可,當然,他加密以後他自己也是不能解的,但是傳到我手裡以後,我則可以用解密密鑰來解密,這樣就很好地解決了前面提出的無法安全傳輸“規則”的問題,現在我的公共密鑰是公開的,你要拿就拿去好了:)而私鑰我自己好好保存,不用把它放出來。
公共密鑰另一個重要作用就是用來簽名。我使用私鑰對自己的文件加密后,你來使用我發放的公鑰來解密,如果解密成功,則可證明這的確是我發出來的文件。
在現在網路信息安全常常使用的證書體系中,“證書”的背後其實也是這樣的一種公共密鑰體系。