2008-12-04 13 views
5

Ich verwende eine AES-Chiffre mit einer 16-Byte-Blockgröße.Java Cipher - AES Padding Problem

Wenn ich versuche, eine 16-Byte-Zeichenfolge zu verschlüsseln, habe ich keine Probleme, aber jede andere Länge als ein Vielfaches von 16 wirft eine Ausnahme.

Ich weiß mit 3-DES können Sie einen Auffüllungstyp als Teil des Algorithmus angeben, und es wird ohne zusätzliche Arbeit (z. B. DES/CBC/PKCS5Padding) behandelt, aber gibt es eine Möglichkeit, dies mit AES anzugeben?

Oder muss ich die Bytes manuell auf ein Vielfaches von 16 auffüllen, und dann entkleiden, wenn ich entschlüsseln? Hier ist ein abgekürztes Codebeispiel.

encrypt = Cipher.getInstance("AES", provider); 
encrypt.init(Cipher.ENCRYPT_MODE, key) ; 
byte[] encrypted = encrypt.doFinal(plainTxt.getBytes()) ; 

Alle und alle Antworten geschätzt!

Vielen Dank im Voraus, Ciarán

+2

pedantischer Kommentar: AES hat per Definition nur eine Blockgröße von 16 Byte. Rijndael (der ursprüngliche Name und die ursprüngliche Spezifikation) hatten Blockgrößen von 16,24 und 32 Bytes, aber zur Verwendung in AES sind nur 16-Byte-Blöcke erlaubt. Rijndael unterstützte auch die Schlüsselgrößen 128, 160, 192, 224, 256, aber nur 128, 192 und 256 werden in AES unterstützt. –

Antwort

5

Es sollte genau das gleiche mit AES arbeiten, das heißt, der Padding-Modus hat mit der Chiffre angegeben, zusammen sein. Welche Füllmethoden implementiert werden, hängt vom Anbieter ab und sollte in der Dokumentation beschrieben werden.

Nach der JCE Dokumentation: http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html#AppA Standard padding-Modi wie PKCS5Padding sollten immer unterstützt werden (zumindest das ist, wie ich es interpretieren).

+0

Junge bin ich vertraut mit dieser Seite :) Wenn Sie den Anbieter sagen, meinen Sie die Implementierung der JCE, die ich verwende? Ich werde die Dokumente dafür überprüfen. –

+0

Ja, der Provider (der zweite Parameter in der Methode getInstance()) implementiert im Grunde die Cipher-Schnittstelle. Sie können mehr als einen Kryptografieanbieter aktivieren. Suns JDK wird mit dem vorinstallierten SunJCE-Provider geliefert –

+0

Da ich einen 'Proof of Concept' des AES über Java/Coldfusion programmiert habe, habe ich mein eigenes Padding mit der hier beschriebenen Methode 2 implementiert: http: //www.di-mgt. com.au/cryptopad.html. Vielleicht schaue ich genauer hin. Ich werde das als die Antwort markieren. –