AES-Verschlüsseln mit CryptoJS

Muss ich implementieren Sie AES-Verschlüsselung mit JavaScript. Verwendet AES/CBC/NoPadding-Modus und erstellt eine Methode, um 16 Länge blockiert. Ich habe es bereits gelöst, die mit Java. Es sieht so aus:

public static String encrypt(byte[] key, byte[] initVector, String value) {
    try {
        IvParameterSpec iv = new IvParameterSpec(initVector);
        SecretKeySpec skeySpec = new SecretKeySpec(key, "AES");
        Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
        byte[] encrypted = cipher.doFinal(completeBlocks(value));
        return Base64.encodeBase64String(encrypted);
    } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {
        System.out.println("Error: " + ex);
    }

    return null;
}

/**
 * Completes 16 lenght blocks
 *
 * @param message
 *
 *
 */
static byte[] completeBlocks(String message) {
    try {

        int bytesLenght = message.getBytes("UTF-8").length;
        if (bytesLenght % 16 != 0) {
            byte[] newArray = new byte[bytesLenght + (16 - (bytesLenght % 16))];
            System.arraycopy(message.getBytes(), 0, newArray, 0, bytesLenght);
            return newArray;
        }

        return message.getBytes("UTF-8");

    } catch (UnsupportedEncodingException ex) {
        System.out.println("" + ex);
    }
    return null;
}

public static void main(String[] args) {

    String key = "253D3FB468A0E24677C28A624BE0F939";
    String strToEncrypt = "My Secret text";
    final byte[] initVector = new byte[16];
    String resultado = encrypt(new BigInteger(key, 16).toByteArray(), initVector, strToEncrypt.trim());
    System.out.println("ENCRYPTED:");
    System.out.println(resultado);
}

Eingänge mit key = 253D3FB468A0E24677C28A624BE0F939, strToEncrypt = "My Secret text" und ceros IV. Es wirft

7StScX3LnPUly/VNzBes0w==

Ich Weiß, dass es die gewünschte Ausgabe. Es ist richtig!
Ich habe versucht, zu replizieren diese mit JavaScript. Ich verwendet CryptoJs Bibliothek. Aber ich war nicht in der Lage zu produzieren, die gleiche Java-Ausgabe. Ich habe versucht:

var text = "My Secret text";
var key = CryptoJS.enc.Base64.parse("253D3FB468A0E24677C28A624BE0F939");
var iv  = CryptoJS.enc.Base64.parse("                ");
var encrypted = CryptoJS.AES.encrypt(text, key, {iv: iv});
console.log(encrypted.toString());

var decrypted = CryptoJS.AES.decrypt(encrypted, key, {iv: iv});
console.log(decrypted.toString(CryptoJS.enc.Utf8));

Mit den gleichen Eingaben, bekomme ich De+CvPVIyiBX2//EE6gXTg== als Ausgabe. Was mache ich falsch? Wie bekomme ich Java-Ausgabe? Vielen Dank!!

Es sieht cryptojs nicht unterstützt CBC-Modus.
Auch dein Schlüssel wird als hex und nicht in base64 kodiert, und geben Sie Leerzeichen um base64 ist nicht das gleiche wie ein array von Nullen.
Ich denke, du hast Recht!! Es scheint leider CBC-Modus wird nicht unterstützt. Ich fand dieses hier: github.com/ricmoo/aes-js . Wie es aussieht, unterstützt der CBC-Modus. Ich werde versuchen, dass!! Vielen Dank!
Sergio, es stellt sich heraus, es unterstützt CBC. Es ist implementiert in github.com/sytelus/CryptoJS/blob/... , nicht in mode-cbc.js wie einige andere Modi.
Ich überprüfe es!!!! U sieht toll aus! Ich werde versuchen, dass! Dank

InformationsquelleAutor Sergio David Romero | 2017-01-16

Schreibe einen Kommentar