Python 3 Fernet 解密成功,加密密钥稍加修改

问题描述 投票:0回答:1

使用不同的密钥时解密不应该失败吗?...

我将“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

python encryption cryptography fernet
1个回答
0
投票

您正在使用的“密钥”是 32 字节 AES 密钥的 urlsafe base64 编码值,而不是实际的 AES 密钥。由于 Base64 编码算法的性质,最后一个 Base64 字符的一些位将被丢弃。请记住,编码算法每 3 个输入字节(24 位)进行分组,并将它们编码为四个 Base64 字符。那么如果输入字节数不是3的倍数会发生什么呢?例如,32 字节 AES 密钥比 3 的倍数多 2。然后,通过将 16 位填充到下一个 6 位的倍数(即 18 位)来对剩余的最后两个字节(即 16 位)进行编码。填充位设置为零,但解码器会忽略它们,因此您可以将这两个位设置为您想要的任何内容,无论如何它们都会被丢弃。

© www.soinside.com 2019 - 2024. All rights reserved.