2016-04-06 20 views
0

Ich versuche, eine AES 256 cbc-Verschlüsselung mit Java zu erstellen, und ich muss GENAU diesen Javascript-Code emulieren (ich weiß, dass die iv ist das gleiche wie der Schlüssel (auf 16 Bytes) das ist, wie es von der Website ist versuche ich in mit Java)verschiedene Ausgabe für 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 wird zu protokollieren: Su92ZXLm/MdOyruRnWDRqQ ==

ich brauche, um einen Java-Code vorzunehmen, die Ausgabe genau die gleichen Ausgabe als finalStr aus dem Javascript. Ich benutze Hüpfburg dafür.

 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))); 

dieser Wille Ausgabe: qEGQ1PC/QKxfAxGBIbLKpQ ==

, während ich es auf den ursprünglichen Eingang entschlüsseln kann, das ist nicht, was ich will. Ich brauche meinen Java-Code, um genau das auszugeben, was das Javascript tat. Ich habe noch 0 Ideen, wie ich das angehen soll.

Danke.

EDIT: Problem wurde gelöst, ich musste die empfangene Zeichenfolge zu Base64 dekodieren, anstatt es zu kodieren.

+1

sollte es nicht decodeBase64 (receivedStr) anstelle von encodeBase64 (receivedStr) sein? – AdrianEddy

+0

das war es genau! thx – user1827217

+0

"MDk4NTY1MDAyMjg2MTU1OA ==" ist 16 Bytes lang, wenn decodiert, was bedeutet, dass es AES-128 und nicht AES-256 ist. Die Eigenschaft 'keySize' wird ignoriert, wenn ein tatsächlicher Schlüssel bereitgestellt wird. Trotzdem wäre es falsch, da 'keySize: 256/32' die richtige Art ist, die Schlüsselgröße zu definieren. –

Antwort

0

Ich denke, Sie sind auf dem richtigen Weg. Aber ich denke, Sie laufen mit AES-128 statt AES-256. Wenn Sie einen Blick auf Java 256-bit AES Password-Based Encryption werfen, denke ich, dass Sie vielleicht etwas Nützliches finden können.

+0

im Ausführen von aes-256 im Codebeispiel (Standard-Padding ist PKC7, CBC-Modus). – user1827217