【问题标题】:Python padding for cryptography AES用于加密 AES 的 Python 填充
【发布时间】: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


【解决方案1】:

所以,对于每个遇到这个问题的包modoboa-imap-migration

问题在于,在 DB 表 modoboa_imap_migration_migration 中,此包存储了迁移的所有密码,但是 _password 列被设置为 varchar(100),这不足以保存加密的通行证。我将其增加到 varchar(255),现在一切正常。

【讨论】:

    猜你喜欢
    • 2018-06-12
    • 2013-09-25
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    相关资源
    最近更新 更多