首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在crypt_and_hash中,PolarSSL中的密码密钥总是20个字节(带空填充)。

在crypt_and_hash中,PolarSSL中的密码密钥总是20个字节(带空填充)。
EN

Stack Overflow用户
提问于 2014-09-14 08:40:03
回答 2查看 904关注 0票数 1

我正在编写一个应用程序,其安全性基于散列示例包提供的PolarSSL。在这个示例中,crypt_and_hash接受一个键(通过命令行参数提供)和一个随机的16字节IV。然后,它将它们混合在一起8192次(原因我不知道,但这不是问题):

代码语言:javascript
复制
    memset( digest, 0,  32 );
    memcpy( digest, IV, 16 );

    for( i = 0; i < 8192; i++ )
    {
        md_starts( &md_ctx );
        md_update( &md_ctx, digest, 32 );
        md_update( &md_ctx, key, keylen );
        md_finish( &md_ctx, digest );

    }

然后,它获取输出,并使用它通过cipher_setkey设置密码上下文中的密钥,该密钥稍后用于执行所有加密/解密操作:

代码语言:javascript
复制
    if( cipher_setkey( &cipher_ctx, digest, cipher_info->key_length,
                       POLARSSL_ENCRYPT ) != 0 )

我注意到,当crypt_and_hash创建其摘要时,它在缓冲区中只设置20个字节,然后是12个空字节,而不管加密方案和提供的密钥的大小如何。我尝试了不同的方案和密钥大小来测试它。密钥大小不应该根据加密(例如,AES-256的32字节和AES-128的16字节)吗?为什么总是20岁?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-14 11:49:00

这里有一个专有的基于密码的密钥派生函数(PBKDF)。此功能似乎允许关键加强或关键拉伸,但不允许关键扩展。

如果密钥不是完全随机的,则可以使用密钥增强来增强强制使用密钥值(或密码值)的难度。它由循环实现,使用IV (实际上是salt)和加密哈希函数中的密钥。如果您收到20个字节,这很可能是SHA-1,因为它有160位的输出。

该算法不提供密钥扩展。键展开是您所看到的:将计算出来的随机数分布在X位数上。它相对容易实现,也许最好的方法就是看看HKDF的密钥扩展算法。

但是,目前该方案受到PBKDF中哈希输出的限制。当然,如果您使用SHA-256,您将有足够的熵一个AES-256键。或者,如果每次加密使用不同的salt,则可以使用SH-384派生AES-256密钥,并使用剩余的位作为IV (用于加密)。

注意,术语键拉伸并不总是意味着相同的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-09-16 11:00:18

crypt_and_hashPolarSSL提供的一个示例,用于演示如何同时使用密码层和md层。如果您使用SHA-1,它只能从MD获得最多20字节(160位),从而进入密钥使用。

如果要使用需要较大密钥的密码(如AES-256),则需要在命令行上使用不同的哈希算法,例如SHA-256或SHA-512,这将为您填充整个32字节的密钥空间。

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

https://stackoverflow.com/questions/25831535

复制
相关文章

相似问题

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