RSA加密
這是一種非對稱加密算法感猛,密鑰分為公鑰和私鑰七扰。通常私鑰長度有512bit,1024bit唱遭,2048bit戳寸,4096bit,長度越長拷泽,越安全疫鹊,但是生成密鑰越慢袖瞻,加解密也越耗時。一般公鑰用來加密數(shù)據(jù)拆吆,私鑰用來解密數(shù)據(jù)聋迎,并且為防止有人冒充發(fā)送密文,私鑰又可以負責簽名枣耀,公鑰負責驗證霉晕。公鑰可以分發(fā)給其他系統(tǒng),但是私鑰一般保存在唯一的系統(tǒng)中捞奕。
AES加密
這是一種對稱加密算法牺堰,加密和解密公用同一密鑰。密鑰最長只有256個bit颅围,執(zhí)行速度快伟葫,易于硬件實現(xiàn)。通常發(fā)送方使用密鑰加密數(shù)據(jù)后會使用口令對密鑰進行加密院促,然后把密文和加密后的密鑰一同發(fā)送給接收方筏养,接收方接收到數(shù)據(jù)后首先使用口令對密鑰進行解密,在使用密鑰對密文進行解密常拓。
以上兩種加密方式都有各自的特點渐溶,在互聯(lián)網(wǎng)領(lǐng)域有著廣泛的應(yīng)用,我們需要根據(jù)不同的場景使用不同的加密解密方案弄抬。
一般需要加密傳輸?shù)臅r候存在以下兩種場景:
客戶端發(fā)送加密數(shù)據(jù)茎辐,服務(wù)端解密后返回明文:
例如用戶在客戶端提交個人信息時,客戶端把個人信息加密后發(fā)送給服務(wù)端眉睹,服務(wù)端再返回code或者提交成功的提示
客戶端發(fā)送加密數(shù)據(jù)荔茬,服務(wù)端解密后同樣返回密文
例如用戶登錄時,客戶端發(fā)送加密后的賬號密碼竹海,服務(wù)端解密后生成對應(yīng)的token慕蔚,并且對token進行加密,客戶端收到返回的token再對其進行解密
如何生成RSA公鑰和私鑰可以參考我的另一篇文章
RSA公鑰和私鑰的生成以及PKCS#1與PKCE#8格式的轉(zhuǎn)換
如何在python實現(xiàn)RSA斋配?
可以直接用python的rsa庫
import rsa
(pubkey, privkey) = rsa.newkeys(1024)
print('公鑰:\n%s' % pubkey)
print('私鑰:\n%s' % privkey)
message = 'hello'
encrypt_text = rsa.encrypt(message.encode(), pubkey)
print('加密后的密文:\n%s' % encrypt_text)
decrypt_text = rsa.decrypt(encrypt_text, privkey)
print('解密后的明文:\n%s' % decrypt_text)
但是這只是簡單的實現(xiàn)孔飒,中間省去了很多細節(jié),這就導(dǎo)致我們以后跨語言加密解密的時候可能會出問題艰争。比如java在實現(xiàn)RSA加密解密的時候有很多參數(shù)需要設(shè)置坏瞄,如果java和python之間的參數(shù)不能保持一致,則會導(dǎo)致用java加密的密文用python解密不了甩卓,或者用python加密的密文用java解密不了鸠匀。所以還是推薦使用可以設(shè)置更多參數(shù)的第三方RSA庫。python的第三方RSA庫有crypto逾柿、pycrypto和pycryptodome缀棍。crypto不推薦使用宅此,已經(jīng)停止維護了∨婪叮可以使用pycrypto父腕,不過我的電腦安裝pycrypto會報錯。
提示我安裝Microsoft Visual C++ 14.0青瀑,所以我直接用的pycryptodome璧亮,其實都差不多。
Config配置類
class Config:
PUBLIC_KEY = '''
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDv/LnAoDkyewwjwqwgi9VSg51F
+tUJ8cGwL6Rqdf5ZXrRCHI1KLjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFI
fmukUxN+EliKkg0TwswylVroLBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo
0D3FOsbNEj80opjmtQIDAQAB
'''
PRIVATE_KEY = '''
MIICXAIBAAKBgQDv/LnAoDkyewwjwqwgi9VSg51F+tUJ8cGwL6Rqdf5ZXrRCHI1K
LjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFIfmukUxN+EliKkg0TwswylVro
LBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo0D3FOsbNEj80opjmtQIDAQAB
AoGADuZtDgWkp3q2TT4X+8lSzFW5nQ+uzHhDI1JB7g43ZYsYvAYTy6hEs17ayyoP
2NCjOw9p1Yd7IEpXVqCIw1M6QsfGdshy1NStsGpDHQYBBd8XiT8cWUaT/nmq5dEs
i0wOITMZePLgI5/5pD4M6DIEJKskM+Rzlo47AiyRchL6pqECQQD+XAZNCl6R5wjI
DrqW4v6Vw8mhdaPnQhPexmhHa1f9D7sA32A2H2N8M3dUDOwuG+DJhPkjVaQtFvT8
mjDjSZTdAkEA8Yj4hncF/WnLTDSXmiWfpNwYwjfpjOj8e4/5rWHF1jWZMgl0l1AS
Otna2dIbXp64dqsInITJTIDSQpbxuhrvuQJBAN9Ee6toLLa5KzYf55zGR13Ca9wz
3NkDYVmsop/+E0/oXOdZK6SWTMcajeXTKgUXJ2r8M4vWgrOpcQXBeqQnVGkCQDYX
e7j5bOD80Wemm5EM/fy4wd61ENvazbiKXNske17msAFRtsewSfTeFzIS6Mg++Yax
9QLAhihY7T22ejo4kBkCQBdg2yKHQrmG+njGfLsdQG9MARFlnOfohoBFQTYdtrmf
5JRNfwtPiis2YaoM2gP7z2qaunYbibDV5SYmtdD8GK0=
'''
RSA工具類
import base64
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from app.config import Config
class RSACipher():
'''
RSA加密斥难、解密枝嘶、簽名、驗簽工具類
'''
def encrypt(self, key, text):
'''
加密方法
:param key: 公鑰
:param text: 需要加密的明文
:return: 加密后的密文
'''
public_key = RSA.importKey(base64.b64decode(key))
cipher = PKCS1_OAEP.new(public_key, hashAlgo=SHA256)
return base64.b64encode(cipher.encrypt(text.encode())).decode()
def decrypt(self, key, text):
'''
解密方法
:param key: 私鑰
:param text: 加密后的密文
:return: 解密后的明文
'''
private_key = RSA.importKey(base64.b64decode(key))
cipher = PKCS1_OAEP.new(private_key, hashAlgo=SHA256)
return cipher.decrypt(base64.b64decode(text)).decode()
def sign(self, key, text):
'''
簽名方法
:param key: 私鑰
:param text: 需要簽名的文本
:return: 簽名信息
'''
private_key = RSA.importKey(base64.b64decode(key))
hash_value = SHA256.new(bytes(text, encoding="utf-8"))
signer = PKCS1_v1_5.new(private_key)
signature = signer.sign(hash_value)
return base64.b64encode(signature).decode()
def verify(self, key, text, signature):
'''
驗簽方法
:param key: 公鑰
:param text: 需要驗簽的文本
:param signature: 簽名信息
:return: 驗簽結(jié)果
'''
public_key = RSA.importKey(base64.b64decode(key))
hash_value = SHA256.new(bytes(text, encoding="utf-8"))
verifier = PKCS1_v1_5.new(public_key)
return verifier.verify(hash_value, base64.b64decode(signature))
if __name__ == '__main__':
text = 'hello'
cipher = RSACipher()
# 加密
encrypt_text = cipher.encrypt(Config.PUBLIC_KEY, text)
print('加密后:\n%s' % encrypt_text)
# 簽名
signature = cipher.sign(Config.PRIVATE_KEY, text)
print('簽名:\n%s' % signature)
# 解密
decrypt_text = cipher.decrypt(Config.PRIVATE_KEY, encrypt_text)
print('解密后:\n%s' % decrypt_text)
# 驗簽
result = cipher.verify(Config.PUBLIC_KEY, decrypt_text, signature)
print('驗簽:\n%s' % result)
運行結(jié)果:
加密后:
f/Ju3QYLvlhGd+EKxlH/MZQX9g2XQ8nkTq5zWP7sCnoQUmPZPAb1H8//j+2B9Uz7HdiUtys2wtk1eWsD7/TSsWz5XDWA/LFXcN0r4AdJnaI1HvLZ8625Ahh3YYia8DmW7j7IvhNDJIES1otlPKgfRb7srDr+p7x/YzrZTFp66PM=
簽名:
N5CAgMhhNzTNeyjY8bCSxPOcrUL48ZIDz4LpJGuncAsDwn/sFYr2Tba57DZF2XoXXCLt+3A46Wk7O+758XmxIDmOlOzdIqBtq6X9Ya9W/1f8mR2igc1xTvfNGt5Eb5xLjmATEk6grFx0bzMd4SJg0p5ayEH4fyCrXMlCKarEsCs=
解密后:
hello
驗簽:
True
簽名有什么用哑诊?
下面我們模擬兩個場景
第一個場景:客戶端發(fā)送加密數(shù)據(jù)給服務(wù)端
- 客戶端使用公鑰對數(shù)據(jù)進行加密
- 客戶端發(fā)送密文給服務(wù)器端
- 服務(wù)端使用私鑰進行解密
第二個場景:服務(wù)端發(fā)送數(shù)據(jù)給客戶端
- 服務(wù)端使用私鑰對數(shù)據(jù)進行簽名
- 服務(wù)器端發(fā)送簽名和數(shù)據(jù)給客戶端
- 客戶端使用公鑰進行驗簽躬络,如果驗簽出來的內(nèi)容和數(shù)據(jù)一致,則證明消息是服務(wù)端回復(fù)的
在第一個場景中搭儒,即使客戶端發(fā)送的加密消息被截獲,也不會造成泄密提茁,因為只有服務(wù)端用私鑰才能解密淹禾,而第二個場景中即使簽名和數(shù)據(jù)都被截獲,也沒有危險性茴扁,因為只有服務(wù)端的私鑰才能進行簽名铃岔,所以即使知道消息內(nèi)容也無法偽造帶簽名的回復(fù)給客戶端,防止了消息的纂改峭火。
雖然上面的場景中防止了泄密和纂改的問題毁习,但是仍然存在安全隱患。在第一個場景中雖然解決了泄密的問題卖丸,但是可以通過公鑰加密假信息發(fā)送給服務(wù)端纺且。而第二個場景中,雖然解決了纂改的問題但是造成了數(shù)據(jù)的泄露稍浆。所以我們可以改進一下驗證的方式载碌,客戶端和服務(wù)端同時生成一套公鑰私鑰,并且把客戶端的公鑰和服務(wù)端的私鑰進行交換衅枫。
綜合上面兩個場景:客戶端發(fā)送加密數(shù)據(jù)給服務(wù)端
- 客戶端使用服務(wù)端公鑰進行加密嫁艇,并且使用客戶端私鑰進行簽名
- 客戶端發(fā)送密文和簽名給服務(wù)端
- 服務(wù)端使用服務(wù)端私鑰進行解密,并使用客戶端公鑰進行驗簽弦撩,證明消息來自客戶端
服務(wù)端返回數(shù)據(jù)同理
下面貼上改進后的代碼:
Config配置類
class Config:
CLIENT_PUBLIC_KEY = '''
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDv/LnAoDkyewwjwqwgi9VSg51F
+tUJ8cGwL6Rqdf5ZXrRCHI1KLjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFI
fmukUxN+EliKkg0TwswylVroLBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo
0D3FOsbNEj80opjmtQIDAQAB
'''
CLIENT_PRIVATE_KEY = '''
MIICXAIBAAKBgQDv/LnAoDkyewwjwqwgi9VSg51F+tUJ8cGwL6Rqdf5ZXrRCHI1K
LjOxdFbzB81YjS76cOzezQRz2vuYDo7OvLfYSjFIfmukUxN+EliKkg0TwswylVro
LBW9OKN70Zd62dc+gfkA3Vu8cDoRKzz6BKpo4yDo0D3FOsbNEj80opjmtQIDAQAB
AoGADuZtDgWkp3q2TT4X+8lSzFW5nQ+uzHhDI1JB7g43ZYsYvAYTy6hEs17ayyoP
2NCjOw9p1Yd7IEpXVqCIw1M6QsfGdshy1NStsGpDHQYBBd8XiT8cWUaT/nmq5dEs
i0wOITMZePLgI5/5pD4M6DIEJKskM+Rzlo47AiyRchL6pqECQQD+XAZNCl6R5wjI
DrqW4v6Vw8mhdaPnQhPexmhHa1f9D7sA32A2H2N8M3dUDOwuG+DJhPkjVaQtFvT8
mjDjSZTdAkEA8Yj4hncF/WnLTDSXmiWfpNwYwjfpjOj8e4/5rWHF1jWZMgl0l1AS
Otna2dIbXp64dqsInITJTIDSQpbxuhrvuQJBAN9Ee6toLLa5KzYf55zGR13Ca9wz
3NkDYVmsop/+E0/oXOdZK6SWTMcajeXTKgUXJ2r8M4vWgrOpcQXBeqQnVGkCQDYX
e7j5bOD80Wemm5EM/fy4wd61ENvazbiKXNske17msAFRtsewSfTeFzIS6Mg++Yax
9QLAhihY7T22ejo4kBkCQBdg2yKHQrmG+njGfLsdQG9MARFlnOfohoBFQTYdtrmf
5JRNfwtPiis2YaoM2gP7z2qaunYbibDV5SYmtdD8GK0=
'''
SERVER_PUBLIC_KEY = '''
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDxpMZQCTykdwUcUzyHgd6Q79de
4/F26bhIpOVCDpWNxlLQFdbGneTTQ1AJz/wwfNMgEPMnJvV3ZLrbqH9uV5W+8NG0
UDaXyZYo8fXhfD7Aeret6/CgH1iZamzR4DfADCvT+V81cjeGIhJ1JSYfxGIsC4mM
35TZ5p530ayOJ1KPHwIDAQAB
'''
SERVER_PRIVATE_KEY = '''
MIICXQIBAAKBgQDxpMZQCTykdwUcUzyHgd6Q79de4/F26bhIpOVCDpWNxlLQFdbG
neTTQ1AJz/wwfNMgEPMnJvV3ZLrbqH9uV5W+8NG0UDaXyZYo8fXhfD7Aeret6/Cg
H1iZamzR4DfADCvT+V81cjeGIhJ1JSYfxGIsC4mM35TZ5p530ayOJ1KPHwIDAQAB
AoGBAL8E8ZvNYXnleE3G4t9/41ARuOATMws8gOg0KeMJImI7t7U0vl6t7HixCnFn
T8WIt2Du5Tg7DOo/35LK5Ul1xTHtYmQBdxTbg1WT89s3RWEvL4epHZQxzCQFJ1Pz
zjDFifPNDEA7ZME7sx/E2qPDinAD+JHNELhtNMDq5rhPuYGRAkEA/W6mZCbDfrY9
/qcbOe2s8ugeoDqoJueP7owfrut11KzvUn+e2rIBeDn1BZbWlYY5VDEq1nIKen+B
0su4QUiiaQJBAPQXjC+YgyBzoEyMLPiA+eRC28zuwP2LXGJ1FNPZpCgnaJzF215H
vhISwKX+b1/WZq3qBHyQnbE5zBHEIn5I5EcCQQC6X9k15dv3H4bP84xuOX/q0xFS
vFBU7A5JW/sg5EAvO0502S21nxq9k8HBboA4ThFy/QWH1y4lkAelQfQq7oOhAkBh
Jk4hU249KEgQr2nmrk7HTuT0t8IQJ7tpZHgZqXHwmV7FpuocqCk6QER0zMO/PTI4
3f9TJKvescZK++lOoexZAkB0XNnpYA4fOMKhyKbcGvpqKLFb3e2ks5LbjgeAkETt
dKipEh1RbiPrJeOwOChsx/51/cnVJrabE50AJV8AXM3e
'''
RSA工具類
import base64
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Hash import SHA256
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from app.config import Config
class RSACipher():
"""
RSA加密步咪、解密、簽名益楼、驗簽工具類
"""
def encrypt(self, key, raw):
"""
加密方法
:param key: 公鑰
:param raw: 需要加密的明文 bytes
:return: base64編碼的密文 bytes
"""
public_key = RSA.importKey(base64.b64decode(key))
cipher = PKCS1_OAEP.new(public_key, hashAlgo=SHA256)
return base64.b64encode(cipher.encrypt(raw))
def decrypt(self, key, enc):
"""
解密方法
:param key: 私鑰
:param enc: base64編碼的密文 bytes
:return: 解密后的明文 bytes
"""
private_key = RSA.importKey(base64.b64decode(key))
cipher = PKCS1_OAEP.new(private_key, hashAlgo=SHA256)
return cipher.decrypt(base64.b64decode(enc))
def sign(self, key, text):
"""
簽名方法
:param key: 私鑰
:param text: 需要簽名的文本 bytes
:return: base64編碼的簽名信息 bytes
"""
private_key = RSA.importKey(base64.b64decode(key))
hash_value = SHA256.new(text)
signer = PKCS1_v1_5.new(private_key)
signature = signer.sign(hash_value)
return base64.b64encode(signature)
def verify(self, key, text, signature):
"""
驗簽方法
:param key: 公鑰
:param text: 需要驗簽的文本 bytes
:param signature: base64編碼的簽名信息 bytes
:return: 驗簽結(jié)果 bool
"""
public_key = RSA.importKey(base64.b64decode(key))
hash_value = SHA256.new(text)
verifier = PKCS1_v1_5.new(public_key)
return verifier.verify(hash_value, base64.b64decode(signature))
if __name__ == '__main__':
# 客戶端代碼
text = b'hello server!'
cipher = RSACipher()
# 使用服務(wù)端公鑰加密
encrypt_text = cipher.encrypt(Config.SERVER_PUBLIC_KEY, text)
print('加密后:\n%s' % encrypt_text)
# 使用客戶端私鑰簽名
signature = cipher.sign(Config.CLIENT_PRIVATE_KEY, encrypt_text)
print('簽名:\n%s' % signature)
# 服務(wù)端代碼
# 使用客戶端公鑰驗簽
result = cipher.verify(Config.CLIENT_PUBLIC_KEY, encrypt_text, signature)
print('驗簽:\n%s' % result)
# 使用服務(wù)端私鑰解密
decrypt_text = cipher.decrypt(Config.SERVER_PRIVATE_KEY, encrypt_text)
print('解密后:\n%s' % decrypt_text)
運行結(jié)果:
加密后:
b'miG43R3Xz5hyUntwfvToY96rhqgvsXzZGW6+VErgTdgs2Ew/wDlBlhjgpJQt3b13Rnq0m3sMydw7jly7/yRGW/eWaeOhuJRUQ6y1pGbvt3jIgnJvsj3XwT+S1Zah5Po87c51rQ7UamVmUvh4qFCZLzYdgXGfLLeknOTzVd+WIJo='
簽名:
b'sG4qoMTccZOlrSzn6y16qGAVNtdBdnbduHPbNbEmCo+7Pe2AUg4VRK9VjG67Hqitwoa5AmHWe2M4DyolhEuuSYwrriYnSR2y6flBv0yb0G0CqJ4VODYVDlRrKTLLnTBnHoBeKNhqruir5JJ5cB9oE8XnE5rGI1yCPPhtBRjUXMM='
驗簽:
True
解密后:
b'hello server!'
如何在python中實現(xiàn)AES加密猾漫?
AES工具類
import base64
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes
class AESCipher:
"""
AES加密点晴、解密工具類
"""
def __init__(self, key):
self.key = key
# 這里直接用key充當iv
self.iv = key
def encrypt(self, raw):
"""
加密方法
:param raw: 需要加密的密文 str
:return: base64編碼的密文 str
"""
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
return base64.b64encode(cipher.encrypt(self.__pad(raw).encode())).decode()
def decrypt(self, enc):
"""
解密方法
:param enc: base64編碼的密文 str
:return: 解密后的明文 str
"""
cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
return self.__unpad(cipher.decrypt(base64.b64decode(enc)).decode())
def __pad(self, text):
# 填充方法,加密內(nèi)容必須為16字節(jié)的倍數(shù)
text_length = len(text)
amount_to_pad = AES.block_size - (text_length % AES.block_size)
if amount_to_pad == 0:
amount_to_pad = AES.block_size
pad = chr(amount_to_pad)
return text + pad * amount_to_pad
def __unpad(self, text):
# 截取填充的字符
pad = ord(text[-1])
return text[:-pad]
if __name__ == '__main__':
# 隨機生成16位aes密鑰
cipher = AESCipher(get_random_bytes(16))
text = "hello"
encrypt = cipher.encrypt(text)
print('加密后:\n%s' % encrypt)
decrypt = cipher.decrypt(encrypt)
print('解密后:\n%s' % decrypt)
運行結(jié)果:
加密后:
2IVIT2hWtZo1WQ2xMd0LUg==
解密后:
hello server!
RSA+AES混合使用
客戶端發(fā)送加密信息給服務(wù)端流程
- 客戶端使用服務(wù)端公鑰對數(shù)據(jù)進行加密
- 客戶端使用客戶端私鑰對密文進行簽名
- 客戶端發(fā)送密文和簽名給服務(wù)端
- 服務(wù)端使用客戶端公鑰對簽名進行驗簽
- 服務(wù)端使用服務(wù)端私鑰對密文進行解密
代碼模擬客戶端向服務(wù)端發(fā)送加密信息:
from Crypto.Random import get_random_bytes
from app.AESCipher import AESCipher
from app.RSACipher import RSACipher
from app.config import Config
# 客戶端代碼
text = 'hello server!'
# 隨機生成aes的密鑰
aes_key = get_random_bytes(16)
print('隨機生成的aes密鑰:\n%s' % aes_key)
aes_cipher = AESCipher(aes_key)
rsa_cipher = RSACipher()
# 使用aes密鑰對數(shù)據(jù)進行加密
encrypt_text = aes_cipher.encrypt(text)
print('經(jīng)過aes加密后的數(shù)據(jù):\n%s' % encrypt_text)
# 使用客戶端私鑰對aes密鑰簽名
signature = rsa_cipher.sign(Config.CLIENT_PRIVATE_KEY, aes_key)
print('簽名:\n%s' % signature)
# 使用服務(wù)端公鑰加密aes密鑰
encrypt_key = rsa_cipher.encrypt(Config.SERVER_PUBLIC_KEY, aes_key)
print('加密后的aes密鑰:\n%s' % encrypt_key)
# 客戶端發(fā)送密文静袖、簽名和加密后的aes密鑰
print('\n************************分割線************************\n')
# 接收到客戶端發(fā)送過來的signature encrypt_key encrypt_text
# 服務(wù)端代碼
# 使用服務(wù)端私鑰對加密后的aes密鑰解密
aes_key = rsa_cipher.decrypt(Config.SERVER_PRIVATE_KEY, encrypt_key)
print('解密后的aes密鑰:\n%s' % aes_key)
# 使用客戶端公鑰驗簽
result = rsa_cipher.verify(Config.CLIENT_PUBLIC_KEY, aes_key, signature)
print('驗簽結(jié)果:\n%s' % result)
# 使用aes私鑰解密密文
aes_cipher = AESCipher(aes_key)
decrypt_text = aes_cipher.decrypt(encrypt_text)
print('經(jīng)過aes解密后的數(shù)據(jù):\n%s' % decrypt_text)
運行結(jié)果:
隨機生成的aes密鑰:
b't\xb6\x8da\x8f2fa\xdc\x05\xc0\xff\x97\x84\xa2\xa9'
經(jīng)過aes加密后的數(shù)據(jù):
9TbA3VDRrLV9cz/ky/dUAQ==
簽名:
b'o5sdTd+0vBUNV2zRslIvUppRIDpb4HYfMhEAQEogih5nQmLvTy6h/1hIoUS240KasoiewUAfV+V9VABkNszIzWKh1B0HKpItwpzLDmbTd3iqE2BlIx3C3b+ak1Y14YTdI626RqhrCZQMAvlxerWWYu+sMCBCTfNt+WkKNiUUJvM='
加密后的aes密鑰:
b'Ybpxv9jtLhKLiUiIBTR7aRmOivvbh9KTIqjM9rMIqn4PezRftBqDa8HU4vn2y/2PEsPUY8tLbCkGC1E07d93ZrNrEX9PbU0zYTeWpRpJwfF0yWB41RonyWxQIO4cETOtqEitnRs4DRehqgVufU1SeEx45Wwy7wCGBOnudoo4bpA='
************************分割線************************
解密后的aes密鑰:
b't\xb6\x8da\x8f2fa\xdc\x05\xc0\xff\x97\x84\xa2\xa9'
驗簽結(jié)果:
True
經(jīng)過aes解密后的數(shù)據(jù):
hello server!
服務(wù)端發(fā)送加密信息給客戶端同理觉鼻,只是加密方從客戶端變成了服務(wù)端,解密方從服務(wù)端變成了客戶端队橙。
最后附上java版RSA和AES混合加密文章鏈接與相關(guān)源碼:
java實現(xiàn)RSA與AES混合加密
python坠陈,java跨語言RSA+AES混合加密解密以及踩過的那些坑
https://github.com/taoyimin/rsa-aes-python
https://github.com/taoyimin/rsa-aes-java