我正在编写一个应用程序,其安全性基于PolarSSL 包提供的crypt_and_hash 示例。在示例中,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?