使用不同的密钥时解密不应该失败吗?...
我将“E”更改为“F”(与G、H相同),并且解密过程仍然成功。我不知道为什么,如果我输入“I”,例如它会失败。据我了解,对称加密依赖于使用完全相同的密钥进行加密和解密。我是加密/解密领域的新手。
def encrypt_message(message, key) -> bytes:
"""Encrypts a message using Fernet."""
f = Fernet(key)
encrypted_message = f.encrypt(message.encode())
return encrypted_message
def decrypt_message(encrypted_message, key) -> str:
"""Decrypts a message using Fernet."""
f = Fernet(key)
decrypted_message = f.decrypt(encrypted_message).decode()
return decrypted_message
message_ = "This is a secret message!"
encrypted = encrypt_message(message_, b"HeYt_XX4wRLvnDP9fC9-7hlMgasQ270tpWSrjKy0jRE=")
# The encrypted message will change in every encryption process which is OK
print("Encrypted:", encrypted)
decrypted = decrypt_message(encrypted, b"HeYt_XX4wRLvnDP9fC9-7hlMgasQ270tpWSrjKy0jRF=")
print("Decrypted:", decrypted)
输出: 加密:b'gAAAABmcc7eNiwRP4lYl7gM0mthNdlvYsPUs_nttJMchmZ_mfJNMS4D2BC3QZHZZiZ7vrPhPwvBqK2DDOXSuB5wQkk9t-tU0PYefGvNy2IoDZNGNQMcdc0=' 解密:这是一条秘密消息!
进程已完成,退出代码为 0
您正在使用的“密钥”是 32 字节 AES 密钥的 urlsafe base64 编码值,而不是实际的 AES 密钥。由于 Base64 编码算法的性质,最后一个 Base64 字符的一些位将被丢弃。请记住,编码算法每 3 个输入字节(24 位)进行分组,并将它们编码为四个 Base64 字符。那么如果输入字节数不是3的倍数会发生什么呢?例如,32 字节 AES 密钥比 3 的倍数多 2。然后,通过将 16 位填充到下一个 6 位的倍数(即 18 位)来对剩余的最后两个字节(即 16 位)进行编码。填充位设置为零,但解码器会忽略它们,因此您可以将这两个位设置为您想要的任何内容,无论如何它们都会被丢弃。