2016-03-24 6 views
0

Ich habe folgenden Code verwendet, um die Daten zu verschlüsseln. Meine Eingabe ist 16 Bytes und Schlüssel ist 16 Bytes, aber die Ausgabe, die ich bekomme (verschlüsselte Daten) ist 32 Bytes. Warum?Warum erweitert die AES 128-Verschlüsselung die Daten?

public static byte[] encrypt(byte[] plainText, byte[] key) { 
try { 
    byte[] passwordKey128 = Arrays.copyOfRange(key, 0, 16); 
    SecretKeySpec secretKey = new SecretKeySpec(passwordKey128, "AES"); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, secretKey); 
    byte[] cipherText = cipher.doFinal(plainText); 
    // String encryptedString = Base64.getEncoder().encodeToString(cipherText); 
    return cipherText; 

Was kann der Grund sein? Fügt AES Daten hinzu?

+0

Mögliche Duplikate von [Wohin mit Informationen über die Fülllänge?] (Http://stackoverflow.com/questions/26930911/where-to-put-information-about-padding-length) –

+0

Gemäß Standard hat AES eine Blockgröße von 128 Bit. Mit anderen Worten, andere Blockgrößen sind nicht standardisiert. Sie zitieren nicht, was die Funktion des Softwareentwicklers "cipher.doFinal()" tut. Also, IMHO ist es besser, den Entwickler Ihrer Software zu bitten, das von Ihnen beobachtete Phänomen zu erklären. –

+0

Allgemeine Hinweise: ** Verwenden Sie immer einen vollständig qualifizierten Cipher-String. ** 'Cipher.getInstance (" AES ");' kann abhängig vom Standard-Sicherheitsanbieter zu unterschiedlichen Verschlüsselungen führen. Es führt höchstwahrscheinlich zu "AES/ECB/PKCS5Padding", aber das muss nicht sein. Wenn es sich ändert, werden Sie die Kompatibilität zwischen verschiedenen JVMs verlieren. –

Antwort

2

Sie erhalten Cipher Objekt durch das Cipher.getInstance(transformation) Verfahren, bei dem die Umwandlung der Form ist:

"algorithm/mode/padding" or 
"algorithm" 

Wenn Sie dies die Implementierung durchsucht die Liste der Krypto-Anbieter in dem System zu tun und bestimmen, ob eine Implementierung unterstützt diese . Wenn Sie den Modus und das Padding nicht angeben, müssen Sie den Crypto-Provider bestimmen, welcher Standardmodus und welches Padding verwendet werden soll.

Gemäß this ist der SunJCE-Standard beispielsweise auf ECB als Standardmodus und PKCS5Padding eingestellt.

Als PKCS5Padding fügt immer mindestens ein Byte hinzu, es schiebt Ihre 16 Bytes über die Grenze des Blocks und erstellt die Notwendigkeit für zwei Blöcke.

Verwandte Themen