3

I generate randomly IV value everytime I encrypt when doing AES/CBC.

private static IvParameterSpec getRandomIvParameterSpec() {
    byte[] iv = new byte[16];
    new SecureRandom().nextBytes(iv);
    return new IvParameterSpec(iv);
}

And I concat IV Value to cipher byte everytime I encrypt.

Is there any secure improvement if I hash (SHA-256) IV value before concat to cipher byte?

4

1 回答 1

4

SHA-256 是单的。你给它同样的输入,它就会给你同样的输出。然而,它不是满射的。如果m 1m 2都散列为h ,则即使您知道 |也无法得出m 1 = m 2的结论。1 | = | 2 | (两条消息的长度相同)。

因此,应用 SHA-256(或任何确定性函数)不会增加数据的熵。充其量,它不会减少它。换句话说:如果您的数据是 16 个纯随机字节,那么在您对其进行哈希处理后,它不会“超过纯随机”。而且,如果您的数据一开始并不是纯粹随机的,那么对其进行散列处理将无助于使其随机化。首先,您必须使用更好的熵源。

您没有提到的另一个问题是您当前有 16 个随机字节,但是如果您将它们放入 SHA-256 哈希函数中,您将得到 32 个字节。你打算使用哪些?如果你只使用每个第二个字节——由于注入性——即使你的输入是完全随机的并且散列函数是完美的,你也不会得到所有可能的位模式。(如果你这样做了,那么根据 pidgin hole 原则,这意味着另一半字节总是你选择的字节的函数。只有一个非常糟糕的哈希函数,SHA-256 当然不是, 会有这样的属性。)如果你尝试变得聪明并以某种“聪明”的方式组合字节,那么你很可能会让事情变得更糟。

所以简短的回答是:不要这样做。使用可用的最强的非确定性熵源生成尽可能多的随机字节并直接使用它们。

于 2017-01-06T03:26:23.953 回答