【问题标题】:Decrypt function only returns partial string and not the entire value解密函数只返回部分字符串而不是整个值
【发布时间】:2019-09-11 21:15:57
【问题描述】:

我正在编写一个测试脚本,我用它来尝试解密我拥有密钥的加密字符串。然而,虽然代码有些运行,但它并没有打印出我期望的完整字符串/值(并且知道结果)。

例如,不是返回ThisIsTheStringThatWorks,而是返回atWorks

代码如下:

import base64
import hashlib
from Crypto.Cipher import AES

BLOCK_SIZE = 16
unpad = lambda s : s[0:-s[-1]]

def decrypt(enc, secret_key):
    private_key = hashlib.sha256(secret_key.encode('utf-8')).digest()
    enc = base64.b64decode(enc)
    iv = enc[:BLOCK_SIZE]
    cipher = AES.new(private_key, AES.MODE_CBC, iv)
    return unpad(cipher.decrypt(enc[BLOCK_SIZE:]))

decrypted = decrypt(mail_pass, secret_key)
print(bytes.decode(decrypted))

任何帮助将不胜感激。提前致谢。

【问题讨论】:

  • 你的密文有多长?可以发一下加密代码吗?
  • SHA-256 不是正确的密钥派生函数:pycryptodome.readthedocs.io/en/latest/src/protocol/kdf.html CBC 模式被认为已过时。您应该使用 AEAD 模式:pycryptodome.readthedocs.io/en/latest/src/cipher/modern.html
  • @mat 关于密文的长度,可以从OP提供的信息中扣除。看我的回答。加密代码的副本确实有用!
  • 提供的代码示例没有运行,因为secret_key 没有定义。 passwsecret_key 应该是一样的吗?
  • secret_key 是一个包含实际密钥的变量。我重新格式化了我的原始代码以明确passwsecret_key 相同以避免混淆。 mail_pass 是加密文本,secret_key 是解密所需的密钥。

标签: python python-3.x cryptography pycrypto


【解决方案1】:

您尚未在加密消息中包含 IV。您在解密期间使用第一个加密块作为 IV,因此在第一个块中加密的数据丢失。

如果您希望此解密例程起作用,则必须在加密例程中连接 IV 和密文:

enc = iv + cipher.encrypt(clear)

【讨论】:

  • 感谢您的回复,尔万。使用我的代码,您能否提供一个解释示例,以便我更好地理解您给出的方向?
  • @MrY 我添加了一个代码示例,但是由于您没有提供加密例程,这可能与您的实际代码不匹配。
  • @MrY 另外,由于很明显你对密码学的了解不够,我认为你不应该使用 PyCryptodome 或更糟糕的是,已停产的 PyCrypto。密码学很难。我建议你改用万无一失的 pyNaCl:pynacl.readthedocs.io/en/stable/secret
猜你喜欢
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多