1

我正在尝试一个非常基本的用例来加密和解密示例字符串。下面是我的方法。我正在使用 pycryptodome 进行加密。

@staticmethod
def encryptdecrypt(field):
    if field is None:
        return None
    else:
        print("Input Text is --> "+field)
        cipher = AES.new(CryptHelper.secret_key,AES.MODE_EAX)
        text = cipher.encrypt(field.encode('UTF-8'))
        print("Encrypted String --> "+str(text))
        cipher = AES.new(CryptHelper.secret_key,AES.MODE_EAX)
        text = cipher.decrypt(text).decode('cp1252')
        print("Decrypted String --> " +text)        

我无法重新生成原始字符串。我得到如下乱码o / ps。我尝试了不同的编码,就像我在 Windows 10 上一样。但没有一个给我原始字符串。我在这里错过了什么吗?我对 python 很陌生。所以如果我犯了一个错误,请告诉我。

Input Text is --> Secret
Encrypted String --> b'^\xb4\xc7A\xbc\x05'
Decrypted String --> >F8Ò³…
4

1 回答 1

1

问题中的代码有两个问题:

  1. nonce 是由 AES 对象随机创建的,在解密过程中需要有某种方式来传输和使用 nonce;
  2. 需要使用encrypt_and_digestanddecrypt_and_verify而不是调用 just encryptand decrypt,否则不会创建身份验证标记(正如您对 EAX 等经过身份验证的操作模式所期望的那样)。

第一个问题生成随机数据,因为加密和解密过程中不同的随机数将完全改变解密后的结果。

第二个问题将让错误的密文通过而不验证身份验证标签,这将在解密过程中生成错误而不是错误的明文消息。

您可以在此处阅读有关此内容的更多信息(cryptodome documentation on authenticated ciphers


当然字符编码与此无关。您应该在加密和解密中使用相同的字符编码。通常首选 UTF-8。

于 2018-04-05T14:05:09.020 回答