我試圖創建一個使用java的AES 256 cbc加密,我需要模擬這個javascript代碼(我知道iv是相同的密鑰(被轉化爲16字節),這就是它是從網站我試圖登錄到使用Java)不同的輸出爲JAVA vs javascript AES 256 cbc
var recievedStr = "MDk4NTY1MDAyMjg2MTU1OA=="; //some
var key = CryptoJS.enc.Base64.parse(recievedStr);
var iv = CryptoJS.enc.Base64.parse(recievedStr);
var pw = "PASSWORD";
var encres = CryptoJS.AES.encrypt(pw, key, {iv:iv, keySize: 256, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7});
var finalStr = encres.toString();
finalStr將是:Su92ZXLm/MdOyruRnWDRqQ ==
我需要一個Java代碼,將輸出完全一樣從javascript輸出爲finalStr。 即時通訊使用充氣城堡。
String recievedStr = "MDk4NTY1MDAyMjg2MTU1OA==";
String pw = "PASSWORD";
AESEngine blockCipher = new AESEngine();
CBCBlockCipher cbcCipher = new CBCBlockCipher(blockCipher);
BufferedBlockCipher cipher = new PaddedBufferedBlockCipher (cbcCipher);
byte[] key = encodeBase64(recievedStr);
byte [] iv = java.util.Arrays.copyOf(key,16);
byte[] input = pw.getBytes();
ParametersWithIV pwIV= new ParametersWithIV(new KeyParameter(key),iv);
cipher.init(true, pwIV);
byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
int outputLen = cipher.processBytes(input, 0, input.length, cipherText, 0);
try
{
cipher.doFinal(cipherText, outputLen);
}
catch (CryptoException ce)
{
System.err.println(ce);
}
System.out.println(new String(Base64.encodeBase64(cipherText)));
這將輸出:qEGQ1PC/QKxfAxGBIbLKpQ ==
,而我可以把它解密到原來的輸入,這不是我想要的。 我需要我的java代碼來輸出JavaScript所做的。 我對如何解決這個問題留下了0個想法。
謝謝。
編輯:問題解決了,我不得不將接收到的字符串解碼爲base64,而不是編碼它。
不應該是decodeBase64(recievedStr)而不是encodeBase64(recievedStr)? – AdrianEddy
這就是它! thx – user1827217
解碼時,「MDk4NTY1MDAyMjg2MTU1OA ==」的長度爲16個字節,這意味着它是AES-128而不是AES-256。當提供實際密鑰時,'keySize'屬性被忽略。不過,這將是錯誤的,因爲'keySize:256/32'將是定義密鑰大小的正確方式。 –