泄露 AES 加密密钥的一部分有多不安全?

How unsafe is revealing a part of AES cryptographic key?

AES 对整个密钥保密是否至关重要,或者尽管不希望泄露 16 字符长密钥的前 4 个字符,但这是可能的?我想使用密钥的一部分作为随机数的生成器,并且好奇如果攻击者恢复该部分密钥会发生什么。我应该拆分原始密钥并分别使用这两个密钥,还是可以将原始密钥与它的一部分一起使用?换句话说:

function foo(data,key)
{
    smallKey = key.substr(0,Math.floor(key.length/4))
    return {
        out1: MD5(smallKey), // Could be cracked using rainbow tables
        out2: AES256CBC(data,key), // Uses the key containing the smallKey
    }
}

function boo(data,key)
{
    smallKey = key.substr(0,Math.floor(key.length/4))
    longKey = key.substr(smallKey.length - 1)
    return {
        out1: MD5(smallKey), // Could be cracked using rainbow tables
        out2: AES256CBC(data,longKey), // Uses the key not containing the smallKey
    }
}

我应该更喜欢使用使用最长密钥的 foo 还是更喜欢使用完全不同密钥的 boo?

如果 16 字节密钥中的 4 个字节被泄露,您将有效地将 AES 的强度降低到最多 96 位。可能有一些部分密钥攻击会进一步降低它,但 96 位将是强度的上限。

您绝对应该使用单独的密钥。如果您在某些限制条件下无法生成两个加密强度高且唯一的密钥,则可以使用 PBKDF2 来扩展 AES 密钥。

在这种情况下,您将从主密钥中派生出 2 个密钥。如果其中一个密钥泄露,则应该不可能再回头推导出主密钥。