RSA加密原理床邊故事

城闕輔三秦馆里,風(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ī)捉蚤。

對(duì)稱加密.jpg

秘鑰的加密解密通用性和現(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ì)稱加密算法灌侣。

MIT的三位大佬

(五)從不可能出發(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ù)喻鳄,已知如下定理:

  1. 歐拉函數(shù)是積性函數(shù)——若m,n互質(zhì),則:
  2. 特殊性質(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ù),如果我們需要加密渊涝,那么我們只需要使用ne組成的公鑰慎璧,如果我們需要解密,那么我們也只需用到nd組成的私鑰驶赏。

加密公式:

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è)封裝過程是這樣的:

PEM格式封裝示意圖

說(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末电禀,一起剝皮案震驚了整個(gè)濱河市幢码,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌尖飞,老刑警劉巖蛤育,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異葫松,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)底洗,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門腋么,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人亥揖,你說(shuō)我怎么就攤上這事珊擂。” “怎么了费变?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵摧扇,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我挚歧,道長(zhǎng)扛稽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任滑负,我火速辦了婚禮在张,結(jié)果婚禮上用含,老公的妹妹穿的比我還像新娘。我一直安慰自己帮匾,他們只是感情好啄骇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘟斜,像睡著了一般缸夹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上螺句,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天虽惭,我揣著相機(jī)與錄音,去河邊找鬼壹蔓。 笑死趟妥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的佣蓉。 我是一名探鬼主播披摄,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼勇凭!你這毒婦竟也來(lái)了疚膊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤虾标,失蹤者是張志新(化名)和其女友劉穎寓盗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體璧函,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡傀蚌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蘸吓。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片善炫。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖库继,靈堂內(nèi)的尸體忽然破棺而出箩艺,到底是詐尸還是另有隱情,我是刑警寧澤宪萄,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布艺谆,位于F島的核電站,受9級(jí)特大地震影響拜英,放射性物質(zhì)發(fā)生泄漏静汤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望撒妈。 院中可真熱鬧恢暖,春花似錦、人聲如沸狰右。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)棋蚌。三九已至嫁佳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谷暮,已是汗流浹背蒿往。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留湿弦,地道東北人瓤漏。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颊埃,于是被迫代替她去往敵國(guó)和親蔬充。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 學(xué)一點(diǎn)有趣的數(shù)論知識(shí) 在探究RSA算法的原理之前班利,我們先來(lái)學(xué)習(xí)一點(diǎn)有趣的數(shù)論知識(shí)(數(shù)學(xué)分支之一饥漫,主要研究整數(shù)的性質(zhì)...
    24f464006eaf閱讀 2,168評(píng)論 0 5
  • 這是去年12月在CSDN寫的一篇加密算法文章 現(xiàn)在決定在簡(jiǎn)書寫博客 移植過來(lái)方便復(fù)習(xí)再理解。 最近算法課老師要求小...
    icecrea閱讀 1,294評(píng)論 1 1
  • 前言 本文的RSA例子代碼更新在我的github上罗标。 RSA算法是最重要算法之一庸队,它是計(jì)算機(jī)通信安全的基石,保證了...
    game3108閱讀 11,657評(píng)論 2 53
  • 等公交車并非一件易事,而坐在公交車上并非是件安全的事情宙拉,面對(duì)一些突發(fā)其來(lái)的情況证膨,我們?cè)诜婪兜耐瑫r(shí)也要注意...
    昆悠閱讀 266評(píng)論 0 5
  • 這是一個(gè)在上海念法律的妹子每天發(fā)給我的作業(yè),太多太多鼓黔,放不下,大一不是應(yīng)該跟同學(xué)聚會(huì)不见,去玩澳化,去體驗(yàn)人生嗎? 而她卻...
    高級(jí)英才方芳老師閱讀 525評(píng)論 0 0