城闕輔三秦馆里,風(fēng)煙望五津隘世。與君離別意,同是宦游人鸠踪。海內(nèi)存知己丙者,天涯若比鄰。無(wú)為在歧路营密,兒女共沾巾械媒。 ----《送杜少府之任蜀川》
(一)夢(mèng)回年少
童年的回憶總是充滿著中二和羞恥的,在香樟樹影婆娑的小學(xué)评汰,總有那么一個(gè)女同學(xué)讓不諳世事的我怦然心動(dòng)纷捞。她,流蘇漫動(dòng)被去,明眸璀璨主儡。
然而畢竟還是公交車半價(jià)的年紀(jì),表白又怎么可能像如今這樣喝湯一樣簡(jiǎn)單的說(shuō)出口编振。于是我想出了一個(gè)自以為極其浪漫和隱秘的方式告訴她缀辩。我鼓起勇氣給她寫了一張紙條:
506, 515, 194, 352
她疑惑不解臭埋,嘟起的嘴角和緊鎖的雙眉構(gòu)成那個(gè)明媚的下午最美麗的畫面。
而我臀玄,忐忑不安瓢阴。
其實(shí)很簡(jiǎn)單,這四個(gè)數(shù)字的答案就藏在桌角左邊那本被翻爛的新華字典第四版里面:506頁(yè)的“我”健无,515頁(yè)的“喜”荣恐,194頁(yè)的“歡”,352頁(yè)的“你”...
我看著那本新華字典累贤,卻久久不能開口...
(二)人類的剛需
加密叠穆,從古自今,都是人類的剛需臼膏,無(wú)論你是情竇初開的少年硼被,馬革裹尸的將軍,還是九五至尊的帝王渗磅。
還記得開頭的那首五言律詩(shī)么嚷硫,在北宋時(shí)期的沙場(chǎng),軍隊(duì)曾今將它用作秘密通訊始鱼。
首先仔掸,從1-40,每一個(gè)數(shù)字對(duì)應(yīng)常用的軍事訊號(hào)医清,比如:
1:請(qǐng)弓
2:請(qǐng)刀
3:請(qǐng)劍
.
.
.
40:戰(zhàn)小勝
軍隊(duì)出征前起暮,指揮機(jī)關(guān)將用上述短語(yǔ)編碼的密碼本發(fā)給將領(lǐng),并約定用一首不含重復(fù)文字的40字五言律詩(shī)與密碼相對(duì)應(yīng)会烙。在本例中就是那首《送杜少府之任蜀川》负懦,當(dāng)軍中缺弓箭的時(shí)候,將軍便將詩(shī)中第一個(gè)字“城”差人送往指揮處持搜,指揮處收到“城”之后密似,從詩(shī)中尋找,發(fā)現(xiàn)是第一個(gè)字葫盼,那邊是密碼本對(duì)應(yīng)的第一個(gè)訊號(hào):請(qǐng)弓残腌。
(三)加密學(xué)的烏云
然而在人類幾千年的加密斗爭(zhēng)中,屢屢被顯而易見的方法進(jìn)行破解贫导。譬如北宋的軍機(jī)加密抛猫,一旦有一個(gè)將軍供出密碼本和五言律詩(shī),那么所有的軍隊(duì)的軍機(jī)將全部被泄漏(且不說(shuō)這個(gè)五言律詩(shī)雖然方便的加密孩灯,但是由于它是人人皆知的名詩(shī)闺金,也方便了解密)。
一直到1977年以前峰档,無(wú)論人們用什么樣方法進(jìn)行加密败匹,歸根到底都是對(duì)稱加密,而所謂的對(duì)稱加密可以用下面的公式表示:
f(m, e) = c
f(c, e) = m
上述代碼中的m
代表原文掀亩,c
代表加密之后的密文舔哪,e
則代表秘鑰。在北宋的軍機(jī)加密中槽棍,秘鑰就是《送杜少府之任蜀川》這首五言律詩(shī)捉蚤。
秘鑰的加密解密通用性和現(xiàn)實(shí)傳輸環(huán)境的危險(xiǎn)性構(gòu)成了殘酷的二律背反,這樣的困境成為盤踞在人類密碼學(xué)上空的一朵烏云炼七。
(四)RSA非對(duì)稱加密
1973年缆巧,在英國(guó)政府通訊總部工作的數(shù)學(xué)家克利福德·柯克斯(Clifford Cocks)提出了一個(gè)非對(duì)稱的加密算法,該算法的一經(jīng)提出就被官方列入高級(jí)機(jī)密豌拙,直到1997年才被發(fā)表陕悬。
然而被歷史選中的不僅僅只有克利福德·柯克斯。1977年姆蘸,在大西洋的彼岸墩莫,三位麻省理工學(xué)院的教授羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出了相同的一套非對(duì)稱加密算法逞敷,并且以三人名字的首字符命名該算法,就是后來(lái)我們所熟知的RSA非對(duì)稱加密算法灌侣。
(五)從不可能出發(fā)
RSA算法的核心是利用當(dāng)代計(jì)算機(jī)無(wú)法將一個(gè)極大的整數(shù)快速的進(jìn)行質(zhì)因數(shù)分解這一特性來(lái)完成的推捐。
數(shù)論的工業(yè)應(yīng)用
數(shù)學(xué)是公認(rèn)的上帝的語(yǔ)言,它為現(xiàn)代物理化學(xué)生物等領(lǐng)域提供了無(wú)數(shù)堅(jiān)實(shí)的理論基礎(chǔ)侧啼。經(jīng)典牛頓力學(xué)在微積分的推導(dǎo)下熠熠生輝牛柒;當(dāng)量子力學(xué)停滯不前的時(shí)候,是矩陣站了出來(lái)給予了波恩痊乾;還有相對(duì)論所用到的微分幾何皮壁,包括張量,流形等等哪审。
然而古老的數(shù)論卻一直躲在數(shù)學(xué)的象牙塔里蛾魄,遲遲不肯向世人展示它的光輝,直到RSA非對(duì)稱算法的出現(xiàn)...
讓我們先來(lái)回顧一下數(shù)論的基礎(chǔ)知識(shí):
質(zhì)數(shù): 質(zhì)數(shù)(也稱為素?cái)?shù))定義為在大于1的自然數(shù)中叽奥,除了1和它本身以外不再有其他因數(shù)扔水。
合數(shù):合數(shù)指自然數(shù)中除了能被1和本身整除外,還能被其他數(shù)(0除外)整除的數(shù)朝氓。
- 分解質(zhì)因數(shù): 把一個(gè)合數(shù)分解成若干個(gè)質(zhì)因數(shù)的乘積的形式魔市,即求質(zhì)因數(shù)的過程叫做分解質(zhì)因數(shù)
OK主届,我們的出發(fā)點(diǎn)是:計(jì)算機(jī)可以快速的計(jì)算兩個(gè)質(zhì)數(shù)的乘積,但是如果想計(jì)算出一個(gè)極大整數(shù)的兩個(gè)質(zhì)因數(shù)待德,除了暴力試除之外別無(wú)他法君丁。
(六)加密算法步驟(對(duì)數(shù)學(xué)感到不適可跳過此節(jié))
1. 隨機(jī)選取兩個(gè)不相等的質(zhì)數(shù)p和q
let p = 13
let q = 11
2. 計(jì)算p和q的乘積,將其作為n磅网,等待之后使用
let n = 13 * 11 // 值為:143
3. 計(jì)算n的歐拉函數(shù)的值
首先我們來(lái)了解一下歐拉函數(shù):
歐拉函數(shù)(Euler's totient function):? 對(duì)正整數(shù)n谈截,歐拉函數(shù)是小于n且和n互質(zhì)的正整數(shù)(包括1)的個(gè)數(shù)。
通式為:其中p1, p2……pn為x的所有質(zhì)因數(shù)涧偷,x是不為0的整數(shù)簸喂。
比如:比如12 = 2 * 2 * 3那么φ(12)=12(1-1/2)(1-1/3)=4
即,歐拉函數(shù)φ(12)的值為4燎潮。
又由于我們?nèi)〉?code>p和q
都是質(zhì)數(shù)喻鳄,已知如下定理:
- 歐拉函數(shù)是積性函數(shù)——若m,n互質(zhì),則:
- 特殊性質(zhì):當(dāng)n為奇數(shù)時(shí):
由此我們可以得出:
φ(n) = φ(pq) = φ(p) * φ(q) = (p-1) * (q - 1) = 120
這樣我們便得到了n的歐拉函數(shù)的值: 120确封。
4.隨機(jī)選擇一個(gè)整數(shù)e除呵,條件是1< e < φ(n),且e與φ(n) 互質(zhì)
為了便于計(jì)算和演示爪喘,我們選取了7颜曾,在真實(shí)的環(huán)境中為了安全會(huì)盡量選取大的數(shù)字。
let e = 7
5. 計(jì)算e對(duì)于φ(n)的模反元素d
所謂"模反元素"就是指有一個(gè)整數(shù)d秉剑,可以使得ed被φ(n)除的余數(shù)為1泛豪。
公式表達(dá)為:
或者
帶入我們所得的e和φ(n)
ed ≡ 1 (mod φ(n))
即
ed + kφ(n) == 1
這個(gè)時(shí)候我們可以求助于擴(kuò)展歐幾里得算法。
該算法的Python實(shí)現(xiàn)如下:
def ext_euclid(a, b):
if b == 0:
return 1, 0, a
else:
x, y, q = ext_euclid(b, a % b) # q = gcd(a, b) = gcd(b, a%b)
x, y = y, (x - (a // b) * y)
return x, y, q
求得d為17侦鹏。
好了诡曙,我們暫停一下,看看我們現(xiàn)在得到了哪些數(shù)值:
參數(shù) | 值 | 說(shuō)明 |
---|---|---|
p | 13 | 我們隨機(jī)選擇的某一個(gè)質(zhì)數(shù) |
q | 11 | 我們隨機(jī)選擇的另外一個(gè)質(zhì)數(shù) |
n | 143 | q 和 p 的乘積 |
φ(n) | 120 | n的歐拉函數(shù)的值 |
e | 7 | 隨機(jī)的選擇一個(gè)整數(shù)e略水,條件是1< e < φ(n)价卤,且e與φ(n) 互質(zhì) |
d | 17 | e對(duì)于φ(n)的模反元素 |
這個(gè)時(shí)候我們已經(jīng)取得了RSA算法中所有的可用參數(shù),如果我們需要加密渊涝,那么我們只需要使用n
和e
組成的公鑰慎璧,如果我們需要解密,那么我們也只需用到n
和d
組成的私鑰驶赏。
加密公式:
c為加密之后的數(shù)據(jù)
解密公式:
m為加密之前的原始數(shù)據(jù)
舉個(gè)??
我們需要發(fā)送字符a
給對(duì)方炸卑,那么我們可以先將其轉(zhuǎn)換成ascii的值,即為97
煤傍。
那么發(fā)送方先將其進(jìn)行加密處理:
let c = 97 ^ 7 % 143 // 59
接受方拿到59
這個(gè)數(shù)字之后利用解密公式進(jìn)行解密:
let m = 59 ^ 17 % 143 // 97
(七)封裝秘鑰
那么他們是怎么組成私鑰以及公鑰的呢?
cat ~/.ssh/id_rsa
如果你執(zhí)行以上的命令盖文,那么你就能看到本地的RSA私鑰內(nèi)容,大概是這樣的:
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,C0C970581F0F182056E239BDC41199D0
MIICXTCCAUUCAQAwGDEWMBQGA1UEAwwNaGkgd2lraXBlZGlhITCCASIwDQYJKoZI
hvcNAQEBBQADggEPADCCAQoCggEBAMTwzCYD+iLlDwTu5Y43aQH9q1LF3kgot8I4
9ZgbFhDmCE4YlLhZKO4hieK6z8z+IfZjfapn01rzuzvTHESj5bSSU6AcEsKSOgTQ
uB+KKn4mgngyBrJwWjr4IZ9XkGsCLAP2/wkyJC2ire6FuTSQ00YGhKf1B3WbIBbn
5i1rvZXnYxlheWlNSmxx54q4gTwcd/V4nS4BThYA/ypATjHS/gfQ650cOQzRK/Jh
WfAbfnETYUpD6MCgZAIbaBuYvYpQEGqQ4niTvtSd07RHKnewcPFqJhMV86qN4HQY
4ZBNzQcF/2aCGHYyRniKznSDNijT2kaAz/L7ORqh+90qH/BLnKsCAwEAAaAAMA0G
CSqGSIb3DQEBCwUAA4IBAQAqV5g9AZGXEbM97ouTGDJqFNP2QjO9ZK9J3BOUTrFO
tMUrVWj+ixhC6vXD3o5uVL/fg6OlmK+13gsBpzg2mq72TBrZsNOK4+O0XvltIvSx
0H5tf1NYwuHxFgHDqgs/fQBOKFTadebJZHbPBtMrqlnenKYJiVb5YSWBZ7JKRCK7
VSgwNxxAMnSCNI0xF3EjZ1bjQkM8xGhnwe+n/RAd5Q2pMLIrquMoGMTUYLOq1xSB
sGTp8iLWbbWPl6gC1hcSMpFsbdyjMCWs+a2R2F8QnahrRfvpgFEndvzA2EvqHIoR
BHE1ChD7l691PxZP1eKA1I4AzZno5sb6SWyd8+pqY0oG
-----END RSA PRIVATE KEY-----
上面我們所看到的內(nèi)容格式被稱為PEM格式,這是一種專門用來(lái)存儲(chǔ)或者發(fā)送秘鑰證書的數(shù)據(jù)格式蚯姆。
這里比較讓人困惑的是中間內(nèi)容五续,他們是什么呢洒敏?這里我們又要牽涉出另外一種數(shù)據(jù)格式DER(Distinguished Encoding Rules),它是ASN.1(你只需要知道這是一種抽象語(yǔ)法標(biāo)記疙驾,類似JSON凶伙、XML)的二進(jìn)制表達(dá)格式。
emmm....等等它碎,有點(diǎn)深函荣,那么PEM的主體內(nèi)容到底是什么呢?
很簡(jiǎn)單扳肛,PEM的主體內(nèi)容就是DER的base64編碼過后的數(shù)據(jù)傻挂。
emmm....但是我們好像還是沒有看到到底是怎么封裝的RSA參數(shù),沒事挖息,我們來(lái)看一看例子就一目了然了:
公鑰DER格式
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
私鑰DER格式
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
}
在這里我們終于看到了所有我們?cè)谥靶燎谟?jì)算之后的參數(shù)金拒。瞬間神清氣爽,舒服 ~ 舒服 ~
總結(jié)一下套腹,整個(gè)封裝過程是這樣的:
說(shuō)完绪抛,女朋友已經(jīng)睡著好一會(huì)了。
參考
https://en.wikipedia.org/wiki/RSA_(cryptosystem)
https://zh.wikipedia.org/zh-cn/ASN.1
https://wiki.openssl.org/index.php/DER