cryptojs aes-256-Verschlüsselung und java-Entschlüsselung

Ich verschlüsselte Nachricht mit cryptojs aes-256 auf der client-Seite. Konnte aber nicht entschlüsseln, die es auf der java-Seite. Zuerst gebe ich den key direkt auf der server-Seite als hex, dann konvertieren von hex in java bytearray. Es hat nicht funktioniert. Dann gebe ich den Satz, salt, iv, um den server als hex. Erstellen Sie dann die-Taste. Es funktioniert immer noch nicht. Es ist immer zu beschweren Länge des Schlüssels ist nicht richtig.

Client-Seite:

var salt = CryptoJS.lib.WordArray.random(16);
var salt_hex = CryptoJS.enc.Hex.stringify(salt);

var iv = CryptoJS.lib.WordArray.random(256/32);
var iv_hex = CryptoJS.enc.Hex.stringify(iv);


var key = CryptoJS.PBKDF2(secret, salt, { keySize: 256/32, iterations: 10 });
var key_hex=CryptoJS.enc.Hex.stringify(key);

var encrypted = CryptoJS.AES.encrypt(plaintext, key, { iv: iv });    

var encryptedtxt = secret+":"+salt_hex+":"+iv_hex+":"+encrypted.ciphertext.toString(CryptoJS.enc.Base64)+":"+key_hex;

Server-Seite:

    if (encrypted != null)
    {
        //Get the passphras, salt, IV and msg
        String data[] = encrypted.split(":");
        String passphrase = data[0];
        String salt_hex = data[1];
        String iv_hex = data[2];
        String msg64 = data[3];
        String jskey_hex = data[4];
        byte[] jskey = hexStringToByteArray(jskey_hex);
        byte[] iv = hexStringToByteArray(iv_hex);
        byte[] salt = hexStringToByteArray(salt_hex);
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] msg = decoder.decodeBuffer(msg64);

        try {
             //theClear = AES.decrypt(encrypted);
            /* Decrypt the message, given derived key and initialization vector. */
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
            KeySpec spec = new PBEKeySpec(passphrase.toCharArray(), salt, 10, 256/32);
            SecretKey key = new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
            String plaintext = new String(cipher.doFinal(msg), "UTF-8");
        } catch (Exception e) {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }
  • Wenn "die Schlüssellänge ist nicht in Ordnung", dann ist dein problem vielleicht mit führenden Nullen. Hat die stringify() Methode convert [0x01, 0x02, 0x03] zu "123"? Ihren Entschlüsselungs-code wahrscheinlich meint "010203". "123" wird wahrscheinlich geben eine zwei-byte-array, das [0x12, 0x03], die nicht der Eingabe entsprechen und die falsche Länge. Das ist fatal für einen Krypto-Schlüssel.
  • 256/32 == 8, während unterstützt Schlüssel für AES sind 16, 24 oder 32 bytes. Sie haben beide ändern JS und Java-code zu verwenden-Taste mindestens 16 bytes.
  • rossum - die hex-stringified-Taste ist wie 010203. Aber ich weiß hex Dekodierung auf der java-Seite zu byte-array. Ich Frage mich, wie das Wort array an JS zu entsprechen, die mit byte-Arrays auf java?
  • Ihre IV wird auch die Größe falsch in der CryptoJS. AES nutzt 128-bit-Blöcken, und der IV sollte daher eine 128-bit-als auch.
  • Owlstead - Sie haben völlig Recht über die IV. Zu ändern.
InformationsquelleAutor rickcoup | 2014-06-25
Schreibe einen Kommentar