要講逆向,那么肯定少不了密碼學(xué),因?yàn)樗械哪嫦?攻防)都是對(duì)已加密的數(shù)據(jù)進(jìn)行解密。所以我們必須初步了解加密的方式有哪些,畢竟知己知彼,才能百戰(zhàn)百勝。
接下來(lái),我將從以下四方面來(lái)講述密碼學(xué)相關(guān)的內(nèi)容:
1、什么是密碼學(xué)
2、RSA數(shù)學(xué)原理
3、RSA終端命令
4、總結(jié)
1、什么是密碼學(xué)
密碼學(xué)的歷史大致可以追溯到兩千年前,相傳古羅馬名將凱撒大帝為了防止敵方截獲情報(bào),用密碼傳送情報(bào)。凱撒的做法很簡(jiǎn)單,就是對(duì)二十幾個(gè)羅馬字母建立一張對(duì)應(yīng)表。這樣,如果不知道密碼本,即使截獲一段信息也看不懂。
從凱撒大帝時(shí)代到上世紀(jì)70年代這段很長(zhǎng)的時(shí)間里,密碼學(xué)的發(fā)展非常的緩慢,因?yàn)樵O(shè)計(jì)者基本上靠經(jīng)驗(yàn)。沒(méi)有運(yùn)用數(shù)學(xué)原理。
在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種算法。在交互數(shù)據(jù)的時(shí)候,彼此通信的雙方就必須將規(guī)則告訴對(duì)方,否則沒(méi)法解密。那么加密和解密的規(guī)則(簡(jiǎn)稱密鑰),它保護(hù)就顯得尤其重
要。傳遞密鑰就成為了最大的隱患。這種加密方式被成為對(duì)稱加密算法(symmetric encryption algorithm)。
1976年,兩位美國(guó)計(jì)算機(jī)學(xué)家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構(gòu)思,可以在不直接傳遞密鑰的情況下,完成密鑰交換。這被稱為“迪菲赫爾曼密鑰交換”算法。開(kāi)創(chuàng)了密碼學(xué)研究的新方向。
1977年三位麻省理工學(xué)院的數(shù)學(xué)家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起設(shè)計(jì)了一種算法,可以實(shí)現(xiàn)非對(duì)稱加密。這個(gè)算法用他們?nèi)齻€(gè)人的名字命名,叫做RSA算法。
也就是說(shuō)「迪菲赫爾曼密鑰交換」在密碼學(xué)歷史的車輪中成為了一個(gè)轉(zhuǎn)折點(diǎn)。
2、RSA數(shù)學(xué)原理
咱們這里先把所有需要用到的公式定理列出來(lái):
1、取模運(yùn)算
2、歐拉函數(shù)φ
3、歐拉定理,費(fèi)馬小定理
4、模反元素
5、迪菲赫爾曼密鑰交換
1、取模運(yùn)算
取模運(yùn)算(“Modulo Operation”)和取余運(yùn)算(“Complementation ”)兩個(gè)概念有重疊的部分但又不完全一致。主要的區(qū)別在于對(duì)負(fù)整數(shù)進(jìn)行除法運(yùn)算時(shí)操作不同。
在這列出各種負(fù)數(shù)情況的例子供大家理解:
7 mod 4 = 3(商 = 1 或 2,1<2,取商=1)
-7 mod 4 = 1(商 = -1 或 -2,-2<-1,取商=-2)
7 mod -4 = -1(商 = -1或-2,-2<-1,取商=-2)
-7 mod -4 = -3(商 = 1或2,1<2,取商=1)
函數(shù)值符號(hào)規(guī)律(余數(shù)的符號(hào)) mod(負(fù),正)=正 mod(正,負(fù))=負(fù)
結(jié)論:兩個(gè)整數(shù)求余時(shí),其值的符號(hào)為除數(shù)的符號(hào)。
2、歐拉函數(shù)φ(讀fai,三聲)
可以簡(jiǎn)單理解為:
如果n可以分解為兩個(gè)互質(zhì)(不一定是兩個(gè)質(zhì)數(shù))的數(shù)之積A和B,那么:
φ(n) = φ(A) * φ(B)
如果 A和B 又同時(shí)為質(zhì)數(shù),那么:
φ(n) = (A-1) * (B-1)
3、歐拉定理,費(fèi)馬小定理
首先這里說(shuō)一下,定制之所以是定理是被人證明過(guò)的,如何證明的不管,當(dāng)然你也可以增加去證明下,反正我不管(……&%¥%……&%&……&%),哈哈
如果m、n為正整數(shù),且m、n互質(zhì),那么:
如果n為質(zhì)數(shù),那么:
公式轉(zhuǎn)換:
4、模反元素
如果兩個(gè)正整數(shù)e和x互質(zhì),那么一定可以找到整數(shù)d,使得 e*d-1 被x整除。那么d就是e對(duì)于x的“模反元素”。
5、迪菲赫爾曼密鑰交換
如上圖:
客戶端持有一個(gè)隨機(jī)數(shù)13 ,服務(wù)端持有隨機(jī)數(shù)15,再選一對(duì)特殊的數(shù),3是17的原根(啥是原根?)。
兩端交換的都是密文,就算中間被劫持,也不知道最后需要的傳輸?shù)膬?nèi)容是10
那么這個(gè)10就是最后真正的秘鑰。
證明過(guò)程
==> 3^(13 * 15) mod 17 = 3^(13 * 15) mod 17
根據(jù)模冪運(yùn)算 ((m^e mod n)^d) mod n = m^(e*d) mod n
==> (3^13 mod 17)^13 mod 17 = (3^15 mod 17)^15 mod 17
由于 3^13 mod 17 = 12
3^15 mod 17 = 6
==> 6^13 mod 17 = 12^15 mod 17 = 10
設(shè)
m=3 ,e=13 ,d=15 ,n=17 ,C=12
那么:
m^e mod n = c
c^d mod n = (m^e mod n)^d mod n = m^(e*d) mod n
又由于上面模反元素 最后得出
m^(e*d) mod n = m
所以得出最終結(jié)論:
m^e mod n = c
c^d mod n = m
這個(gè)公式也就是我們最后的RSA加密公式!!!
其中:
公鑰: n和e
私鑰: n和d
明文: m
密文: c
d是e對(duì)于φ(n)的“模反元素”。
補(bǔ)充:
1、n會(huì)非常大,長(zhǎng)度一般為1024個(gè)二進(jìn)制位。(目前人類已經(jīng)分解的最大整數(shù),232個(gè)十進(jìn)制位,768個(gè)二進(jìn)制位)
2、由于需要求出φ(n),所以根據(jù)歐函數(shù)特點(diǎn),最簡(jiǎn)單的方式n 由兩個(gè)質(zhì)數(shù)相乘得到: 質(zhì)數(shù):p1、p2
Φ(n) = (p1 -1) * (p2 - 1)
3、最終由φ(n)得到e 和 d 。
總共生成6個(gè)數(shù)字:p1、p2、n、φ(n)、e、d
關(guān)于RSA的安全:
除了公鑰用到了n和e 其余的4個(gè)數(shù)字是不公開(kāi)的。
目前破解RSA得到d的方式如下:
1、要想求出私鑰 d 。由于ed = φ(n)k + 1。要知道e和φ(n);
2、e是知道的,但是要得到 φ(n),必須知道p1 和 p2。
3、由于 n=p1*p2。只有將n因數(shù)分解才能算出。
3、RSA終端命令
由于Mac系統(tǒng)內(nèi)置OpenSSL(開(kāi)源加密庫(kù)),所以我們可以直接在終端上使用命令來(lái)玩RSA. OpenSSL中RSA算法常用指令主要有三個(gè):
命令 | 含義 |
---|---|
genrsa | 生成并且輸出一串RSA私鑰 |
rsautl | 使用RSA密鑰進(jìn)行加密、解密、簽名和驗(yàn)證等運(yùn)算 |
rsa | 處理RSA密鑰的格式轉(zhuǎn)換等問(wèn)題 |
1、生成RSA私鑰,密鑰長(zhǎng)度為1024bit
// 生成RSA私鑰,密鑰長(zhǎng)度為1024bit
openssl genrsa -out private.pem 1024
2、從私鑰中提取公鑰
// 從私鑰中提取公鑰
openssl rsa -in private.pem -pubout -out public.pem
3、將私鑰轉(zhuǎn)換成為明文
// 將私鑰轉(zhuǎn)換成為明文
openssl rsa -in private.pem -text -out private.txt
cat private.txt
4、通過(guò)公鑰加密數(shù)據(jù),私鑰解密數(shù)據(jù)
// 新建一個(gè)文件,在文件中隨意輸入內(nèi)容,比如輸入字符串”Hello“
vim message.txt
// 查看文件
cat message.txt
// 通過(guò)公鑰進(jìn)行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
// 通過(guò)私鑰進(jìn)行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
// 查看加密后的文件
cat enc.txt
// 查看解密后的文件
cat dec.txt
5、通過(guò)私鑰加密數(shù)據(jù),公鑰解密數(shù)據(jù)
// 私鑰加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc_2.txt
// 公鑰加密
openssl rsautl -verify -in enc_2.txt -inkey public.pem -pubin -out dec_2.txt
4、總結(jié):
1、由于RSA加密解密用的不是一套數(shù)據(jù),所以其保證了安全性。
2、由于私鑰過(guò)大,所以效率較低
3、如果有一天量子計(jì)算機(jī)被普及(計(jì)算速度極快),那么1024位已經(jīng)不足以讓RSA安全。
此文轉(zhuǎn)載于簡(jiǎn)書(shū)
作者:一縷清風(fēng)揚(yáng)萬(wàn)里
其實(shí)呢作為一個(gè)開(kāi)發(fā)者,有一個(gè)學(xué)習(xí)的氛圍跟一個(gè)交流圈子特別重要,這是我的微信 大家有興趣可以添加 邀請(qǐng)兄弟們進(jìn)入微信群里一起 交流