2016-06-21 11 views
-2

Update: Ich habe endlich geschafft, den gesamten Java-Code wie für den Third-Party-Service erforderlich neu zu erstellen. Ich muss hinzufügen, dass einige der verwendeten Bibliotheken veraltet sind, aber ich kann nichts tun, weil das ist, was die andere Seite benutzt, und ich muss es einhalten.Verschlüsselung und Codierung (AES, UTF-8 und base64) Code-Konvertierung von JAVA zu node.js mit unterschiedlichen Ergebnissen

Java-Code

SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), 
    "AES"); 
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); 
    cipher.init(1, secretKeySpec); 

    byte[] aBytes = cipher.doFinal(inputString.getBytes()); 

Eingabe-Taste: xxxxxxxxyyyyyyyy
Eingabetext: maryhadalittlelamb

Ausgang: Z22GETg3Anl92% 2BoyqdVWs9haQveaZxkDn8sQYP08iCY% 3D

-Code

node.js

var cipher = crypto.createCipher('aes-128-ecb', key); 
var encryptedPassword = cipher.update(text, 'utf8', 'base64'); 
encryptedPassword += cipher.final('base64'); 
console.log(encryptedPassword); 

Eingabe-Taste: xxxxxxxxyyyyyyyy
Eingabetext: maryhadalittlelamb

Ausgang: mnqrpA2eqAhmseTrkBtH3YSGMoFs + ECPUamVd8/bgAQ =

Der Ausgang für gleiche input und der Schlüssel ist für beide unterschiedlich. Tatsächlich ist die node.js anders, aber die base64 sieht trotzdem identisch aus.

Ich bin ziemlich neu zu diesen Dingen, deshalb habe ich mein Mai verloren.

+0

Sie müssen genau herausfinden, was 'SecretKeySpec' ausgibt. Wenn Sie jedem AES-Kern die gleichen Schlüsselbytes geben und dieselbe Schlüsselgröße und denselben Schlüsselmodus wählen, sollten sie kompatibel sein. beiseite: ecb ist ein schwacher Modus, verwenden Sie etwas besser, wenn möglich. – dandavis

+0

@dandavis Der Java-Code gehört zum Dienst eines Drittanbieters, der nicht unter meiner Kontrolle steht, daher muss ich die Daten so senden, wie sie wollen. Was und wie muss ich mit/in SecretKeySpec überprüfen? –

+0

Ich rate es eine KDF, und Sie müssen in der Lage sein, die Eingabe> Ausgabe in Knoten für die AES zu reproduzieren, um die gleichen tatsächlichen Schlüssel in beiden Umgebungen zu verwenden. – dandavis

Antwort

1

In base64 codieren Sie die Eingabezeichenfolge, bevor Sie verschlüsseln, es muss die Ausgabe von der Verschlüsselung sein, die Base64 codiert werden muss.

Sie benötigen auch einen Anruf an cipher.final(..) nach cipher.update(..), um den Verschlüsselungsvorgang abzuschließen. Denken Sie daran, die Ausgabe von beiden zu erfassen.

Zusätzlich beachten Sie bitte, dass .

+0

Arhh .. stellt sich heraus, dass die 'final (..)' Methode in js keine Daten zu verschlüsseln akzeptiert (wie es in Java tut) .. so dass Sie beide ein Update (..) und ein final (.. .) Anruf in js –

+0

Danke Ebbe M. für Ihre Zeit, wirklich geschätzt. Trotzdem funktioniert es nicht. http://pastebin.com/ap4Dk1ti Bitte werfen Sie einen Blick auf diese Pastebin, lassen Sie mich wissen, wenn ich etwas falsch gemacht habe. –

+0

Werfen Sie einen Blick [hier] (http://stackoverflow.com/questions/20247806/node-js-crypto-class-returning-differences-results-with-updated-version) –