2017-10-22 2 views
1

Ich versuche Javascript zu schreiben, um die Ausgabe von diesem Java-Code entsprechen:Encrypt in Javascript entsprechen Java

Java:

import java.util.Base64; 

public class Enc2 { 
    public static void main (String[] arg) { 
     System.out.println(encryptSomeNumber("1234567812345678")); 
    } 

    public static String encryptSomeNumber(final String SomeNumber){ 
     String encryptedSomeNum = ""; 
     String ALGO = "AES"; 

     try { 
      String myKey = "DLDiGPqGysAow3II"; 
      byte[] keyBytes = myKey.getBytes("UTF-8"); 

      java.security.Key encryptkey = new javax.crypto.spec.SecretKeySpec(keyBytes, ALGO); 
      javax.crypto.Cipher c; 
      c = javax.crypto.Cipher.getInstance(ALGO); 
      c.init(javax.crypto.Cipher.ENCRYPT_MODE, encryptkey); 
      byte[] encVal = c.doFinal(SomeNumber.getBytes()); 

      byte[] encodedBytes = Base64.getEncoder().encode(encVal); 
      String s = new String(encodedBytes); 

      encryptedSomeNum = s; 
     } catch (Exception e) { 
      System.out.println("error when encrypting number"); 
      return encryptedSomeNum; 
     } 
     return encryptedSomeNum; 
    } 
} 

Ausgang: Wrs66TuAIxYe + M4fqyyxtkyMFkWGwx9i45 + oQfEA4Xs =

Javascript dass ich bisher (NodeJS v8.7.0) haben:

let crypto = require('crypto'); 

let algorithm = 'aes-128-ecb'; 
let password = 'DLDiGPqGysAow3II'; 

function encrypt(buffer){ 
    let cipher = crypto.createCipher(algorithm, password) 
    let crypted = Buffer.concat([cipher.update(buffer), cipher.final()]); 
    return crypted; 
} 

let cyphertext = encrypt(new Buffer("1234567812345678", "utf8")) 
console.log(cyphertext.toString('base64')); 

Ausgang: m1jnKjBbKu + m/zsf9DBTMo3NL 4E035l0EailFjt/qjo =

Kann jemand sehen, was ich hier vermisse? Etwas mit PKCS-Padding?

Antwort

2

Nein, die Polsterung ist gleich. Das Problem ist, dass es zwei createCipher Methoden gibt. Man verwendet ein Passwort und eine Schlüsselableitungsfunktion über das Passwort - das ist das, das Sie jetzt benutzen. Der andere verwendet Schlüssel und IV. Natürlich verwendet die EZB keine IV, daher müssen Sie möglicherweise einen IV-Wert angeben, der dann nicht verwendet wird.

+0

Danke. Also ist SecretKeySpec die Schlüsselableitungsfunktion in diesem Fall? –

+0

Nein, in Java gibt es keine Schlüsselableitung. Der Schlüssel ist die ASCII/UTF-8-Kodierung von "DLDiGPqGysAow3II". 'SecretKeySpec' ist nur ein Wrapper dafür. –

+0

Danke für die Beratung Maarten. Ich wechselte in den CBC-Modus und verwendete eine leere IV und übergab diese an crypto.createCipheriv(). Dann musste dem Klartext 16 0x10 Bytes hinzugefügt werden, um die passende Ausgabe zu erhalten. Warum fügt Java 16 0x10 Bytes hinzu? –

Verwandte Themen