前面文章學習過 對稱加密的原理,在通信雙方發送完加密的密文之後,需要發送密鑰給對方才能解密,這就要求發送密鑰的信息通道安全可靠,才能保證數據的安全性,而非對稱加密算法 是一種密鑰的保密方法,需要有公鑰(公開密鑰)和私鑰(私有密鑰),這篇文章主要介紹公鑰和私鑰生成原理,然後圍繞公鑰和私鑰研究和分析一下加密是如何起到密鑰保密作用的。
(1)Bob要向Alice發送信息,Alice需要先要產生一對用於加密和解密的公鑰和私鑰。
(2)Alice的私鑰保密,Alice的公鑰告訴Bob。
(3)Bob把要發送的信息用Alice的公鑰加密生成密文發送給Alice。
(4)Alice收到這個消息後,用自己的私鑰解密Bob的消息。其他所有收到這個報文的人都無法解密,只有Alice私鑰才能解密此信息。
Tips:Alice 向 Bob 發送信息時也是同理,Bob 也需要生成一對公鑰和私鑰。
1977 年由羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)、倫納德·阿德曼(Leonard Adleman)一起提出,因此命名為 RSA 算法:
Tips:如果兩個正整數 a 和 n 互質,那麼一定可以找到整數 b,使得 ab-1 被 n 整除,或者說 ab 被 n 除的餘數是 1,此時,b 就叫做 a 的模反元素。
下面以加解密一個數字 123 為例,公鑰是 (3,319),密鑰是 (187,319):
openssl rsa -in private.pem -pubout -out public.pemTips:openssl rsa -in private.pem -pubout -out public.pem 命令中的 -in 表示輸入 priviate.pem 文件內容,-out public.pem 表示將公鑰輸出到 public.pem 文件中。
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 }Tips:RFC3347 地址:https://www.rfc-editor.org/rfc/rfc3447.txt。
RSAPublicKey ::= SEQUENCE { modulus INTEGER, -- n publicExponent INTEGER -- k}Tips:RFC3347 地址:https://www.rfc-editor.org/rfc/rfc3447.txt。
私鑰是基於 ASN.1 格式進行編碼的,可以使用 openssl asn1parse -i -in private.pem 命令查看 ASN.1 格式的私鑰信息,如下圖所示:
Tips:--n 和 --k 對應著前面加密流程中的 n 和 k,圖中 n 的值是 AC06...6703,k 的值是 010001。
使用 openssl asn1parse -i -in public.pem 可以查看到如下信息:
然後使用 openssl asn1parse -i -in public.pem -strparse 19 命令可以查看到公鑰的內容如下:
Tips:可以對比一下私鑰格式化內容和公鑰格式化內容,兩者是一致的,由此可見,公鑰可以由私鑰推到出來,反過來則比較困難。
使用 openssl rsautl -encrypt -in test.txt -inkey public.pem -pubin -put test.en 可以將前面創建的 test.txt 文件生成密文 test.en 如下圖所示:
使用 openssl rsautl -decrypt -in test.en -inkey private.pem -out new.txt 可以將密文 test.en 解密出來如下圖所示: