python實現(xiàn)AES和RSA加解密的方法
本文實例為大家分享了python實現(xiàn)AES和RSA加解密的具體代碼,供大家參考,具體內(nèi)容如下
AES
AES 是一種對稱加密算法,用key對一段text加密,則用同一個key對密文解密,
from Crypto import Random from Crypto.Hash import SHA from Crypto.Cipher import AES from Crypto.Cipher import PKCS1_v1_5 as Cipher_pkcs1_v1_5 from Crypto.Signature import PKCS1_v1_5 as Signature_pkcs1_v1_5 from Crypto.PublicKey import RSA import base64 # 秘鑰 key = 'chenqichenqi1234' # 明文 raw = 'sina company11111111111111111111' # 加密 iv = Random.new().read(AES.block_size) cipher = AES.new(key, AES.MODE_CFB, iv) data = iv + cipher.encrypt(raw) # 解密 iv = data[:16] cipher = AES.new(key, AES.MODE_CFB, iv) print cipher.decrypt(data[16:])
RSA
RSA是一種公鑰密碼算法,RSA的密文是對代碼明文的數(shù)字的 E 次方求mod N 的結(jié)果。也就是將明文和自己做E次乘法,然后再將其結(jié)果除以 N 求余數(shù),余數(shù)就是密文。RSA是一個簡潔的加密算法。E 和 N 的組合就是公鑰(public key)。
對于RSA的解密,即密文的數(shù)字的 D 次方求mod N 即可,即密文和自己做 D 次乘法,再對結(jié)果除以 N 求余數(shù)即可得到明文。D 和 N 的組合就是私鑰(private key)。
# 偽隨機數(shù)生成器 random_generator = Random.new().read # rsa算法生成實例 rsa = RSA.generate(1024, random_generator) # 秘鑰對的生成 private_pem = rsa.exportKey() public_pem = rsa.publickey().exportKey() message = "chenqi" # 公鑰加密 rsakey = RSA.importKey(public_pem) cipher = Cipher_pkcs1_v1_5.new(rsakey) cipher_text = base64.b64encode(cipher.encrypt(message)) print cipher_text # 私鑰解密 rsakey = RSA.importKey(private_pem) cipher = Cipher_pkcs1_v1_5.new(rsakey) text = cipher.decrypt(base64.b64decode(cipher_text), random_generator) print text
如上,RSA算法可以實現(xiàn)公鑰加密、私鑰解密。
在C/S架構(gòu)的通信中,如果Client要向Server發(fā)送一段消息:
0、Server事先生成秘鑰對;
1、Client請求Server的公鑰;
2、Client用公鑰加密mesage,并將密文發(fā)給Server;
3、Server用私鑰解密,獲取明文;
如果Server要向Client發(fā)送消息,流程也是類似的。
這個例子還有個問題,Server的公鑰是公開的,任何人都可以得到。Server只能保證只有自己的私鑰可以解密消息,但不能識別消息的來源是不是可靠,因為任何人都可能用公鑰加密一段文本發(fā)給Server,這里就涉及到數(shù)字簽名。
Clinet也可以生成自己的秘鑰對,請求Server時把自己的公鑰帶過去
0、Server事先生成秘鑰對、Client也事先生成秘鑰對;
1、Client請求Server的公鑰;
2、Client用Server的公鑰加密mesage,并將密文發(fā)給Server,隨請求一起發(fā)送一個簽名(Clinet用私鑰加密一個簽名,并同時附帶上自己的公鑰);
3、Server用Clinet的公鑰解密出簽名,并核對;
4、Server用私鑰解密,獲取明文;
小結(jié)
加密主要用對方的公鑰,解密用自己的私鑰。簽名用自己的私鑰,驗簽用對方的公鑰。
加密解密:公鑰加密,私鑰解密
簽名驗簽:私鑰簽名,公鑰驗簽
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實現(xiàn)批量將word轉(zhuǎn)html并將html內(nèi)容發(fā)布至網(wǎng)站的方法
這篇文章主要介紹了Python實現(xiàn)批量將word轉(zhuǎn)html并將html內(nèi)容發(fā)布至網(wǎng)站的方法,涉及Python調(diào)用第三方接口進(jìn)行文件轉(zhuǎn)換及操作數(shù)據(jù)庫等相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-07-07python開發(fā)實例之python使用Websocket庫開發(fā)簡單聊天工具實例詳解(python+Websocket+J
這篇文章主要介紹了python開發(fā)實例之python使用Websocket庫開發(fā)簡單聊天工具實例詳解(python+Websocket+JS),需要的朋友可以參考下2020-03-03安裝python依賴包psycopg2來調(diào)用postgresql的操作
這篇文章主要介紹了安裝python依賴包psycopg2來調(diào)用postgresql的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01django 通過url實現(xiàn)簡單的權(quán)限控制的例子
今天小編就為大家分享一篇django 通過url實現(xiàn)簡單的權(quán)限控制的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-08-08python中numpy數(shù)組的csv文件寫入與讀取
本文主要介紹了python中numpy數(shù)組的csv文件寫入與讀取,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫詳解
這篇文章主要介紹了Python使用cx_Oracle模塊操作Oracle數(shù)據(jù)庫,結(jié)合實例形式較為詳細(xì)的分析了cx_Oracle模塊的下載、安裝及針對Oracle數(shù)據(jù)庫的連接、執(zhí)行SQL語句、存儲過程等相關(guān)操作技巧,需要的朋友可以參考下2018-05-05