我正在尝试一个非常基本的用例来加密和解密示例字符串。以下是我的方法。我正在使用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Ò³…
答案 0 :(得分:1)
问题中的代码存在两个问题:
encrypt_and_digest
和decrypt_and_verify
,而不是仅调用encrypt
和decrypt
,否则不会创建身份验证标记(正如您所期望的那样)对于经过身份验证的操作模式,例如EAX)。第一个问题产生随机数据,因为加密和解密期间的不同随机数将在解密后完全改变结果。
第二个问题是在没有验证身份验证标记的情况下通过错误的密文,这会在解密过程中产生错误而不是错误的明文消息。
您可以阅读有关此here (cryptodome documentation on authenticated ciphers的更多信息。
当然,字符编码与此无关。您应该在加密和解密上使用相同的字符编码。通常UTF-8是首选。