Advanced Encryption Standard (AES), auch als Rijndael -Verschlüsselungsmethode in der Kryptographie bekannt, ist ein von der US -Bundesregierung verabschiedeter Blockverschlüsselungsstandard. Dieser Standard wird verwendet, um die ursprüngliche DES zu ersetzen, und wurde von mehreren Parteien analysiert und wird weltweit weit verbreitet.
Die meisten AES -Berechnungen werden in einem bestimmten endlichen Bereich durchgeführt.
Der AES -Verschlüsselungsprozess arbeitet auf einer 4 × 4 -Byte -Matrix, auch als "Zustand" bezeichnet, und sein Anfangswert ist ein Klartextblock (eine Elementgröße in der Matrix ist ein Byte im Klartextblock). (Die Rijndael -Verschlüsselungsmethode unterstützt größere Blöcke, und die Anzahl der Matrixzeilen kann gegebenenfalls erhöht werden. Während der Verschlüsselung enthält jede Runde der AES -Verschlüsselungsschleife (mit Ausnahme der letzten Runde) 4 Schritte:
Der MixColumns -Schritt wird in der letzten Verschlüsselungsschleife weggelassen und durch einen anderen AddroundKey ersetzt.
Grundlegende Java -Implementierung:
Paket com.stone.security; Import Java.util.Arrays; importieren javax.crypto.cipher; import Javax.Crypto.KeyGenerator; importieren javax.crypto.secretkey; importieren javax.crypto.spec.ivparameterspec; / *** AES -Algorithmus -symmetrische Verschlüsselung, der fortschrittliche Verschlüsselungsstandard in der Kryptographie wurde 2005 zu einem effektiven Standard*/ öffentliche Klasse AEs {statische Verschlüsselungspunktausschüsse; statische endgültige String key_algorithmus = "aes"; statische endgültige Zeichenfolge cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; statische endgültige Zeichenfolge cipher_algorithmus_cbc = "aes/cbc/pkcs5padding"; /** * AES/CBC/Nopadding-Anforderungen * Der Schlüssel muss 16-Bit sein; Initialisierungsvektor (iv) muss 16-Bit * sein. Die Länge des zu verschlüsselten Inhalts muss ein Vielfaches von 16 sein. Wenn es sich nicht um ein Vielfaches von 16 handelt, wird die folgende Ausnahme angezeigt: * Javax.Crypto.Illegalblocksexexexion: Eingablänge Länge nicht Multiple von 16 Bytes * * Da die Anzahl der Bühnen festgestellt wird. Die Länge ist n -mal die Ganzzahl von 16, wenn die ursprüngliche Datenlänge gleich 16*N ist, ist die verschlüsselte Datenlänge bei Verwendung von Nopadding*in anderen Fällen die verschlüsselte Datenlänge gleich 16*n. Bei weniger als 16 Ganzzahl -Multiplikatoren ist die verschlüsselte Datenlänge in irgendeiner Weise 16*(N+1), wenn die ursprüngliche Datenlänge gleich 16*n+m [wobei m weniger als 16] ist,*in irgendeiner Weise, außer Nopadding -Polsterung. */static Final String cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; statischer SecretKey SecretKey; public static void main (String [] args) löst eine Ausnahme aus (Methode1 ("a*jal) k32j8czx land ist national breit"); method2 ("a*jal) k32j8czx land ist national breit"); method3 ("a*jal) k32j8czx ist die sanitäre Einrichtungen des Landes"); method4 ("123456781234 ist das sanitäre Einrichtungen des Landes"); // Länge = 16 Methode4 ("12345678abcdefgh"); // Länge = 16}/** * Verwenden Sie den AES -Algorithmus, um zu verschlüsseln, Default -Modus aes/ecb */Static Void Method1 (String) Throws -Ausnahme {CIPHER = Cipher.getInstance (KEY_ALGORITHM); // KeyGenerator generiert AES -Algorithmus Key SecretKey = KeyGenerator.getInstance (KEY_ALGORITHM) .GenerateKey (); System.out.println ("Die Länge des Schlüssels ist:" + secryKey.getEcoded (). Länge); cipher.init (cipher.encrypt_mode, secryKey); // initialisieren Sie den Schlüssel mit dem Verschlüsselungsmodus Byte [] Encrypt = Cipher.dofinal (str.getBytes ()); // die Daten gemäß einem einteiligen Betrieb verschlüsseln oder entschlüsseln oder einen mehrteiligen Betrieb beenden. System.out.println ("method1-decrypt:" + arrays.toString (verschlüsselt)); cipher.init (cipher.decrypt_mode, secryKey); // initialisieren Sie den Schlüssel mit Byte des Entschlüsselungsmodus [] decrypt = cipher.dofinal (Encrypt); System.out.println ("Methode1-dekoriert:" + neue String (entschlüsselt)); }/** * Mit dem AES -Algorithmus verschlüsselt. // KeyGenerator generiert AES -Algorithmus Key SecretKey = KeyGenerator.getInstance (KEY_ALGORITHM) .GenerateKey (); System.out.println ("Die Länge des Schlüssels ist:" + secryKey.getEcoded (). Länge); cipher.init (cipher.encrypt_mode, secryKey); // Initialisieren Sie den Schlüssel mit dem Verschlüsselungsmodus Byte [] Encrypt = cipher.dofinal (str.getBytes ()); // Daten nach einem einteiligen Betrieb verschlüsseln oder entschlüsseln oder einen mehrteiligen Betrieb beenden. System.out.println ("method2-crypted:" + arrays.toString (verschlüsselt)); cipher.init (cipher.decrypt_mode, secryKey); // initialisieren Sie den Schlüssel mit Byte des Entschlüsselungsmodus [] decrypt = cipher.dofinal (Encrypt); System.out.println ("method2 decrypt:" + neuer String (entschlüsselt)); } statisches Byte [] getiv () {String iv = "1234567812345678"; // IV Länge: Muss 16 Bytes lange zurückkehren iv.getBytes (); }/** * Verwenden Sie den AES -Algorithmus, um zu verschlüsseln. Standardmodus AES/CBC/PKCS5Padding */static void Methode3 (String str) Ausnahme {Cipher = cipher.getInstance (Cipher_algorithmus_cbc); // KeyGenerator generiert AES -Algorithmus Key SecretKey = KeyGenerator.getInstance (KEY_ALGORITHM) .GenerateKey (); System.out.println ("Die Länge des Schlüssels ist:" + secryKey.getEcoded (). Länge); cipher.init (cipher.encrypt_mode, secryKey, neuer ivparameterspec (getiv ()); // initialisieren Sie den Schlüssel mit dem Verschlüsselungsmodus Byte [] Encrypt = cipher.dofinal (str.getBytes ()); // die Daten gemäß einem einteiligen Betrieb verschlüsseln oder entschlüsseln oder einen mehrteiligen Betrieb beenden. System.out.println ("method3-crypted:" + arrays.toString (verschlüsselt)); cipher.init (cipher.decrypt_mode, secryKey, neuer ivparameterspec (getiv ()); // initialisieren Sie den Schlüssel mit dem Entschlüsselungsmodus Byte [] decrypt = cipher.dofinal (Encrypt); System.out.println ("method3 decrypt:" + neuer String (entschlüsselt)); }/*** Verschlüsselte mit dem AES -Algorithmus, Standardmodus AES/CBC/NOPADDING Siehe oben für Datenbeschränkungen für diesen Modus*/static void method4 (String str) Ausnahme aus der Ausnahme {Cipher = cipher.getInstance (cipher_algorithmus_cbc_nopadding); // KeyGenerator generiert AES -Algorithmus Key SecretKey = KeyGenerator.getInstance (KEY_ALGORITHM) .GenerateKey (); System.out.println ("Die Länge des Schlüssels ist:" + secryKey.getEcoded (). Länge); cipher.init (cipher.encrypt_mode, secryKey, neuer ivparameterspec (getiv ()); // initialisieren Sie den Schlüssel mit dem Verschlüsselungsmodus Byte [] Encrypt = Cipher.dofinal (str.getBytes (), 0, Str.Length ()); // Daten nach einem einteiligen Betrieb verschlüsseln oder entschlüsseln oder einen mehrteiligen Betrieb beenden. System.out.println ("method4-crypt:" + arrays.toString (verschlüsselt)); cipher.init (cipher.decrypt_mode, secryKey, neuer ivparameterspec (getiv ()); // initialisieren Sie den Schlüssel mit dem Entschlüsselungsmodus Byte [] decrypt = cipher.dofinal (Encrypt); System.out.println ("method4 decrypt:" + new String (entschlüsselt)); }}