對稱加密的加密和解密過程使用同乙個金鑰,在訊息傳遞中,金鑰也會被傳來穿去,萬一金鑰被截獲,那就完蛋了。
非對稱加密過程中的金鑰被分為私鑰和公鑰:
主要有兩個應用場景:加密解密、簽名驗籤。典型的非對稱加密演算法有rsa。
假設b要和a秘密交流:
a根據rsa演算法生成了乙個私鑰、公鑰對。公鑰是公開的,任何人都可以知道,包括b;私鑰只有a知道。
b將自己想要對a說的明文使用a的公鑰通過rsa加密,生成密文,傳送出去。
a接收到來自b的密文,使用自己的私鑰通過rsa解密,生成明文。
此場景主要為了防止中間人截獲資訊,即使中間人截獲到密文,就算他知道a的公鑰,由於不知道a的私鑰,還是無法知道密文啥意思。
code example :
# -*- coding: utf-8 -*-
import base64
from crypto import random
from crypto.cipher import pkcs1_v1_5
from crypto.publickey import rsa
defgenerate_key_pair
():"""
生成私鑰公鑰
:return:
"""rsa = rsa.generate(bits=1024, randfunc=random.new().read)
private_key = rsa.exportkey()
public_key = rsa.publickey().exportkey()
return private_key, public_key
defencrypt
(plain_text, public_key):
""" 根據公鑰對原文加密
:param plain_text:
:type plain_text: str
:param public_key:
:return:
"""pk = rsa.importkey(public_key)
cipher = pkcs1_v1_5.new(pk)
cipher_text = base64.b64encode(cipher.encrypt(plain_text.encode('utf-8')))
return cipher_text
defdecrypt
(cipher_text, private_key):
""" 根據私鑰對密文進行解密
:param cipher_text:
:type cipher_text: bytes
:param private_key:
:return:
"""pk = rsa.importkey(private_key)
cipher = pkcs1_v1_5.new(pk)
text = cipher.decrypt(base64.b64decode(cipher_text), random.new().read)
return text
if __name__ == '__main__':
text = '我是乙個好男人!'
prk, puk = generate_key_pair()
cipher_text = encrypt(text, puk)
plain_text = decrypt(cipher_text, prk).decode('utf-8')
print(plain_text)
output:
我是乙個好男人!
假設b要確定a是a,而不是中間者偽造的:
a根據rsa演算法生成了乙個私鑰、公鑰對。公鑰是公開的,任何人都可以知道,包括b;私鑰只有a知道。
a使用自己的私鑰對一段訊息進行簽名。
b使用a的公鑰對同一段訊息進行驗籤,成功則證明a是a。
簽名驗籤是為了解決中間人偽造a與b通訊的問題。
code example:
# -*- coding: utf-8 -*-
import base64
from crypto import random
from crypto.hash import sha
from crypto.publickey import rsa
from crypto.signature import pkcs1_v1_5
defgenerate_key_pair
():"""
生成私鑰公鑰
:return:
"""rsa = rsa.generate(bits=1024, randfunc=random.new().read)
private_key = rsa.exportkey()
public_key = rsa.publickey().exportkey()
return private_key, public_key
defsign
(message, private_key):
""" 根據私鑰加簽
:param message:
:type message: str
:param private_key:
:type private_key: bytes
:return:
"""pk = rsa.importkey(private_key)
signer = pkcs1_v1_5.new(pk)
digest = sha.new()
digest.update(message.encode('utf-8'))
sign = signer.sign(digest)
signature = base64.b64encode(sign)
return signature
defverify
(message, public_key, signature):
""" 根據公鑰驗籤
:param message:
:type message: str
:param public_key:
:type public_key: bytes
:param signature:
:type signature: bytes
:return:
"""pk = rsa.importkey(public_key)
verifier = pkcs1_v1_5.new(pk)
digest = sha.new()
digest.update(message.encode('utf-8'))
is_verified = verifier.verify(digest, base64.b64decode(signature))
return is_verified
if __name__ == '__main__':
message = "brown"
private_key, public_key = generate_key_pair()
signature = sign(message, private_key)
print(verify(message, public_key, signature))
output:
true
見維基百科
rsa加密演算法
ref
pycrypto與rsa密碼技術筆記
非對稱加密(1)非對稱加密原理
現在我們已經知道對稱加密的乙個最大的問題是如何安全地傳輸金鑰,並且在對稱加密的體系下找不到好的解決方案。1976 年,美國學者 dime 和henman 為解決資訊公開傳送和金鑰管理問題,提出一種新的金鑰交換協議,允許在不安全 上的通訊雙方交換資訊,安全地達成一致的金鑰,這就是 公開金鑰系統 相對於...
非對稱加密(1)非對稱加密原理
現在我們已經知道對稱加密的乙個最大的問題是如何安全地傳輸金鑰,並且在對稱加密的體系下找不到好的解決方案。1976年,美國學者dime和henman為解決資訊公開傳送和金鑰管理問題,提出一種新的金鑰交換協議,允許在不安全 上的通訊雙方交換資訊,安全地達成一致的金鑰,這就是 公開金鑰系統 相對於 對稱加...
非對稱加密原理
1.名詞解釋 key pair a 只能加密的key public key a,能加密也能解密的 private key a key pair b 只能加密的key public key b,能加密也能解密的 private key b 資料加密方法 data aeskey aes 加密的data ...