【问题标题】:Python3 PyCrypto - ValueError: IV must be 16 bytes longPython3 PyCrypto - ValueError:IV 必须为 16 个字节长
【发布时间】:2021-01-30 21:47:01
【问题描述】:

我正在试验PyCrypto 库。我的朋友给了我他们用来加密字符串、密文和 IV 的公钥 (base64)。他们使用的密码是AES-CBC。我认为这会相对简单,但我收到错误ValueError: IV must be 16 bytes long。以下是我的代码、回溯和发现:

CODE:

import sys
from Crypto.Cipher import AES
from Crypto.Random import get_random_bytes

message = "GgFyMNGjCOnrE3NjNEYko57ZUdy36ldB+/WrR5+ctN6jglicmb3ONvY4mfswk09BUmm0rCBy6yyaTFWKWuEgnMtu0RpbyyHICCQAVTmgwtgQ9wWlE1BJJAHJsZd61cMlsLomtRtCuNOnX5fnoGcs2X=="

key = b'xSAU2gWfDhWusUPplf8RtWknJ0ZKZ+dqK23/go8i0ls='
print(sys.getsizeof(key))

iv = b'WmiBaaAuyX7YCSTTPj07/c=='
print(sys.getsizeof(iv))

aes = AES.new(key, AES.MODE_CBC, iv)
decd = aes.decrypt(message)
print(decd)

TRACE:

77
65
Traceback (most recent call last):
  File "main.py", line 21, in <module>
    aes = AES.new(key, AES.MODE_CBC, iv)
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/AES.py", line 95, in new
    return AESCipher(key, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/AES.py", line 59, in __init__
    blockalgo.BlockAlgo.__init__(self, _AES, key, *args, **kwargs)
  File "/usr/local/lib/python3.7/site-packages/Crypto/Cipher/blockalgo.py", line 141, in __init__
    self._cipher = factory.new(key, *args, **kwargs)
ValueError: IV must be 16 bytes long

如您所见,密钥大小为 77 字节,IV 大小为 65 字节。我只是使用提供给我的密钥和 IV 来加密原始文本(我知道将密钥放入纯文本的安全隐患。这些不是实际的密钥,只是相同长度的随机字符串演示目的)。

【问题讨论】:

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


【解决方案1】:

您需要同时解码key 和iv,但还必须解码message,否则它不会像您使用CBC 模式那样对齐16 个字节。

from Crypto.Cipher import AES
import base64

message = b"GgFyMNGjCOnrE3NjNEYko57ZUdy36ldB+/WrR5+ctN6jglicmb3ONvY4mfswk09BUmm0rCBy6yyaTFWKWuEgnMtu0RpbyyHICCQAVTmgwtgQ9wWlE1BJJAHJsZd61cMlsLomtRtCuNOnX5fnoGcs2X=="
message = base64.b64decode(message)

key = b'xSAU2gWfDhWusUPplf8RtWknJ0ZKZ+dqK23/go8i0ls='
key = base64.b64decode(key)

iv = b'WmiBaaAuyX7YCSTTPj07/c=='
iv = base64.b64decode(iv)

aes = AES.new(key, AES.MODE_CBC, iv)
decd = aes.decrypt(message)
print(decd)

【讨论】:

  • 这可能超出了这个问题的范围,但是当我使用decrypt() 方法时,它返回一个我假设是utf-8 编码的字节对象。但是,当我使用decode() 方法时,即decd = decd.decode(),我得到了这个错误,UnicodeDecodeError: 'utf-8' codec can't decode byte 0xad in position 0: invalid start byte。
  • @CynicalFly 尝试解码latin1 但我已经尝试过了,明文似乎没有意义,你确定它只是你说“假设”的可读文本吗?。
  • 我提出了一个单独的问题来跟踪这个:stackoverflow.com/questions/65985194/…
猜你喜欢
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-04
  • 2015-02-05
  • 1970-01-01
  • 2020-04-28
相关资源
最近更新 更多