文章僅供課後複習總結,感謝hank老師。
密碼學
密碼學是指研究資訊加密,破解密碼的技術科學。 密碼學的起源可追溯到2000年前。而當今的密碼學 是以數學為基礎的。
密碼學的歷史大致可以追溯到兩千年前,相傳古羅馬名將凱撒大帝為了防止敵方截獲情報,用密碼傳送情報。凱撒 的做法很簡單,就是對二十幾個羅馬字母建立一張對應表。這樣,如果不知道密碼本,即使截獲一段資訊也看不懂。
從凱撒大帝時代到上世紀70年代這段很長的時間裡,密碼學的發展非常的緩慢,因為設計者基本上靠經驗。沒有運
用數學原理。
發展歷史
• 在1976年以前,所有的加密方法都是同一種模式:加密、解密使用同一種演算法。在互動資料的時候,彼此通訊的 雙方就必須將規則告訴對方,否則沒法解密。那麼加密和解密的規則(簡稱金鑰),它保護就顯得尤其重要。傳遞 金鑰就成為了最大的隱患。這種加密方式被成為對稱加密演算法(symmetric encryption algorithm)
• 1976年,兩位美國計算機學家 迪菲(W.Diffie)、赫爾曼( M.Hellman ) 提出了一種嶄新構思,可以在不直接傳遞
金鑰的情況下,完成金鑰交換。這被稱為“迪菲赫爾曼金鑰交換”演算法。開創了密碼學研究的新方向
• 1977年三位麻省理工學院的數學家 羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德
曼(Leonard Adleman)一起設計了一種演算法,可以實現非對稱加密。這個演算法用他們三個人的名字命名,叫做
RSA演算法。
RSA數學原理
上世紀70年代產生的一種加密演算法。其加密方式
比較特殊,需要兩個金鑰:公開金鑰簡稱公鑰
(publickey)和私有金鑰簡稱私鑰(privatekey)。
公鑰加密,私鑰解密;私鑰加密,公鑰解密。這個加密演算法就是偉大的RSA
那麼我們來思考一下,加密容易破解很難的運算?
方案:
3^? % 17 =12
尤拉函式
任意給定正整數n,請問
在小於等於n的正整數之
中,有多少個與n構成互
質關係?
計算這個值的方式叫做尤拉函式,使用:Φ(n)表示
如:
計算8的尤拉函式,和8互質的 1、2、3、4、5、6、7、8
φ(8) = 4
計算7的尤拉函式,和7互質的 1、2、3、4、5、6、7
φ(7) = 6
計算56的尤拉函式
φ(56) = φ(8) * φ(7) = 4 * 6 = 24
PS:如果兩個正整數,除了1以外,沒有其他公因數, 我們就稱這兩個數是互質關係(coprime)。
尤拉函式特點:
一、當n是質數的時候,φ(n)=n-1。
二、如果n可以分解成兩個互質的整數之積,如
n=A*B則:
φ(A*B)=φ(A)* φ(B)
根據以上兩點得到:
如果N是兩個質數P1 和 P2的乘積則
φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)
尤拉定理:
如果兩個正整數m和n互質,那麼m的φ(n)次方減
去1,可以被n整除。
費馬小定理:
尤拉定理的特殊情況:如果兩個正整數m和n互質,而
且n為質數!那麼φ(n)結果就是n-1。
公式轉換
迪菲赫爾曼交換:
原理:
RSA的誕生:
所以m^e mod n = c 加密
c^d mod n = m 解密
公鑰:n和e
私鑰:n和d
明文:m
密文:c
說明:
- n會非常大,長度一般為1024個二進位制位。(目前人類已經分解的最大整數,232個十進位制位,768個二進位制位)
- 由於需要求出φ(n),所以根據歐函式特點,最簡單的方式n 由 兩個質數相乘得到: 質數:p1、p2 Φ(n) = (p1 -1) * (p2 - 1) 3、最終由φ(n)得到e 和 d 。 總共生成6個數字:p1、p2、n、φ(n)、e、d
OpenSSL使用RSA
- 生成RSA私鑰,金鑰長度為1024bit
$ openssl genrsa -out private.pem 1024複製程式碼
- 從私鑰中提取公鑰
$ openssl rsa -in private.pem -pubout -out public.pem複製程式碼
- 生成如下檔案
- 將私鑰轉換成明文
$ openssl rsa -in private.pem -text -out private.txt複製程式碼
- 檢視文字資訊
$ cat private.txt複製程式碼
- 通過公鑰加密資料,私鑰解密資料
$ vi message.txt //生成明文檔案
$ cat message.txt //檢視檔案內容
密碼:12345
$ openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt //通過公鑰進行加密
$ openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt //通過私鑰進行解密複製程式碼
如下檔案:
- 通過私鑰加密資料,公鑰解密資料
//通過私鑰加密
$ openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
//通過公鑰解密
$ openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt複製程式碼