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 alsplaintext
)? - 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) javaencrypt
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 vonArrays.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 dieecho -n
(stattecho -e
) hätte das Problem gelöst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schließlich fand ich die Lösung zu meinem problem. Dank diese Kerl. Der Schlüssel zur Lösung ist der Initialisierungsvektor. Zitiere das wesentliche:
Hier ist, wie die Lösung aussieht:
createCipher
verwendet ein Kennwort, von dem der Schlüssel ist abgeleitet (der IV abgeleitet ist, aber das wird ignoriert, EZB). DiecreateCipheriv
Methode jedoch direkt verwendet einen Schlüssel als Byte. Also die Lösung ist richtig (+1), aber der Grund, warum es korrekt ist das nicht 😛createCipher
undcreateCipheriv
gefangen mich zu (ebenso wie die Tatsache, dass in Java"AES"
impliziert EZB in der Erwägung, dass in der Node/OpenSSL"aes128"
impliziert CBC). Dank @MaartenBodewes für den Tipp.createCipheriv
mitnew Buffer('')
stattcreateCipher
den Unterschied gemacht... !Dachte, ich poste einen vollständigen CBC-Beispiel aus der sowohl die Knoten-und java-Seiten(256 statt 128):
Wenn Sie die java.Sicherheit.InvalidKeyException haben Sie die Installation der Java Cryptography Extension (JCE) unlimited strength jurisdiction policy-Dateien:
Java 6 link
Java 7 link
Java 8 link
Java verschlüsseln und Entschlüsseln.
Knoten beide Richtungen unten:
skc
vorhanden in java-codeencrypt
- Funktion, die zweite in Knoten-code nach der änderunghex
zubase64
es unter anderen, vielen Dank, Mann bdw cheers.Beispiel arbeiten die Verschlüsselung in Node.Js und Entschlüsselung in Java:
verschlüsseln:
entschlüsseln: