【发布时间】:2018-02-15 21:04:41
【问题描述】:
由于我对 Python 或密码学知之甚少,我无法找出解决方案,但我想问题出在填充上。 该脚本使用两个函数获取和解密密码。 我收到一个错误:
ValueError: The length of the provided data is not a multiple of the block length.
我猜这与填充有关。
以下是脚本使用的值:
密钥:8$4Tws[14R!,0Ba|
加密通行证:YTj+F1oo5OUNBgKyfifN/2R2zvFLFHbXu4Te2+OvBJ7JRae1DMVJR42qK0GucmiUyTGdtQzFSUeNqitBrnJolMkxp7UMxUlHeaor
功能:
from django.utils.encoding import force_bytes, force_text
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend
@property
def password(self):
"""Password getter."""
return decrypt(self._password)
def decrypt(ct):
backend = default_backend()
key = param_tools.get_global_parameter("secret_key", app="core")
print(key)
cipher = Cipher(
algorithms.AES(force_bytes(key)), modes.ECB(), backend=backend)
ct = base64.b64decode(force_bytes(ct))
decryptor = cipher.decryptor()
clear = decryptor.update(ct) + decryptor.finalize()
return force_text(clear.rstrip(b" "))
你能帮忙吗?谢谢
【问题讨论】:
-
也许这有帮助:
https://stackoverflow.com/questions/17773450/why-must-all-inputs-to-aes-be-multiples-of-16 -
如果您对您提供的“加密通行证”进行 base64 解码,您将获得 75 个字节。 75 个字节不是 AES 要求的 16 的倍数。您提供的“加密通行证”或您对其加密/编码方式的理解有问题。
-
谢谢大家.. @EbbeM.Pedersen 这很好,如果脚本使用相同的程序来加密密码,结果应该是有效且可解密的,对吧?这些值是我在运行脚本时刚刚打印出来的。所以我也会检查加密方面,这些值被保存到数据库中,然后被这个脚本用来解密它们,所以可能在过程中的某个地方它被搞砸了。
-
再次感谢您将我推向正确的方向,我发现了问题,使用包创建的 DB 将
password列大小设置为 100 个字符,这不足以让 ct被存储。
标签: python encryption cryptography aes padding