我试图创建一个使用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'将是定义密钥大小的正确方式。 –