私はJavaを使用してAES 256 cbc暗号化を作成しようとしていますが、私はこのjavascriptコードを正確にエミュレートする必要があります(ivは16バイトに切り捨てられます)私の出力は以下となりますが、まったく同じJavaコードを作成する必要がありSu92ZXLm/MdOyruRnWDRqQ ==JAVA対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になります)、それは私が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の==
私は元の入力にそれを解読することができますが、それは私が欲しいものではありません。 Javascriptが行ったことを正確に出力するために私のJavaコードが必要です。 私はこのアプローチにどのようにしてアイデアが残っていますか?
ありがとうございました。
EDIT:問題が解決しました。受信した文字列をエンコードするのではなく、base64にデコードする必要がありました。
encodeBase64(recievedStr)の代わりにdecodeBase64(recievedStr)を使用しないでください。 – AdrianEddy
それはまさにそれでした! thx – user1827217
"MDk4NTY1MDAyMjg2MTU1OA =="はデコードされたときに長さが16バイトで、AES-128ではなくAES-256であることを意味します。実際のキーが提供されるとき、 'keySize'プロパティは無視されます。それにもかかわらず、 'keySize:256/32'がキーサイズを定義する正しい方法であるため、間違っています。 –