我正在使用Laravel的encryptString方法在我的网站上加密一些数据。这使用OpenSSL的256位AES-CBC加密,没有任何序列化。现在我正在尝试在Python中解密这些数据,但我一直收到有关密钥长度的错误,并且似乎无法弄清楚原因。
Example data to decrypt: eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==
Example Key to use for decryption (from laravel .env):
base64:/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK=
我将这些值进行了更改,因此实际上使用这些值进行解密不会得到任何真实数据,只是为了举例而已。然后我尝试在Python 3.7中解密此数据:
import base64
from Crypto.Cipher import AES
def decrypt(enc, key):
IV = 16 * '\x00'
decobj = AES.new(key, AES.MODE_CBC, IV)
data = decobj.decrypt(base64.b64decode(enc))
print(str(data.decode()))
if __name__ == "__main__":
key = b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK="
decrypt("eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==", key)
这段代码看起来应该能够工作,但运行时却报错:
ValueError: Incorrect AES key length (60 bytes)
。我不确定自己做错了什么。我尝试过对数据/密钥进行填充/取消填充,但没有改变任何东西。我在想是否从 Laravel 获得了错误的解密密钥,但从链接的文档中可以看出,这应该只是我的 .env 文件中的 APP_KEY。
如果有人能帮助我或指点一下方向,那就太棒了!
与其他类似问题不同的是,我主要是想弄清楚我是否从 Laravel 获取了正确的 AES 密钥,我实际上并不需要过多的解密帮助,只是认为我从 Laravel 中获取了错误的密钥。
编辑:新的代码似乎可以工作:
import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
def decrypt(enc, key):
IV = 16 * '\x00'.encode()
decobj = AES.new(key, AES.MODE_CBC, IV)
data = decobj.decrypt(pad(base64.b64decode(enc), 16))
print(base64.b64decode(data))
if __name__ == "__main__":
key = base64.b64decode(b"/AZejP0lh3McL/+Vy5yZcADdTcR65qnx5Jqinuw7raK=")
decrypt("eyJpdiI6ImdxY0VcLzFodmpISFV4allSWmJDdEpRPT0iLCJ2YWx1ZSI6IkxXd0ZJaUd2bTUweW5pNm0wUjQwOFM2N1wvWEs5SlYrNB4xNlR7Qkh1U3FvPSIsIm1hYyI6Ijc5ZWM0YTYxYjljZGFiNzgwNjY2NDU1ZmQ5Yjc1ZmJlOGU4NzBkMjQzMzA3MmVhYzE3NzY4ZmU1MWIyMjZlOTQifQ==", key)
现在的打印语句输出了一些字节,但是当我运行.decode()时,出现了错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 0: invalid start byte
,而且似乎无法弄清楚需要做什么才能将其作为字符串打印出来。
php artisan key:generate
命令会生成什么? - stovfl