我使用python cryptography.fernet的Fernet加密并生成密钥,如下所示
salt = os.urandom(16)
kdf = PBKDF2HMAC(
algorithm=hashes.SHA256(),
length=32,
salt=salt,
iterations=78643,
backend=default_backend()
)
key = base64.urlsafe_b64encode(kdf.derive(password))加密使用:
fernet = Fernet(key)
fernet.encrypt(data)生成的密钥如下
"rH8VbfuKPip-K9e46GZrkLt0x7NP-MushFlzWDvw0VE="算法:
fernet.encrypt(data) - Internal it used AES 128 CBC algorithm for encryption.加密内容:
"8hcg7KJMLFVjoXl7JUQL3PZf0iH3V5cNpdMjrLIzsO9Rvg2KKM0uDjjG9ugZZNKJUnymd8T70MBObGKPtrIiK"问题:加密内容的熵很低,Shannon熵: 5.9,通常加密的熵是7.9左右。
问:是什么使加密的内容看起来像文本?如何识别被加密的内容?因为熵很低。
注意,下面的方法给出了7.9左右的熵
key=b'\xcb\x98\xa8\xb6\x94jU\xe8\x92zdR\xa0\x1a\xae\xec'
aes = AES.new(key, AES.MODE_CTR, counter=Counter.new(128))
aes.encrypt(data)发布于 2021-05-31 10:45:26
你只是简单地混淆了序列的熵率和整个熵的内容。这取决于序列的编码。序列的base64版本比纯二进制时的33-36%要大。从而将最大可能的熵率降低到5.9位/字符。
我们可以跳到熵测量,但我们可以直接用这条线来追踪:salt = os.urandom(16)。这大概是128位相当不错的熵,被塞进了关键序列。它很容易地符合32个字符(~21个字符真正需要)。由于关键派生函数的存在,您的实际password可以是常规的(业务需求允许的)。
下列问题编辑:
密码文本是“低”熵,因为它是base64默认编码的。这是一个“Fernet令牌”。这就是这个模块的意义所在。查看文档,特别是encrypt(data)。或这里.这是一个比下面的AES加密更高级的API。它还具有SHA256 HMAC认证和时间戳功能。都是base64文本。因此,~5.9位/焦。
如果能找到这个答案,估计一个Linux序列的实际熵,我将不胜感激。我找不到,但似乎记得是110位。如果找到我会编辑的。
https://crypto.stackexchange.com/questions/90309
复制相似问题