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的密文是對代碼明文的數字的 E 次方求mod N 的結果。也就是將明文和本身作E次乘法,而後再將其結果除以 N 求餘數,餘數就是密文。RSA是一個簡潔的加密算法。E 和 N 的組合就是公鑰(public key
)。架構
對於RSA的解密,即密文的數字的 D 次方求mod N 便可,即密文和本身作 D 次乘法,再對結果除以 N 求餘數便可獲得明文。D 和 N 的組合就是私鑰(private key
)。dom
# 僞隨機數生成器 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算法能夠實現公鑰加密、私鑰解密。加密
在C/S架構的通訊中,若是Client要向Server發送一段消息:spa
0、Server事先生成祕鑰對;code
一、Client請求Server的公鑰;blog
二、Client用公鑰加密mesage,並將密文發給Server;ip
三、Server用私鑰解密,獲取明文;ci
若是Server要向Client發送消息,流程也是相似的。generator
這個例子還有個問題,Server的公鑰是公開的,任何人均可以獲得。Server只能保證只有本身的私鑰能夠解密消息,但不能識別消息的來源是否是可靠,由於任何人均可能用公鑰加密一段文本發給Server,這裏就涉及到數字簽名。
Clinet也能夠生成本身的祕鑰對,請求Server時把本身的公鑰帶過去,
0、Server事先生成祕鑰對、Client也事先生成祕鑰對;
一、Client請求Server的公鑰;
二、Client用Server的公鑰加密mesage,並將密文發給Server,隨請求一塊兒發送一個簽名(Clinet用私鑰加密一個簽名,並同時附帶上本身的公鑰);
三、Server用Clinet的公鑰解密出簽名,並覈對;
四、Server用私鑰解密,獲取明文;
小結
加密主要用對方的公鑰,解密用本身的私鑰。簽名用本身的私鑰,驗籤用對方的公鑰。
加密解密:公鑰加密,私鑰解密
簽名驗籤:私鑰簽名,公鑰驗籤