Python加密-如果我加密相同的消息,我如何获得相同的加密值



我一直在使用python库Fernet并使用它来加密电子邮件。我的问题是,如果我再次加密相同的电子邮件,它会给出不同的令牌。

是否有一种方法,或替代库,它会给我相同的输出,如果输入(电子邮件在我的情况下)保持不变?

我不能使用散列,因为我们需要稍后解密电子邮件。

这是我目前正在做的。我们需要两次获得相同的令牌,因为在将新电子邮件插入系统之前,我需要检查它的唯一性。另一种方法是先解密所有的电子邮件,这看起来不太理想。

f = Fernet(key)
token = f.encrypt(b"xyz@asdfljlsdafjsdalkfj.com")
token

对于指定的用法(将密文存储在安全的服务器空间中,密文永远不会以加密的形式离开服务器),AES在ECB模式下的使用可以是一个选项(感谢@Artjom B.)。

由于ECB模式没有任何随机元素(除了密钥),您每次运行都会得到相同的[明文-密钥-密文]组合-您可以使用我的实时示例代码测试加密:https://repl.it/@javacrypto/SoPythonAesEcb256StringEncryption。

输出:

AES ECB 256 String encryption with fixed key
plaintext: The quick brown fox jumps over the lazy dog
encryptionKey (Base64): UFmBQEE4MpP4m9btYFlUmEqRE3g5wa2Yfa2T28uB+OU=
* * * Encryption * * *
ciphertext: fp6Qqo3zzznH7Hs9c0q4Q+GDRjzhUcatkl/vbTMim2e/5HUQgZLUmsg7uMcNmQhZ
* * * Decryption * * *
plaintext:  The quick brown fox jumps over the lazy dog

要运行代码,您需要使用外部库Pycryptodome,可在这里获得:https://pypi.org/project/pycryptodome/和这里的文档:https://www.pycryptodome.org/en/latest/src/cipher/aes.html

安全警告下面的代码在ECB模式下使用AES算法即不安全在大多数情况下!

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
import base64
def base64Encoding(input):
dataBase64 = base64.b64encode(input)
dataBase64P = dataBase64.decode("UTF-8")
return dataBase64P
def base64Decoding(input):
return base64.decodebytes(input.encode("ascii"))
def aesEcbEncryptToBase64(encryptionKey, plaintext):
cipher = AES.new(encryptionKey, AES.MODE_ECB)
ciphertext = cipher.encrypt(pad(plaintext.encode("ascii"), AES.block_size))
return base64Encoding(ciphertext)
def aesEcbDecryptFromBase64(decryptionKey, ciphertextDecryptionBase64):
ciphertext = base64Decoding(ciphertextDecryptionBase64)
cipher = AES.new(decryptionKey, AES.MODE_ECB)
decryptedtext = unpad(cipher.decrypt(ciphertext), AES.block_size)
decryptedtextP = decryptedtext.decode("UTF-8")
return decryptedtextP

print("AES ECB 256 String encryption with fixed key")
plaintext = "The quick brown fox jumps over the lazy dog"
print("plaintext: " + plaintext)
encryptionKeyBase64 = "UFmBQEE4MpP4m9btYFlUmEqRE3g5wa2Yfa2T28uB+OU="
encryptionKey = base64Decoding(encryptionKeyBase64)
print("encryptionKey (Base64): " + encryptionKeyBase64)
print("n* * * Encryption * * *") 
ciphertextBase64 = aesEcbEncryptToBase64(encryptionKey, plaintext)
print("ciphertext: " + ciphertextBase64)
print("n* * * Decryption * * *") 
decryptedtext = aesEcbDecryptFromBase64(encryptionKey, ciphertextBase64)
print("plaintext:  " + decryptedtext)

最新更新