RSA加密原理床邊故事

城闕輔三秦,風(fēng)煙望五津。與君離別意,同是宦游人。海內(nèi)存知己,天涯若比鄰。無為在歧路,兒女共沾巾。 ----《送杜少府之任蜀川》

(一)夢(mèng)回年少

童年的回憶總是充滿著中二和羞恥的,在香樟樹影婆娑的小學(xué),總有那么一個(gè)女同學(xué)讓不諳世事的我怦然心動(dòng)。她,流蘇漫動(dòng),明眸璀璨。

然而畢竟還是公交車半價(jià)的年紀(jì),表白又怎么可能像如今這樣喝湯一樣簡單的說出口。于是我想出了一個(gè)自以為極其浪漫和隱秘的方式告訴她。我鼓起勇氣給她寫了一張紙條:

506, 515, 194, 352

她疑惑不解,嘟起的嘴角和緊鎖的雙眉構(gòu)成那個(gè)明媚的下午最美麗的畫面。

而我,忐忑不安。

其實(shí)很簡單,這四個(gè)數(shù)字的答案就藏在桌角左邊那本被翻爛的新華字典第四版里面:506頁的“我”,515頁的“喜”,194頁的“歡”,352頁的“你”...

我看著那本新華字典,卻久久不能開口...

(二)人類的剛需

加密,從古自今,都是人類的剛需,無論你是情竇初開的少年,馬革裹尸的將軍,還是九五至尊的帝王。

還記得開頭的那首五言律詩么,在北宋時(shí)期的沙場,軍隊(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)將用上述短語編碼的密碼本發(fā)給將領(lǐng),并約定用一首不含重復(fù)文字的40字五言律詩與密碼相對(duì)應(yīng)。在本例中就是那首《送杜少府之任蜀川》,當(dāng)軍中缺弓箭的時(shí)候,將軍便將詩中第一個(gè)字“城”差人送往指揮處,指揮處收到“城”之后,從詩中尋找,發(fā)現(xiàn)是第一個(gè)字,那邊是密碼本對(duì)應(yīng)的第一個(gè)訊號(hào):請(qǐng)弓。

(三)加密學(xué)的烏云

然而在人類幾千年的加密斗爭中,屢屢被顯而易見的方法進(jìn)行破解。譬如北宋的軍機(jī)加密,一旦有一個(gè)將軍供出密碼本和五言律詩,那么所有的軍隊(duì)的軍機(jī)將全部被泄漏(且不說這個(gè)五言律詩雖然方便的加密,但是由于它是人人皆知的名詩,也方便了解密)。

一直到1977年以前,無論人們用什么樣方法進(jìn)行加密,歸根到底都是對(duì)稱加密,而所謂的對(duì)稱加密可以用下面的公式表示:

f(m, e) = c
f(c, e) = m

上述代碼中的m代表原文,c代表加密之后的密文,e則代表秘鑰。在北宋的軍機(jī)加密中,秘鑰就是《送杜少府之任蜀川》這首五言律詩。

對(duì)稱加密.jpg

秘鑰的加密解密通用性和現(xiàn)實(shí)傳輸環(huán)境的危險(xiǎn)性構(gòu)成了殘酷的二律背反,這樣的困境成為盤踞在人類密碼學(xué)上空的一朵烏云。

(四)RSA非對(duì)稱加密

1973年,在英國政府通訊總部工作的數(shù)學(xué)家克利福德·柯克斯(Clifford Cocks)提出了一個(gè)非對(duì)稱的加密算法,該算法的一經(jīng)提出就被官方列入高級(jí)機(jī)密,直到1997年才被發(fā)表。

然而被歷史選中的不僅僅只有克利福德·柯克斯。1977年,在大西洋的彼岸,三位麻省理工學(xué)院的教授羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出了相同的一套非對(duì)稱加密算法,并且以三人名字的首字符命名該算法,就是后來我們所熟知的RSA非對(duì)稱加密算法

MIT的三位大佬

(五)從不可能出發(fā)

RSA算法的核心是利用當(dāng)代計(jì)算機(jī)無法將一個(gè)極大的整數(shù)快速的進(jìn)行質(zhì)因數(shù)分解這一特性來完成的。

數(shù)論的工業(yè)應(yīng)用

數(shù)學(xué)是公認(rèn)的上帝的語言,它為現(xiàn)代物理化學(xué)生物等領(lǐng)域提供了無數(shù)堅(jiān)實(shí)的理論基礎(chǔ)。經(jīng)典牛頓力學(xué)在微積分的推導(dǎo)下熠熠生輝;當(dāng)量子力學(xué)停滯不前的時(shí)候,是矩陣站了出來給予了波恩;還有相對(duì)論所用到的微分幾何,包括張量,流形等等。
然而古老的數(shù)論卻一直躲在數(shù)學(xué)的象牙塔里,遲遲不肯向世人展示它的光輝,直到RSA非對(duì)稱算法的出現(xiàn)...

讓我們先來回顧一下數(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ù),除了暴力試除之外別無他法。

(六)加密算法步驟(對(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ù)的值

首先我們來了解一下歐拉函數(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ù) 說明
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格式,這是一種專門用來存儲(chǔ)或者發(fā)送秘鑰證書的數(shù)據(jù)格式。

這里比較讓人困惑的是中間內(nèi)容,他們是什么呢?這里我們又要牽涉出另外一種數(shù)據(jù)格式DER(Distinguished Encoding Rules),它是ASN.1(你只需要知道這是一種抽象語法標(biāo)記,類似JSON、XML)的二進(jìn)制表達(dá)格式。

emmm....等等,有點(diǎn)深,那么PEM的主體內(nèi)容到底是什么呢?

很簡單,PEM的主體內(nèi)容就是DER的base64編碼過后的數(shù)據(jù)

emmm....但是我們好像還是沒有看到到底是怎么封裝的RSA參數(shù),沒事,我們來看一看例子就一目了然了:

公鑰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格式封裝示意圖

說完,女朋友已經(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)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評(píng)論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,616評(píng)論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評(píng)論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評(píng)論 1 334
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,727評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,928評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,165評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評(píng)論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,585評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,892評(píng)論 2 372

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

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