Python之AES加密遇到的一些坑以及解決方法

(代碼放在後面)

報錯信息:TypeError: Object type <class 'str'> cannot be passed to C code

之前用Python寫AES/CBC/PKCS5Padding加密, 寫好了1.0版本之後只是這樣的

 

寫成這樣之後, 我的電腦上運行沒問題, 就給別人了, 結果別人電腦上一運行就報錯

報錯信息如下:

我也查了一下, 可能是我電腦上的加密庫的版本和他電腦上的版本不一樣, 他那個版本加密內容需要是字節, 所以我就修改了一下, 修改之後如下, 修改地方紅色標出來了:

在加密時候, 把加密內容轉一下就好了

 

完整代碼如下:

import base64
import binascii
import re
from Crypto.Cipher import AES


class AESCBC:
    def __init__(self):
        self.key = 'msunsoftalphaicd'.encode('utf-8')  # 定義key值
        self.mode = AES.MODE_CBC
        self.bs = 16  # block size
        self.PADDING = lambda s: s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    # 加密
    def encrypt(self, text):
        generator = AES.new(self.key, self.mode, self.key)  # 這裏的key 和IV 一樣 ,可以按照自己的值定義
        crypt = generator.encrypt(self.PADDING(text).encode('utf-8'))
        crypted_str = base64.b64encode(crypt)   #輸出Base64
        # crypted_str = binascii.b2a_hex(crypt)  # 輸出Hex
        result = crypted_str.decode()
        return result

    # 解密
    def decrypt(self, text):
        generator = AES.new(self.key, self.mode, self.key)
        text += (len(text) % 4) * '='
        decrpyt_bytes = base64.b64decode(text)           #輸出Base64
        # decrpyt_bytes = binascii.a2b_hex(text)  # 輸出Hex
        meg = generator.decrypt(decrpyt_bytes)
        # 去除解碼後的非法字符
        try:
            result = re.compile('[\\x00-\\x08\\x0b-\\x0c\\x0e-\\x1f\n\r\t]').sub('', meg.decode())
        except Exception:
            result = '解碼失敗,請重試!'
        return result

if __name__ == '__main__':

    a = AESCBC()
    print(a.encrypt('1'))
    print(a.decrypt(a.encrypt('1')))

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章