我正在编写一个应用程序,其安全性基于散列示例包提供的PolarSSL。在这个示例中,crypt_and_hash接受一个键(通过命令行参数提供)和一个随机的16字节IV。然后,它将它们混合在一起8192次(原因我不知道,但这不是问题):
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设置密码上下文中的密钥,该密钥稍后用于执行所有加密/解密操作:
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岁?
发布于 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 (用于加密)。
注意,术语键拉伸并不总是意味着相同的事情。。
发布于 2014-09-16 11:00:18
crypt_and_hash是PolarSSL提供的一个示例,用于演示如何同时使用密码层和md层。如果您使用SHA-1,它只能从MD获得最多20字节(160位),从而进入密钥使用。
如果要使用需要较大密钥的密码(如AES-256),则需要在命令行上使用不同的哈希算法,例如SHA-256或SHA-512,这将为您填充整个32字节的密钥空间。
https://stackoverflow.com/questions/25831535
复制相似问题