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

2024-04-24 19:33:37 发布

您现在位置:Python中文网/ 问答频道 /正文

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

如果输入(在我的情况下是电子邮件)保持不变,是否有一种方法或替代库可以为我提供相同的输出

我不能使用哈希,因为我们以后需要解密电子邮件

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

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

Tags: 方法keycomtoken电子邮件系统情况事情
1条回答
网友
1楼 · 发布于 2024-04-24 19:33:37

对于指定用途(将密文存储在安全的服务器空间内,密文不会以加密形式离开服务器),可以选择在模式ECB下使用AES(多亏@Artjom B.)

由于ECB模式没有任何随机元素(除了密钥),因此每次运行都会得到相同的[plaintext-key-ciphertext]组合-您可以使用我的实时示例代码测试加密: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)

相关问题 更多 >