首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python Fernet加密熵低的原因

Python Fernet加密熵低的原因
EN

Cryptography用户
提问于 2021-05-31 10:15:21
回答 1查看 490关注 0票数 0

我使用python cryptography.fernet的Fernet加密并生成密钥,如下所示

代码语言:javascript
复制
    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))

加密使用:

代码语言:javascript
复制
fernet = Fernet(key)
fernet.encrypt(data)

生成的密钥如下

代码语言:javascript
复制
"rH8VbfuKPip-K9e46GZrkLt0x7NP-MushFlzWDvw0VE="

算法:

代码语言:javascript
复制
fernet.encrypt(data) - Internal it used AES 128 CBC algorithm for encryption.

加密内容:

代码语言:javascript
复制
"8hcg7KJMLFVjoXl7JUQL3PZf0iH3V5cNpdMjrLIzsO9Rvg2KKM0uDjjG9ugZZNKJUnymd8T70MBObGKPtrIiK"

问题:加密内容的熵很低,Shannon熵: 5.9,通常加密的熵是7.9左右。

问:是什么使加密的内容看起来像文本?如何识别被加密的内容?因为熵很低。

注意,下面的方法给出了7.9左右的熵

代码语言:javascript
复制
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)
EN

回答 1

Cryptography用户

发布于 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位。如果找到我会编辑的。

票数 2
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/90309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档