在Windows Python上加密Decrypt编码

时间:2018-04-05 08:22:22

标签: python python-3.x encryption character-encoding pycryptodome

我正在尝试一个非常基本的用例来加密和解密示例字符串。以下是我的方法。我正在使用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Ò³…

1 个答案:

答案 0 :(得分:1)

问题中的代码存在两个问题:

  1. nonce是由AES对象随机创建的,在解密过程中需要有一些方法来传递和使用nonce;
  2. 需要使用encrypt_and_digestdecrypt_and_verify,而不是仅调用encryptdecrypt,否则不会创建身份验证标记(正如您所期望的那样)对于经过身份验证的操作模式,例如EAX)。
  3. 第一个问题产生随机数据,因为加密和解密期间的不同随机数将在解密后完全改变结果。

    第二个问题是在没有验证身份验证标记的情况下通过错误的密文,这会在解密过程中产生错误而不是错误的明文消息。

    您可以阅读有关此here (cryptodome documentation on authenticated ciphers的更多信息。

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