Python實現(xiàn)RSA加密解密
前言
- 加密技術(shù)在數(shù)據(jù)安全存儲,數(shù)據(jù)傳輸中發(fā)揮著重要作用,能夠保護用戶隱私數(shù)據(jù)安全,防止信息竊取。RSA是一種非對稱加密技術(shù),在軟件、網(wǎng)頁中已得到廣泛應用。本文將介紹RSA加密解密在python中的實現(xiàn)。
- 原則:公鑰加密,私鑰解密
- 解釋:具體過程的解釋請見代碼前的注釋
如果本文對您有幫助,不妨點贊、收藏、關(guān)注喲!您的支持和關(guān)注是博主創(chuàng)作的動力!
一、安裝模塊
pip install pycryptodome
二、生成密鑰對
- 密鑰對文件生成和讀取
- 代碼:
from Crypto.PublicKey import RSA def create_rsa_pair(is_save=False): ''' 創(chuàng)建rsa公鑰私鑰對 :param is_save: default:False :return: public_key, private_key ''' f = RSA.generate(2048) private_key = f.exportKey("PEM") # 生成私鑰 public_key = f.publickey().exportKey() # 生成公鑰 if is_save: with open("crypto_private_key.pem", "wb") as f: f.write(private_key) with open("crypto_public_key.pem", "wb") as f: f.write(public_key) return public_key, private_key def read_public_key(file_path="crypto_public_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b def read_private_key(file_path="crypto_private_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b
三、加密
- 流程:輸入文本(str)→字符串編碼(默認utf-8)(bytes)→rsa加密(bytes)→base64編碼(bytes)→解碼為字符串(str)
代碼:
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto.PublicKey import RSA def encryption(text: str, public_key: bytes): # 字符串指定編碼(轉(zhuǎn)為bytes) text = text.encode('utf-8') # 構(gòu)建公鑰對象 cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key)) # 加密(bytes) text_encrypted = cipher_public.encrypt(text) # base64編碼,并轉(zhuǎn)為字符串 text_encrypted_base64 = base64.b64encode(text_encrypted ).decode() return text_encrypted_base64 if __name__ == '__main__': public_key = read_public_key() text = '123456' text_encrypted_base64 = encryption(text, public_key) print('密文:',text_encrypted_base64)
四、解密
- 說明:解密流程與加密流程相反(按照加密流程逆序解密)
- 流程:輸入文本(str)→字符串編碼(默認utf-8)(bytes)→base64解碼(bytes)→rsa解密(bytes)→解碼為字符串(str)
- 代碼:
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random from Crypto.PublicKey import RSA def decryption(text_encrypted_base64: str, private_key: bytes): # 字符串指定編碼(轉(zhuǎn)為bytes) text_encrypted_base64 = text_encrypted_base64.encode('utf-8') # base64解碼 text_encrypted = base64.b64decode(text_encrypted_base64 ) # 構(gòu)建私鑰對象 cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key)) # 解密(bytes) text_decrypted = cipher_private.decrypt(text_encrypted , Random.new().read) # 解碼為字符串 text_decrypted = text_decrypted.decode() return text_decrypted if __name__ == '__main__': # 生成密文 public_key = read_public_key() text = '123456' text_encrypted_base64 = encryption(text, public_key) print('密文:',text_encrypted_base64) # 解密 private_key = read_private_key() text_decrypted = decryption(text_encrypted_base64, private_key) print('明文:',text_decrypted)
五、完整代碼
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random from Crypto.PublicKey import RSA # ------------------------生成密鑰對------------------------ def create_rsa_pair(is_save=False): ''' 創(chuàng)建rsa公鑰私鑰對 :param is_save: default:False :return: public_key, private_key ''' f = RSA.generate(2048) private_key = f.exportKey("PEM") # 生成私鑰 public_key = f.publickey().exportKey() # 生成公鑰 if is_save: with open("crypto_private_key.pem", "wb") as f: f.write(private_key) with open("crypto_public_key.pem", "wb") as f: f.write(public_key) return public_key, private_key def read_public_key(file_path="crypto_public_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b def read_private_key(file_path="crypto_private_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b # ------------------------加密------------------------ def encryption(text: str, public_key: bytes): # 字符串指定編碼(轉(zhuǎn)為bytes) text = text.encode('utf-8') # 構(gòu)建公鑰對象 cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key)) # 加密(bytes) text_encrypted = cipher_public.encrypt(text) # base64編碼,并轉(zhuǎn)為字符串 text_encrypted_base64 = base64.b64encode(text_encrypted).decode() return text_encrypted_base64 # ------------------------解密------------------------ def decryption(text_encrypted_base64: str, private_key: bytes): # 字符串指定編碼(轉(zhuǎn)為bytes) text_encrypted_base64 = text_encrypted_base64.encode('utf-8') # base64解碼 text_encrypted = base64.b64decode(text_encrypted_base64) # 構(gòu)建私鑰對象 cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key)) # 解密(bytes) text_decrypted = cipher_private.decrypt(text_encrypted, Random.new().read) # 解碼為字符串 text_decrypted = text_decrypted.decode() return text_decrypted if __name__ == '__main__': # 生成密鑰對 # create_rsa_pair(is_save=True) # public_key = read_public_key() # private_key = read_private_key() public_key, private_key = create_rsa_pair(is_save=False) # 加密 text = '123456' text_encrypted_base64 = encryption(text, public_key) print('密文:', text_encrypted_base64) # 解密 text_decrypted = decryption(text_encrypted_base64, private_key) print('明文:', text_decrypted)
運行:
到此這篇關(guān)于Python實現(xiàn)RSA加密解密的文章就介紹到這了,更多相關(guān)Python RSA加解密內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas數(shù)據(jù)類型之Series的具體使用
本文主要介紹了pandas數(shù)據(jù)類型之Series的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-08-08Python實現(xiàn)的FTP通信客戶端與服務器端功能示例
這篇文章主要介紹了Python實現(xiàn)的FTP通信客戶端與服務器端功能,涉及Python基于socket的端口監(jiān)聽、文件傳輸?shù)认嚓P(guān)操作技巧,需要的朋友可以參考下2018-03-03梅爾頻率倒譜系數(shù)(mfcc)及Python實現(xiàn)
這篇文章主要為大家詳細介紹了語音識別之梅爾頻率倒譜系數(shù)及Python實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06Python抓取移動App數(shù)據(jù)使用mitmweb監(jiān)聽請求與響應
這篇文章主要介紹了Python抓取移動App數(shù)據(jù)使用mitmweb監(jiān)聽請求與響應,mitmproxy控制臺方式、mitmdump與Python對接的方式、mitmweb可視化方式,需要的朋友可以參考一下2022-01-01python安裝mysql-python簡明筆記(ubuntu環(huán)境)
這篇文章主要介紹了python安裝mysql-python的方法,測試環(huán)境為ubuntu,較為詳細的記錄了安裝mysql-python過程中遇到的問題與解決方法,具有一定參考借鑒價值,需要的朋友可以參考下2016-06-06