使用Java使用提供的密钥和iv解密openssl aes-256-cbc

use*_*629 14 java openssl

我一直在寻找一个Java代码示例来执行以下操作,但一直没有成功.我正在为我的特殊情况寻找解决方案.

使用"testtest"为密码生成密钥和IV:

openssl enc -aes-256-cbc -P 
salt=2855243412E30BD7
key=E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5
iv=629E2E1500B6BA687A385D410D5B08E3
Run Code Online (Sandbox Code Playgroud)

使用openssl命令在Linux上加密了一个文件(命名文本):

openssl enc -aes-256-cbc -K 
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv
629E2E1500B6BA687A385D410D5B08E3 -e -in text -out text_ENCRYPTED
Run Code Online (Sandbox Code Playgroud)

它可以使用以下方法成功解密:

openssl enc -aes-256-cbc -K 
E4A38479A2349177EAE6038A018483318350E7F5430BDC8F82F1974715CB54E5 -iv 
629E2E1500B6BA687A385D410D5B08E3 -d -in text_ENCRYPTED -out text_DECRYPTED
Run Code Online (Sandbox Code Playgroud)

我可以访问加密文件,盐,密钥和iv.我不相信我会收到密码.此外,我已经安装了无限强度的JCE政策.到目前为止,我只找到了另一个java程序进行加密并生成这些参数的示例.对于我的情况,我必须使用给我的salt,key和iv值来解密文件.这可能与Java有关吗?请记住我受这个配置的约束,非常感谢您的时间和帮助.

laz*_*laz 19

你应该使用这样的东西:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你是正确的@ways,我也会在以后遇到这个问题.我将使用正确的解码器更新示例. (3认同)
  • 答案中的decodeHex()中有一个微妙的错误.当编码值以'00'开头时,相应的字节就会消失.考虑使用像Apache Commons这样的知名库进行十六进制解码.(我在http://stackoverflow.com/questions/13990941/how-to-convert-hex-string-to-java-string上找到了一个例子) (2认同)