問題描述
我正在嘗試編寫一個簡單的 Java 程序,該程序將使用 AES-256-CBC
加密純文本.有課:
I'm trying to write a simple Java program that will encrypt plain text with AES-256-CBC
. There is class:
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AesCBC {
private byte[] key;
private byte[] iv;
private static final String ALGORITHM="AES";
public AesCBC(byte[] key, byte[] iv) {
this.key = key;
this.iv = iv;
}
public byte[] encrypt(byte[] plainText) throws Exception{
SecretKeySpec secretKey=new SecretKeySpec(key,ALGORITHM);
IvParameterSpec ivParameterSpec=new IvParameterSpec(iv);
Cipher cipher=Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,secretKey,ivParameterSpec);
return cipher.doFinal(plainText);
}
public byte[] getKey() {
return key;
}
public void setKey(byte[] key) {
this.key = key;
}
public byte[] getIv() {
return iv;
}
public void setIv(byte[] iv) {
this.iv = iv;
}
}
還有可能的用法:
byte[] test="a".getBytes();
byte[] key=DatatypeConverter.parseHexBinary("b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7");
byte[] iv=DatatypeConverter.parseHexBinary("064df9633d9f5dd0b5614843f6b4b059");
AesCBC aes=new AesCBC(key,iv);
try{
String result=DatatypeConverter.printBase64Binary(aes.encrypt(test));
System.out.println(result);
}catch(Exception e){
e.printStackTrace();
}
我的輸出是VTUOJJp38Tk+P5ikR4YLfw==
,但是當我執(zhí)行這個命令時:
My output is VTUOJJp38Tk+P5ikR4YLfw==
, but when I execute this command:
/usr/bin/openssl enc -A -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059" <<< "a"
我得到的東西與 Java 程序(Y65q9DFdR3k1XcWhA2AO2Q==
)不同.可悲的是,我不知道為什么結果不一樣,因為我使用相同的算法和相同的密鑰和 iv.這是否意味著我的 Java 程序不能正常工作?任何幫助將不勝感激.
I get something diffrent than in Java program( Y65q9DFdR3k1XcWhA2AO2Q==
). Sadly I have no idea why results aren't the same since I use the same algorithm with the same key and iv. Does it mean my Java program doesn't work properly? Any help would be appreciated.
推薦答案
兩種方式都可以正常工作,但是你加密的是不同的東西.
Both ways are working correctly, however you are encrypting different things.
此處的字符串語法 (<<<
) 在字符串中添加換行符.所以Java輸出是加密a"的結果,命令行輸出是加密a
"的結果(即字符a
后跟換行符).
The here string syntax (<<<
) adds a newline to the string. So the Java output is the result of encrypting "a", and the command line output is the result of encrypting "a
" (i.e. the character a
followed by a newline).
從命令行試試這個:
printf "a" | /usr/bin/openssl enc -aes-256-cbc -base64 -K "b38b730d4cc721156e3760d1d58546ce697adc939188e4c6a80f0e24e032b9b7" -iv "064df9633d9f5dd0b5614843f6b4b059"
結果是 VTUOJJp38Tk+P5ikR4YLfw==
,與您的 Java 結果匹配.
the result is VTUOJJp38Tk+P5ikR4YLfw==
, matching your Java result.
這篇關于Java 中的 AES-256-CBC的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網(wǎng)!