2016-04-06 23 views
0

私は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にデコードする必要がありました。

+1

encodeBase64(recievedStr)の代わりにdecodeBase64(recievedStr)を使用しないでください。 – AdrianEddy

+0

それはまさにそれでした! thx – user1827217

+0

"MDk4NTY1MDAyMjg2MTU1OA =="はデコードされたときに長さが16バイトで、AES-128ではなくAES-256であることを意味します。実際のキーが提供されるとき、 'keySize'プロパティは無視されます。それにもかかわらず、 'keySize:256/32'がキーサイズを定義する正しい方法であるため、間違っています。 –

答えて

0

あなたは正しい軌道にいると思います。しかし、私はあなたがAES-256ではなくAES-128で走っていると思います。もしあなたがJava 256-bit AES Password-Based Encryptionを見ていれば、役に立つかもしれないと思うかもしれません。

+0

コードサンプルでaes-256を実行しています(デフォルトのパディングはpkc7、cbcモードです)。 – user1827217

関連する問題