python實現(xiàn)RSA與AES混合加密

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)
運行結(jié)果

但是這只是簡單的實現(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捐康,隨后出現(xiàn)的幾起案子仇矾,更是在濱河造成了極大的恐慌,老刑警劉巖解总,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贮匕,死亡現(xiàn)場離奇詭異,居然都是意外死亡花枫,警方通過查閱死者的電腦和手機刻盐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劳翰,“玉大人敦锌,你說我怎么就攤上這事〖阳ぃ” “怎么了乙墙?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長生均。 經(jīng)常有香客問我听想,道長,這世上最難降的妖魔是什么马胧? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任汉买,我火速辦了婚禮,結(jié)果婚禮上佩脊,老公的妹妹穿的比我還像新娘录别。我一直安慰自己,他們只是感情好邻吞,可當我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布组题。 她就那樣靜靜地躺著,像睡著了一般抱冷。 火紅的嫁衣襯著肌膚如雪崔列。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機與錄音赵讯,去河邊找鬼盈咳。 笑死,一個胖子當著我的面吹牛边翼,可吹牛的內(nèi)容都是我干的鱼响。 我是一名探鬼主播,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼组底,長吁一口氣:“原來是場噩夢啊……” “哼丈积!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起债鸡,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤江滨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后厌均,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體唬滑,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年棺弊,在試婚紗的時候發(fā)現(xiàn)自己被綠了晶密。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡模她,死狀恐怖惹挟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情缝驳,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布归苍,位于F島的核電站用狱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏拼弃。R本人自食惡果不足惜夏伊,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吻氧。 院中可真熱鬧溺忧,春花似錦、人聲如沸盯孙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽振惰。三九已至歌溉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痛垛。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工草慧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匙头。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓漫谷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹂析。 傳聞我的和親對象是個殘疾皇子舔示,可洞房花燭夜當晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容