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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich kapiert. Durch die Standard-JRE 7 nicht unterstützt 256-bit-Schlüssel. Ich hatte Sie zum herunterladen der neuen Gläser aus http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html und überschreiben Sie Sie in das jre/lib/security". Sie wird zu tun haben, die ähnliche Sache für die Websphere 6 oder 7. Wenn Sie es nicht tun, werden Sie aufgefordert, "illegal key size". Ich habe auch gesehen, die "illegal key size x", wobei x eine Zahl ist. Das bedeutet, dass der Schlüssel die Größe ist nicht richtig. Nachfolgend werden die code.
Server-Seite:
Client: