【发布时间】: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没有定义。passw和secret_key应该是一样的吗? -
secret_key是一个包含实际密钥的变量。我重新格式化了我的原始代码以明确passw与secret_key相同以避免混淆。mail_pass是加密文本,secret_key是解密所需的密钥。
标签: python python-3.x cryptography pycrypto