使用 Java 使用提供的密钥和 iv 解密 openssl aes-256-cbc
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15594518/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Using Java to decrypt openssl aes-256-cbc using provided key and iv
提问by user2203629
I have been searching for a Java code example to do the following but have been unsuccessful. I'm looking for a solution for my particular situation.
我一直在寻找一个 Java 代码示例来执行以下操作,但没有成功。我正在为我的特定情况寻找解决方案。
A key and IV have been generated using "testtest" for a password:
使用“testtest”作为密码生成了密钥和IV:
openssl enc -aes-256-cbc -P
salt=2855243412E30BD7
key=E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5
iv=629E2E1500B6BA687A385D410D5B08E3
A file(named text) has been encrypted on Linux using openssl command:
在 Linux 上使用 openssl 命令加密了一个文件(命名文本):
openssl enc -aes-256-cbc -K
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv
629E2E1500B6BA687A385D410D5B08E3 -e -in text -out text_ENCRYPTED
It can be decrypted successfully using:
可以使用以下方法成功解密:
openssl enc -aes-256-cbc -K
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv
629E2E1500B6BA687A385D410D5B08E3 -d -in text_ENCRYPTED -out text_DECRYPTED
I have access to the encrypted file, the salt, the key and the iv. I do not believe I'm going to receive the password. Also, i have installed the unlimited strength JCE policy. So far I have only found examples where another java program does the encryption and generates these parameters. For my case I must use the salt, key and iv values given to me to decrypt a file. Is this possible with Java? Please remember I'm bound by this configuration, thank you very much for your time and help.
我可以访问加密文件、盐、密钥和 iv。我不相信我会收到密码。此外,我已经安装了无限强度 JCE 策略。到目前为止,我只找到了另一个 Java 程序进行加密并生成这些参数的示例。对于我的情况,我必须使用提供给我的 salt、key 和 iv 值来解密文件。这可以用 Java 实现吗?请记住我受此配置的约束,非常感谢您的时间和帮助。
回答by laz
You should use something like this:
你应该使用这样的东西:
InputStream cipherInputStream = null;
try {
final StringBuilder output = new StringBuilder();
final byte[] secretKey = javax.xml.bind.DatatypeConverter.parseHexBinary("E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5");
final byte[] initVector = javax.xml.bind.DatatypeConverter.parseHexBinary("629E2E1500B6BA687A385D410D5B08E3");
final Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "AES"), new IvParameterSpec(initVector, 0, cipher.getBlockSize()));
cipherInputStream = new CipherInputStream(new FileInputStream("text_ENCRYPTED"), cipher);
final String charsetName = "UTF-8";
final byte[] buffer = new byte[8192];
int read = cipherInputStream.read(buffer);
while (read > -1) {
output.append(new String(buffer, 0, read, charsetName));
read = cipherInputStream.read(buffer);
}
System.out.println(output);
} finally {
if (cipherInputStream != null) {
cipherInputStream.close();
}
}