信息的加密與去密
信息加密的簡單模型如圖所示:

就是先對數字信息\(x\)做一個變換\(E\),將變換后的信息\(y=E(x)\)發出,接收方收到信息\(y\)后,進行一個相反的變換\(D\)(也就是\(E\)的逆運算),恢復成數字信息\(x=D(y)\),從而識別原始信息。
通常把數字信息\(x\)叫做明文,加密后得到的數字信息\(y\)叫做密文,變換\(E\)和\(D\)分別叫做加密和去密的秘鑰。一般來說,秘鑰對\({E, D}\)由發送方和接收方約定和保存,不被外人所知。
例如,凱撒加密法,加密運算\(E(k) = k + 19(mod \ 31)\),去密運算\(D(k) = k+12(mod \ 31)\),這是互逆操作,即\(DE(k) = ED(k)=k\)。
- 這有一個缺點,由於D, E都非常簡單,已知一個很容易推出另一個。這相當於已知公鑰能推出私鑰,顯然不能用於公開秘鑰體制。
- 另一個缺點,兩兩之間需要保存一個秘鑰對\({E, D}\),如果是2000人相互通信,每個人都需要存\(C_{2000}^2 = 1 999 0000\)對
RSA加密算法
1976年,美國斯坦福大學的年輕數學家狄菲(Diffe)和計算機專家(Hellman)提出一種新的加密方法,叫做公開秘鑰體制。在這種體制下,信息的加密和去密使用兩個不同的秘鑰,加密用公鑰(公開的,任何人都可以看到),去密用私鑰(嚴格保密)。
1977年,美國MIT計算機科學實驗室的列維斯特(Rivest)等人基於大數分解的復雜性提出了一個方案,就是RSA。
RSA算法的具體描述如下:
(1)任意取兩個不同的大素數\(p\)和\(q\),計算乘積\(n=pq\),\(\varphi (n) = (p-1)(q-1)\)
(2)任取一個大整數\(e\),使得\(gcd(e, \varphi (n)) = 1\),注意:\(e\)是很容易取的,例如所有大於p和q的素數都可用
(3)計算出一個正整數\(d\),使得\(ed \equiv 1(mod \ \varphi (n))\),根據拓展歐幾里得定理很容易得到
(4)將\(n, e\)公開,\(d\)保密
(5)將明文\(x\)加密為密文\(y\),加密算法為 \(y = E(x) = x^e(mod \ n)\)
(6)將密文\(y\)解密為明文\(x\),解密算法為 \(D(y) = y^d(mod \ n) = x\)
這里需要證明一下為什么 \(D(y) = y^d(mod \ n) = x\),因為根據歐拉定理
設\(n\)為正整數,\(a\)為任意整數,且\((a, n)=1\),則
因此\(D(y) = y^d(mod \ n) = (x^e)^d(mod \ n) = x^{1 + k\varphi (n)}(mod \ n) = x\cdot (x^{\varphi (n)})^k(mod \ n) = x\)
一個有趣的一點:RSA也是互逆的,即\(ED(x) = DE(x) = x\)。
所以理論上,你可以用私鑰加密數據,發送別人別人用公鑰解密(這個過程叫簽名)。但通常都是別人用公鑰加密,你用私鑰解密發送過來的數據(這個過程叫加密)。
那有沒有可能已知一個秘鑰,推出另一個秘鑰?
比如公鑰\({n, e}\)是公開的,想借此推出私鑰\({n, d}\)。因為\(ed \equiv 1(mod \ \varphi (n))\),所以需要知道\(\varphi(n)\)。而\(\varphi(n) = (p-1)(q-1)\),因此需要將\(n\)分解成素因式\(pq\),而這是一個復雜性很高的問題。
數字簽名
利用數字簽名做身份認證,證明這條信息來自某某。
在公開秘鑰體制之前,身份認證一直沒有很好的解決方案。如今采用公開秘鑰體制做身份認證就很簡單。
在A向B發送信息之前,將信息\(x\)(比如寫的"我是A"),先用A的私鑰加密,得到\(y = E_A (x)\)(數字簽名),把\(y\)傳送給\(B\)后,\(B\)在公鑰本上找到\(A\)的公鑰,從而得到\(y\)對應的明文\(x\)。由於別人不知道\(A\)的私鑰,沒辦法偽造相同的信息,所以這個信息一定是來自\(A\)的。
同時進行簽名和加密
在公開密鑰體制下,發送方可以同時對信息進行簽名和加密。
例如甲要向乙發送信息,先用自己的私鑰簽名,再用對方的公鑰加密;接收方先用自己的私鑰解密,再用對方的公鑰解密,得到明文。

參考鏈接:
- 高中數學A版選修4-6 初等數論初步.pdf
- 百度百科-RSA算法
