問題描述
我有一個使用 openssl 工具進行加密的 bash 腳本.
I have a bash script that uses the openssl tool to encrypt.
#!/bin/bash
key128="1234567890123456"
iv="1234567890123456"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
以及嘗試解密腳本生成的文件的 Java 代碼.
And Java code that tries to decrypt the file produced by the script.
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 代碼是否不匹配?
When I run the Java code, it doesn't print anything. Is there a mismatch between the script and Java code?
第二個問題是我是否可以將其重寫為使用密碼而不是密鑰/iv.為了做到這一點,有沒有辦法知道 openssl 用于給定密碼的 iv?
A secondary question is whether I can rewrite this to use password instead of key/iv. In order to do that, is there a way to know the iv that openssl uses for a given password?
推薦答案
正如上面提到的@Polynomial,bash 腳本和 Java 代碼之間的鍵和 iv 不匹配.將 bash 腳本更改為以下內容即可解決問題.
As @Polynomial mentioned above, the keys and iv's don't match between the bash script and Java code. Changing the bash script to the following solves the problem.
#!/bin/bash
key128="01020304050607080900010203040506"
iv="01020304050607080900010203040506"
openssl enc -aes-128-cbc -in test -out test.enc -K $key128 -iv $iv
如果按以下方式執行openssl,它將使用密碼,并打印使用的密鑰和iv.在上面的 Java 程序中,key 和 iv 可以被替換.
If openssl is executed in the following way, it will use a password, and print the key and iv used. That key and iv can be substituted in the Java program above.
openssl enc -nosalt -aes-128-cbc -in test -out test.enc -p
這篇關于使用 openssl 命令行工具進行 AES 加密,并在 Java 中解密的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!