寫給大家看的RSA加密算法

前段時間看的《王牌特工》帥氣的科林叔一把紳士傘在手,天下我有的氣勢征服了所有觀眾,凡是特工就沒有不和加密解密打交道的,我們經(jīng)??吹絺商诫娪暗臉蚨?,勇敢又機智的主角,拿著一長串毫無意義的數(shù)字苦惱,忽然靈光一閃,翻出一本厚書,將第一個數(shù)字對應頁碼數(shù),第二個數(shù)字對應行數(shù),第三個數(shù)字對應那一行的某個詞。數(shù)字變成了一串非常有意義的話:

Eat the beancurd with the peanut. Taste like the ham.

主角喜極而泣……

這種加密方法是將原來的某種信息按照某個規(guī)律打亂。某種打亂的方式就叫做密鑰(cipher code)。發(fā)出信息的人根據(jù)密鑰來給信息加密,而接收信息的人利用相同的密鑰,來給信息解密。就好像一個帶鎖的盒子。發(fā)送信息的人將信息放到盒子里,用鑰匙鎖上。而接受信息的人則用相同的鑰匙打開。加密和解密用的是同一個密鑰,這種加密稱為對稱加密(symmetric encryption)。

1

如果一對一的話,那么兩人需要交換一個密鑰。一對多的話,比如總部和多個特工的通信,依然可以使用同一套密鑰。但這種情況下,對手偷到一個密鑰的話,就知道所有交流的信息了。二戰(zhàn)中盟軍的情報戰(zhàn)成果,很多都來自于破獲這種對稱加密的密鑰。

1

二戰(zhàn)中德軍的傳奇加密機:Enigma

為了更安全,總部需要給每個特工都設計一個不同的密鑰。如果是FBI這樣龐大的機構,恐怕很難維護這么多的密鑰。在現(xiàn)代社會,每個人的信用卡信息都需要加密。一一設計密鑰的話,銀行怕是要跪了。

 

對稱加密的薄弱之處在于給了太多人的鑰匙。如果只給特工鎖,而總部保有鑰匙,那就容易了。特工將信息用鎖鎖到盒子里,誰也打不開,除非到總部用唯一的一把鑰匙打開。只是這樣的話,特工每次出門都要帶上許多鎖,太容易被識破身份了??偛坷洗笙肓讼耄纱嗑桶言戽i的技術公開了。特工,或者任何其它人,可以就地取材,按照圖紙造鎖,但無法根據(jù)圖紙造出鑰匙。鑰匙只有總部的那一把。

1

上面的關鍵是鎖和鑰匙工藝不同。知道了鎖,并不能知道鑰匙。這樣,銀行可以將“造鎖”的方法公布給所有用戶。每個用戶可以用鎖來加密自己的信用卡信息。即使被別人竊聽到,也不用擔心:只有銀行才有鑰匙呢!這樣一種加密算法叫做非對稱加密(asymmetric encryption)。非對稱加密的經(jīng)典算法是RSA算法。它來自于數(shù)論與計算機計數(shù)的奇妙結合。

為了了解RSA加密,請聽一個臥底的自白:

RSA加密

我是潛伏在龍鳳大酒樓的臥底。想讓下面信息以加密的方式發(fā)送到總部:

A CHEF HIDE A BED

廚子藏起來了一張床!這是如此的重要,需要立即通知總部。千萬重要的是,不能讓反革命的廚子知道。

第一步是轉碼,也就是將英文轉換成某個對應的數(shù)字。這個對應很容易建立,比如:

A B C D E F G H I
1 2 3 4 5 6 7 8 9

將上面的信息轉碼,獲得下面的數(shù)字序列:

A CHEF HIDE A BED

1 3856 8945 1 254

這串數(shù)字完全沒有什么秘密可言。廚子發(fā)現(xiàn)了這串數(shù)字之后,很容易根據(jù)數(shù)字順序,對應字母表猜出來。

為了和狡猾的廚子斗智斗勇,我們需要對這串數(shù)字進一步加密。使用總部發(fā)給我們的鎖,兩個數(shù)字:3和10。我們分為兩步處理。

第一步是求乘方。第一個數(shù)字是3,也就是說,總部指示我們,求上面數(shù)字串的3次方:

原字符串:?1 ? 3 ? 8 ? 5 ? 6 ? 8 ? 9 ? 4 ? 5 ? 1 ? 2 ? 5 ? 4

三次乘方: 1 ?27 512 125 216 512 729 ?64 125 ? 1 ? 8 125 ?64

第二步是求余數(shù)。第二個上鎖的數(shù)字是10,將上面每個三次乘方除以10,獲得其余數(shù):

余數(shù): 1 7 2 5 6 2 9 4 5 1 8 5 4

將這串數(shù)字發(fā)回總部。中途被廚子偷看到,但一時不能了解其中的意思。如果還是像剛才一樣對應字母表的話,信息是:

AGBEFBIDEAHED

這串字母完全不包含正常的單詞。

信息到了總部??偛块_始用神奇的鑰匙來解讀。這個鑰匙是3。(偷偷告訴你的,別告訴廚子。)

(這里鑰匙不小心和之前鎖中的一個數(shù)字相同。這只是巧合。)

解鎖過程也是兩步。第一步求鑰匙次的乘方,即3次方。第二步求它們除以10(鎖之一)的余數(shù)。

加密信息:1 ? 7 ? 2 ? 5 ? 6 ? 2 ? 9 ? 4 ? 5 ? 1 ? 8 ? 5 ? 4

三次乘方:1 343 ? 8 125 216 ? 8 729 ?64 125 ? 1 512 125 ?64 (這里用的是鑰匙的“3”)

除十得余:1 ? 3 ? 8 ? 5 ? 6 ? 8 ? 9 ? 4 ? 5 ? 1 ? 2 ? 5 ? 4

正是我們發(fā)送的信息。對應字母表,總部可以立即知道原來的信息。

總結

正如我在“數(shù)學與編程”中提到的,數(shù)學可以是程序員軍火庫中有力的武器。加密、解密這一事關IT安全的大課題,卻和數(shù)論這一純粹數(shù)學學科發(fā)生奇妙的關系。RSA算法的數(shù)學基礎在于歐拉定理。這一誕生了幾百年沒有什么實用性的數(shù)學理論,卻在網(wǎng)絡時代,找到自己的棲身之處。

加密算法有很多,這次我們只講RSA算法。公開的加密方式,私有的解密方式。RSA安全的關鍵在于很難對一個大的整數(shù)進行因子分解。相信這次你應該對于RSA加密不再恐懼了吧。