2016-03-25 10 views
0

Mit dem folgenden Code, ich bin AES verschlüsseln Operation, ich gebe die gleiche Eingabe an verschiedenen Instanzen, aber ich bekomme verschiedene Cipher. Warum passiert das?Erzeugt AES/CBC/NoPadding zwei unterschiedliche Cipher-Texte, obwohl die Eingabe gleich ist?

public static byte[] encrypt(byte[] plainText, byte[] key) 
    { 
    byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16); 
    SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES"); 
    Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(plainText); 
    return cipherText; 
} 

Eingang ist

encrypt(new byte[]{-17, -60, -70, 24, 80, 35, 2, -62, -79, 19, -55, -50, -62, -69, -80, -96} ,new byte[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}); 

An einem Beispiel Chiffre ist - [0, 91, -96, 80, -44, -93, 107, 62, 4, -10, 103, 119 , 109, 4, 25, 68]

Ein anderer Fall ist - [87, 109, 20, 69, 18, 6, 103, 92, -57, 62, -41, -103, -18, -19, 74, 87]

Was kann der Grund sein?

+2

Verwenden Sie den CBC-Modus nicht zusammen mit "NoPadding", es sei denn, Ihre Datengröße ist immer ein Vielfaches von 16 Byte - es funktioniert nicht. –

Antwort

1

CBC-Modus erfordert eine IV und die init Verfahren kann ein zufälliges IV erzeugen, wenn keines angegeben ist (von the documentation):

Wenn diese Chiffre jeder Algorithmus-Parameter erfordert, die nicht von der gegebenen Schlüssel abgeleitet werden kann, die Die zugrundeliegende Cipherimplementierung soll die erforderlichen Parameter selbst generieren (unter Verwendung anbieterspezifischer Standardwerte oder zufälliger Werte), wenn sie für die Verschlüsselung oder Schlüsselumbruch initialisiert wird, und eine InvalidKeyException auslösen, wenn sie zur Entschlüsselung oder Schlüsselentschlüsselung initialisiert wird. Die generierten Parameter können mit getParameters oder getIV (wenn der Parameter ein IV ist) abgerufen werden.

Um dies zu vermeiden, geben Sie explizit eine IV an.