Verschlüsseln, in Knoten-und Entschlüsselung in java

Ich habe eine encrypt-code in Java. Ich versuche port verschlüsseln Teil zu Knoten. Grundsätzlich Knoten wird die Verschlüsselung mit dem crypto-Modul, und dann Java wird die Entschlüsselung.

Hier ist, wie ich die Verschlüsselung in Java:

protected static String encrypt(String plaintext) {
    final byte[] KEY = {
            0x6d, 0x79, 0x56, 0x65, 0x72, 0x79, 0x54, 0x6f, 0x70,
            0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b
    };

    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        final SecretKeySpec secretKey = new SecretKeySpec(KEY, "AES");
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        final String encryptedString = Base64.encodeToString(
            cipher.doFinal(plaintext.getBytes()), Base64.DEFAULT);

        return encryptedString;
    } catch (Exception e) {
        return null;
    }
}

Hier ist, wie ich die Verschlüsselung in Knoten:

var crypto = require('crypto'),
    key = new Buffer('6d7956657279546f705365637265744b', 'hex'),
    cipher = crypto.createCipher('aes-128-ecb', key),
    chunks = [];

cipher.setAutoPadding(true);
chunks.push(cipher.update(
    new Buffer(JSON.stringify({someKey: "someValue"}), 'utf8'),
    null, 'base64'));
chunks.push(cipher.final('base64'));

var encryptedString = chunks.join('');

In Java, habe ich den string T4RlJo5ENV8h1uvmOHzz1KjyXzBoBuqVLSTHsPppljA=. Diese wird korrekt entschlüsselt. Allerdings in Knoten, bekomme ich al084hEpTK7gOYGQRSGxF+WWKvNYhT4SC7MukrzHieM= die ist offenbar anders, und so wird es nicht bekommen entschlüsselt korrekt.

Ich habe versucht, zu suchen für die Leute wer hat das gleiche problem wie ich, und diese github Frage ist die nächste, die ich finden kann. Wie bereits in diesem Thema, ich habe versucht mit openssl wie folgt:

$ echo -e '{"someKey": "someValue"}' | openssl enc -a -e -aes-128-ecb -K "6d7956657279546f705365637265744b"
T4RlJo5ENV8h1uvmOHzz1MY2bhoFRHZ+ClxsV24l2BU=

Den Ergebnissen, die ich bekam, war nahe genug, um die von java, aber immer noch anders:

T4RlJo5ENV8h1uvmOHzz1MY2bhoFRHZ+ClxsV24l2BU=  //openssl
T4RlJo5ENV8h1uvmOHzz1KjyXzBoBuqVLSTHsPppljA=  //java
al084hEpTK7gOYGQRSGxF+WWKvNYhT4SC7MukrzHieM=  //node

Das bringt mich zu der Frage, wie mache ich den Knoten Ausgabe denselben verschlüsselten string als mein java-code? Ich kann nur meinen code in Knoten, aber nicht in java.

  • Was Polsterung-format ist jede über? Woher wissen Sie, dass die Inhalte verschlüsselt werden, ist eigentlich identisch auf jeder Plattform (ich sehe kein Grund zu der Annahme, dass Knoten, die JSON.stringify Ausgabe ist identisch zu dem, was Sie sind, passing auf Java als plaintext)?
  • Java ist mit PKCS5Padding. Von dem, was ich gelesen habe, openssl ist auch das selbe (sorry, ich verlor die Verbindung). Für Knoten, ich bin mir nicht sicher, wie Sie angeben, die Polsterung, die ist, warum ich entschied sich für die Verwendung cipher.setAutoPadding(true). EDIT: Gefunden den link. Finden Sie die akzeptierte Antwort here
  • Die beiden Eingänge sind identisch. Wenn ich getestet, diese wieder, ich habe JSON.stringify's Ausgabe (manuell) java encrypt mit einige escape-Zeichen: encrypt("{\"someKey\":\"someValue\"}")
  • Sie müssen vergleichen, um den byte-arrays. Die gleich aussehenden text verschlüsselt werden kann, in unterschiedlichen bytes, die in unterschiedlichen Zeichensätzen, und die String#getBytes explizit von der Plattform abhängig-Zeichensatz. Dump die byte-arrays.
  • Ok, das dauerte eine Weile. Hier ist die gedumpten byte-array in Knoten produziert von Buffer(JSON.stringify({someKey:"someValue"})).toString('hex'): 7b22736f6d654b6579223a22736f6d6556616c7565227d. Hier ist die gedumpten byte-array in java, produziert von Arrays.toString("{\"someKey\":\"someValue\"}".getBytes())): [123, 34, 115, 111, 109, 101, 75, 101, 121, 34, 58, 34, 115, 111, 109, 101, 86, 97, 108, 117, 101, 34, 125]. Ich habe übersetzt die java-dump hex: [7b, 22, 73, 6f, 6d, 65, 4b, 65, 79, 22, 3a, 22, 73, 6f, 6d, 65, 56, 61, 6c, 75, 65, 22, 7d].
  • Ohne die mit Arrays, der java dump sieht wie folgt aus: 7b22736f6d654b6579223a22736f6d6556616c7565227d das ist das gleiche wie, wie es aussieht, wie in Knoten. Wahrscheinlich, das problem liegt woanders.
  • FYI, der Grund, Ihre openssl-Kommandozeile Ergebnis anders war ist, dass echo fügt einen Zeilenumbruch an die Daten. Je nach Plattform ist die echo -n (statt echo -e) hätte das Problem gelöst.

InformationsquelleAutor avendael | 2013-10-31
Schreibe einen Kommentar