揭示AES加密密钥的一部分有多不安全?

时间:2015-03-04 17:28:47

标签: cryptography aes

AES是否必须保密整个密钥或者是否可能,尽管不希望透露例如16-char-long密钥的前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?

1 个答案:

答案 0 :(得分:2)

如果泄漏了16字节密钥的4个字节,则可以有效地将AES的强度降低到最多96位。可能存在一些部分密钥攻击会进一步减少它,但96位将是强度的上限。

您绝对应该使用单独的密钥。如果您有一些约束,您无法生成两个加密强且唯一的密钥,则可以使用PBKDF2来扩展AES密钥。

在这种情况下,您可以从主密钥中获取2个密钥。如果其中一个密钥泄露,则应该无法向后返回并导出主密钥。