我有一个使用openssl工具加密的bash脚本。使用openssl命令行工具进行AES加密,并使用Java解密
#!/bin/bash
key128="123456789"
iv="123456789"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
而试图解密脚本产生的文件的Java代码。
public class crypto {
public static void main(String[] args)
{
try {
File f = new File("test.enc");
Cipher c;
Key k;
String secretString = "01020304050607080900010203040506";
String ivString = "01020304050607080900010203040506";
byte[] secret = hexStringToByteArray(secretString);
byte[] iv = hexStringToByteArray(ivString);
c = Cipher.getInstance("AES/CBC/PKCS5Padding");
k = new SecretKeySpec(secret, "AES");
c.init(Cipher.DECRYPT_MODE, k, new IvParameterSpec(iv));
CipherInputStream cis = new CipherInputStream(new FileInputStream(f), c);
BufferedReader br = new BufferedReader(new InputStreamReader(cis));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
} catch (IOException e) {
System.out.println(e.getMessage());
} catch (NoSuchAlgorithmException e) {
System.out.println(e.getMessage());
} catch (NoSuchPaddingException e) {
System.out.println(e.getMessage());
} catch (InvalidKeyException e) {
System.out.println(e.getMessage());
} catch (InvalidAlgorithmParameterException e) {
System.out.println(e.getMessage());
}
}
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len/2];
for (int i = 0; i < len; i += 2) {
data[i/2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
}
33,1 71%
当我运行Java代码时,它不会打印任何东西。脚本和Java代码之间是否存在不匹配?
第二个问题是我是否可以重写此密码而不是键/ iv。为了做到这一点,有没有办法知道openssl使用给定密码的iv?
首先,“123456789”与“0x01020304050607080900010203040506”不一样。你的IV也一样。 – Polynomial
openssl将每个字符视为十六进制值,而Java代码正在查看一对字符。 – Ravi
是的,0x12和0x0102不一样。 – Polynomial