我想尝试加密文件并使用以下堆栈溢出响应。然而,在测试初始化向量时,我发现它只影响前 16 个字节。
当我将一个空的 iv 传递给解密密码(前 16 个字节除外)时,数据被意外解密。 [我假设图书馆没有坏,而且我做的事情不正确;但这是一个可怕的想法,其他人可能在同一条船上却没有意识到这一点。]
例子:
Initial bytes ..... 2222222222222222222222222222222222222222222222222222
Encrypted bytes ... b35b3945cdcd08e2f8a65b353ff754c32a48d9624e16b616d432
Decrypted bytes ... 3c4154f7f33a2edbded5e5af5d3d39b422222222222222222222
Run Code Online (Sandbox Code Playgroud)
问:为什么整个解密没有失败?
推测:我想我可以通过一次迭代 16 个字节的数据并通过对先前加密的 16 个字节块进行散列来更新每轮的 iv 来进行加密。然而,这似乎是我期望图书馆做的繁忙的工作。我本来希望提出实施指南的专家会提到它。但我只是抓住了这里的稻草。据我所知,也许安全社区只担心第一个区块的黑客攻击。
注意:刚才我发现了一个 5.5 年前的堆栈溢出帖子,它发现了同样的问题;不幸的是,它仍然没有回应。
package test;
import java.security.AlgorithmParameters;
import java.security.spec.KeySpec;
import java.util.Formatter;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
/*
* Issue: Using "AES/CBC/PKCS5Padding" encryption, the Initialization Vector
* appears to only affect the first block?!?
*
* Example Output
* iv …Run Code Online (Sandbox Code Playgroud)