【问题标题】:How to encrypt sting with AES / CBC 128 with specific key and IV length如何使用具有特定密钥和 IV 长度的 AES / CBC 128 加密刺痛
【发布时间】:2022-04-29 07:33:14
【问题描述】:

我正在尝试使用 AES cbc 128 加密字符串,但每次都遇到这个问题

self._cipher = factory.new(key,args, kwargs)ValueError: IV must be 16 bytes long

我正在使用 pycrypto 库,这是我的代码,

import base64
from Crypto.Cipher import AES

def pad(m):
     return m+chr(16-len(m)%16)*(16-len(m)%16)

msg = \'Hello there I am new in Python\'
ciph = AES.new(\"asdfghjkl\", AES.MODE_CBC, \"asdfghjkl\")
enc = ciph.encrypt(pad(msg))
base = base64.b64encode(enc)
print (base)

每当我将密钥和 IV 长度更改为 16 位时,它都可以工作......但我只想用这个密钥和 IV 加密字符串,即 \"asdfghjkl\"

我见过很多在线网站都使用任何密钥、IV 长度以相同的方式加密字符串……但我没有弄清楚……它是如何工作的>

提前致谢。

  • 根据定义,AES 使用 16 字节的 IV 和 16、24 或 32 字节的密钥大小。这是无法改变的。
  • 这正是我已经回答的:不,这是不可能的,除非像链接网站那样作弊。一个简单的测试表明,对于 AES,太短的密钥会以 0x00 的值默默地扩展到 16 个字节,这是对无效密钥的错误处理,而且绝不是一个很好的例子(就像大多数在线加密网站一样)。
  • 以同样的方式延长太短的IV。
  • @Topaco 请注意,AES 不使用任何 IV,它是使用的操作模式。 AES/GCM 通常使用 12 字节的 IV。另请注意,IV必须对于 AES-CBC 是不可预测/随机的,因此将考虑用零扩展 IV不安全. Mike211,加密/解密的想法是让数据保密。只是让它工作不应该是你的目标。这些 f*\'ed 网站所做的完全是随机的,而且通常是不安全的。不要混淆位/字节。
  • @MaartenBodewes - 这个问题是关于 AES/CBC 的,这里 IV 的大小等于 AES 定义为 16 字节的块大小。关于安全性:我根本没有进入这一点,但感谢您的补充。请注意,除了 IV,使用 0x00 值扩展的密钥也必须被认为是不安全的。

标签: python python-3.x encryption aes password-encryption


【解决方案1】:

好吧,Mike 在 cmets AES 中使用 16 字节 IV 和 16、24 或 32 字节作为密钥大小,因此无法使用短 IV 和密钥加密字符串或其他任何内容,除非您为例如用 Zeros 的值扩展长度,直到它变成 16 字节。

您可以非常简单地将您的密码和 IV 转换为十六进制并添加零,直到在您的情况下变为 16 “asdfghjkl“将是十六进制”61 73 64 66 67 68 6a 6b 6c“所以你需要添加00000000000000这样它就可以正常工作..但它不安全..在python中你可以使用 unhexlify() 将十六进制密钥和iv转换为字节。

【讨论】:

    猜你喜欢
    • 2017-11-21
    • 2020-02-02
    • 2021-02-13
    • 2019-09-30
    • 1970-01-01
    • 2017-05-23
    • 2017-11-17
    • 1970-01-01
    • 2013-08-11
    相关资源
    最近更新 更多