2016-04-20 10 views
1

Ich habe aes-js in Node verwendet, um mit AES-Zähler-Modus zu verschlüsseln/zu entschlüsseln.Deterministische AES-CTR in Java BouncyCastle?

Wie Sie in dem Beispiel sehen, verwende ich es ohne Auffüllen und ich kann angeben, welcher Block (0 in diesem Fall) ich beginnen möchte.

var aesCTR = new aesjs.ModeOfOperation.ctr(keyBytes, new aesjs.Counter(0)); 
var encryptedBytes = aesCTR.encrypt(plaintextBytes); 

Ich wollte das gleiche Verhalten, das oben in Java reproduzieren. Ich verwende BouncyCastle wie das Beispiel unten.

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 
    Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encrypted=cipher.doFinal(msgBytes); 

Aber diese Implementierung scheint nicht über die sames Werte als derjenige zu sein, ausgibt. Außerdem scheint es den Zähler bei jedem Lauf automatisch zu erhöhen (unerwünschtes Verhalten in diesem Fall).

Gibt es eine Möglichkeit, die Node JS-Implementierung mithilfe von Java anzupassen?

Antwort

1

Sie sollen das gleiche Verhalten erhalten, wenn Sie einen IV/anfänglichen ctr Wert liefern, die alle gleich Null ist zB:

byte[] iv = new byte[16]; 
Arrays.fill(iv, (byte)0);  

SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); 
Cipher cipher = Cipher.getInstance("AES/CTR/NoPadding", "BC"); 
cipher.init(Cipher.ENCRYPT_MODE, key, iv); 
byte[] encrypted=cipher.doFinal(msgBytes); 

So wie es im Code auf, ein zufälliges IV Sie jedes Mal erzeugt werden gesetzt Anruf init().

BTW, wenn Sie BC weglassen, erhalten Sie die Lager-AES-Implementierung