本次來(lái)聊一聊如何用 Python 實(shí)現(xiàn) RSA,我們知道 RSA 是一種非對(duì)稱加密算法,并且應(yīng)用非常廣泛,比如 HTTPS。
所以在介紹 RSA 之前,需要先解釋一下什么是對(duì)稱加密和非對(duì)稱加密。
在重要信息的傳遞過(guò)程中,人們總是希望信息不會(huì)被偷看、不會(huì)被篡改,偽造等。為了達(dá)到這個(gè)要求人們一直在不斷努力著。
電報(bào)加密所使用的密碼本,就是初代網(wǎng)絡(luò)安全所使用的加密方式,用法為:發(fā)信時(shí)將內(nèi)容翻譯為密文發(fā)出,收到電報(bào)的一方,使用相同的密碼本才能解密出正確的信息,否則看到的就是一堆亂碼。
這種傳統(tǒng)的加密方式叫做對(duì)稱加密,而對(duì)稱加密所使用的算法包括:DES、3DES、AES、DESX、Blowfish、RC4、RC5、RC6,這些算法就可以看成密鑰、或者理解為上面的密碼本。這些算法也被稱為: "對(duì)稱加密算法"或者"傳統(tǒng)加密算法",一方使用算法進(jìn)行加密,然后另一方使用相同的算法進(jìn)行解密。
我們以《福爾摩斯探案集之跳舞的小人》一案中出現(xiàn)的小人為例。
圖片
每一個(gè)小人都代表一個(gè)英文字符,至于小人手中的旗子則是用來(lái)分隔單詞的、也就是表示一個(gè)單詞的邊界。傳遞信息的時(shí)候,將信息用小人來(lái)代替,然后另一方看到小人的時(shí)候,再將出現(xiàn)的小人解析成信息。順便一提,劇中的女主是黑幫首領(lǐng)的女兒,犯人就是使用這些小人來(lái)向女主傳遞信息,威脅她回去。
這些小人和英文字符之間的對(duì)應(yīng)關(guān)系就相當(dāng)于密鑰,此時(shí)就屬于對(duì)稱加密。因?yàn)闊o(wú)論是發(fā)信人還是收信人,使用的是相同的密鑰,即:小人代表的含義都是一樣的。
因此不難看出,對(duì)稱加密的安全性非常依賴于密鑰,泄漏密鑰就意味著任何人都可以對(duì)發(fā)送或接收的消息進(jìn)行解密,所以密鑰的保密性對(duì)通信安全來(lái)說(shuō)至關(guān)重要。福爾摩斯在解析出這些小人代表的含義之后,用這些小人發(fā)送信息將犯人引誘了出來(lái)。因此對(duì)于這種對(duì)稱加密來(lái)說(shuō),密鑰的安全是極其重要的。
那么對(duì)稱加密有哪些優(yōu)缺點(diǎn)呢?
在對(duì)稱加密中,密鑰(也就是使用的加密算法,如發(fā)電報(bào)時(shí)的密碼本、小人和英文字符的對(duì)應(yīng)關(guān)系)的保密性至關(guān)重要。戰(zhàn)爭(zhēng)時(shí)期,電報(bào)密碼本需要通過(guò)人工渠道傳遞,這樣發(fā)報(bào)雙方才能放心地使用。
但在如今的網(wǎng)絡(luò)通信中,顯然不可能再使用人工渠道的方式來(lái)傳遞密鑰,只有通過(guò)網(wǎng)絡(luò)來(lái)傳遞才高效快捷。這樣就有了一個(gè)矛盾:密鑰是用來(lái)保證網(wǎng)絡(luò)傳輸安全的,這個(gè)對(duì)于網(wǎng)絡(luò)安全至關(guān)重要的密鑰又需要網(wǎng)絡(luò)來(lái)傳遞給對(duì)方。
保存密鑰最安全的方式就是不告訴任何人,不進(jìn)行傳遞,但對(duì)稱加密中,解密方必須要得到對(duì)應(yīng)的密鑰,這就又要求密鑰必須進(jìn)行傳遞,可一旦傳遞密鑰就有丟失的風(fēng)險(xiǎn)。這個(gè)"雞生蛋、蛋生雞"的問(wèn)題一直困擾著人們,直到出現(xiàn)了一種算法,這套算法生成的密鑰分為兩個(gè)部分:公鑰和私鑰。
這個(gè)一分為二的密鑰對(duì)有如下特點(diǎn):
圖片
常見(jiàn)的非對(duì)稱加密算法有:RSA、DSA、ECC、Diffie-Hellman、El Gamal 等。
對(duì)稱加密的模式很好理解,但非對(duì)稱加密算法的上述特點(diǎn)卻讓我們感覺(jué)很神奇,下面就來(lái)簡(jiǎn)單看看,上述這些特點(diǎn)在數(shù)學(xué)上是怎樣實(shí)現(xiàn)的吧。在非對(duì)稱加密算法中 RSA 是使用最廣泛的一種,我們就以 RSA 為例,一會(huì)兒再介紹怎么用 Python 實(shí)現(xiàn)它。
RSA 算法是 1977 年由共同在麻省理工學(xué)院工作的羅納德·李維斯特(Ron Rivest)、阿迪·薩莫爾(Adi Shamir)和倫納德·阿德曼(Leonard Adleman)一起提出的。RSA 就是他們?nèi)诵帐祥_(kāi)頭字母拼在一起組成的。
RSA 加密利用了"單向函數(shù)"正向求解很簡(jiǎn)單,反向求解很復(fù)雜的特性。思想如下:
這個(gè)應(yīng)該很好理解,然后是 RSA 的工作原理,以下是 ChatGPT 告訴我的,我們不懂也沒(méi)關(guān)系。
然后便可得到公鑰 (e, n) 和私鑰 (d, n),而它們滿足如下關(guān)系。
圖片
其中 M 是明文,C 是密文,明文 M 用公鑰加密得到密文 C,密文 C 用私鑰解密得到明文 M。當(dāng)然這個(gè)過(guò)程反過(guò)來(lái)也是一樣,也可以用私鑰進(jìn)行加密,公鑰進(jìn)行解密,這個(gè)過(guò)程一般用作簽名。
RSA 算法的安全性基于 RSA 問(wèn)題的困難性,也就是基于大整數(shù)因子分解的困難性上。這種算法非常可靠,密鑰越長(zhǎng),它就越難破解。根據(jù)已經(jīng)披露的文獻(xiàn),目前被破解的最長(zhǎng) RSA 密鑰是 768 個(gè)二進(jìn)制位。
也就是說(shuō),長(zhǎng)度超過(guò) 768 位的密鑰,還無(wú)法破解(至少?zèng)]人公開(kāi)宣布)。因此可以認(rèn)為,1024 位的 RSA 密鑰基本安全,2048 位的密鑰極其安全。
非對(duì)稱加密的算法比對(duì)稱加密要復(fù)雜且耗時(shí),位數(shù)越多越耗時(shí)。因此在實(shí)際使用中,一般是先用非對(duì)稱加密過(guò)程傳遞對(duì)稱加密的密鑰,之后再使用對(duì)稱加密來(lái)保證后續(xù)的通信,這樣安全性與速度就可以達(dá)到一個(gè)平衡,HTTPS 所使用的就是這種方式。
首先需要安裝一個(gè)庫(kù):pycryptodome,直接 pip 安裝即可,這個(gè)庫(kù)里面包含了大量實(shí)現(xiàn)好的加密算法。
from Crypto.PublicKey import RSAfrom Crypto.Cipher import PKCS1_OAEPimport binasciidef generate_keys(): # 生成長(zhǎng)度為 2048 的秘鑰 key = RSA.generate(2048) # 生成公鑰 private_key = key.export_key() # 生成私鑰 public_key = key.publickey().export_key() return private_key, public_keydef encrypt_message(public_key, message): cipher = PKCS1_OAEP.new(RSA.import_key(public_key)) # 使用公鑰加密,得到密文(bytes 對(duì)象) encrypted_message = cipher.encrypt(message.encode()) # 一般會(huì)轉(zhuǎn)成十六進(jìn)制進(jìn)行傳輸 return binascii.hexlify(encrypted_message).decode()def decrypt_message(private_key, encrypted_message): cipher = PKCS1_OAEP.new(RSA.import_key(private_key)) # 解密 decrypted_message = cipher.decrypt( binascii.unhexlify(encrypted_message) ) return decrypted_message.decode()# 生成密鑰private_key, public_key = generate_keys()message = "高老師總能分享出好東西"# 使用公鑰加密encrypted = encrypt_message(public_key, message)print(encrypted)"""41bc8709cb82e1f9a13d18f101538c536f760210c11···"""print(len(encrypted))"""512"""# 使用私鑰解密decrypted = decrypt_message(private_key, encrypted)print(decrypted)"""高老師總能分享出好東西"""
以上就是使用 Python 實(shí)現(xiàn) RSA 算法。
本文鏈接:http://www.www897cc.com/showinfo-26-83621-0.html聊聊如何使用 Python 實(shí)現(xiàn) RSA 加密
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com