(代碼放在後面)
報錯信息: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')))