【发布时间】:2019-03-09 10:21:33
【问题描述】:
我正在使用 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)
print 语句现在打印一些字节,但是当我在其上运行 .decode() 时出现错误:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xfa in position 0: invalid start byte 并且似乎无法弄清楚我需要做什么才能使其能够被打印作为一个字符串。
【问题讨论】:
-
@stovfl 这个问题看起来可能有助于回答我的问题,但我觉得我的问题主要与 Laravel/环境文件有关,而不仅仅是试图修复错误,在我问的问题中如果有人知道我是否真的从 laravel 获取了正确的 AES 密钥,而不仅仅是如何修复 Python 错误。
-
我明白你的意思。是什么让你觉得你弄错了钥匙? `php artisan key:generate* 命令生成什么。
-
@stovfl 它根据 stackoverflow.com/a/44839772/8093698 生成用于加密的密钥,我也只是尝试重新运行它以查看会发生什么,但是当我将它输入到我的 Python 代码中时,它仍然是相同的不正确位数.
-
您未能对密钥进行 base64 解码。
标签: python laravel encryption openssl aes