1

我正在制作一个加密和解密文本的程序。我正在使用 Python 3.7 和 cryptography.fernet 库。我想在 GitHub 页面上输入一些关于我的程序加密标准的信息,但我不明白 Fernet 使用哪种加密。

这是我在项目中使用的示例代码。我想使用 256 位 (AES-256) 密钥进行加密,但此代码生成的密钥长度超过 32 个字符。它是 44 个字符。但在密码库的官方网站上,它说此代码生成 128 位密钥。这个 44 个字符(352 位)密钥的名称是什么?或者有什么方法可以在没有 PyCrypto 的情况下进行 256 位对称加密?

from cryptography.fernet import Fernet
import base64
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC

textEncrypt = "Secret Data"
password = "Password"
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000)
key = base64.urlsafe_b64encode(kdf.derive(password))
fernet = Fernet(key)
encryptedText = fernet.encrypt(textEncrypt.encode())

这是此代码生成的密钥:aAT_LESBw_ZGlPA52cj4zQd6jBdx6gk5RmQWbpLY7e0=

4

1 回答 1

1

它在文档中写得很好;

执行

Fernet 建立在许多标准加密原语之上。具体来说,它使用:

  • CBC 模式下的 AES,使用 128 位密钥进行加密;使用 PKCS7 填充。
  • HMAC 使用 SHA256 进行身份验证。
  • 使用 os.urandom() 生成初始化向量。

有关完整的详细信息,请参阅规范

因此,您不能将 AES-256 与 Fernet 一起使用

  • Cryptography.io 库也有其他模式,在有害物质层中,包括 AES-256 的 CBC、CTR 和 GCM。

PyCrypto可以为 AES-256 使用多种操作模式,包括 CBC、CTR、GCM、SIV 和 OCB


不清楚如何获得 44 字节,这是获得 32 字节的方法;

from cryptography.fernet import Fernet
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.kdf.pbkdf2 import PBKDF2HMAC
import base64
import os


textEncrypt = "Secret Data"
password = "Password"
salt = os.urandom(16)
kdf = PBKDF2HMAC(algorithm=hashes.SHA256(),length=32,salt=salt,iterations=100000)

key = kdf.derive(str.encode(password))
print(len(key))
print(key)

和输出

32
b'K\xf6\x10a\xd6B`\x8a\x83\x13\xc2\xcfOJ\xcb\x02k$~\xf7v\x01\x80\xd0\xda\x93!\xaf\xa9B\x94\xfe'
于 2021-05-03T12:38:47.197 回答