1

我正在编写一个应用程序,其安全性基于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?

4

2 回答 2

1

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

如果该密钥不是完全随机的,则可以使用密钥强化来使暴力破解密钥值(或密码值)变得更加困难。它是由循环使用 IV (实际上是salt)和密码散列函数中的密钥来实现的。如果您收到 20 个字节,这很可能是 SHA-1,因为它有 160 位输出。

该算法不提供密钥扩展。密钥扩展是您正在查看的内容:将计算出的随机数分布在 X 位上。它相对容易实现;可能最好的办法是看一下 HKDF 的密钥扩展算法。

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

请注意,键拉伸一词并不总是用来表示相同的东西

于 2014-09-14T11:49:00.683 回答
0

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

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

于 2014-09-16T11:00:18.817 回答