Advanced Encryption Standard (AES), également connu sous le nom de méthode de cryptage Rijndael en cryptographie, est une norme de cryptage en bloc adoptée par le gouvernement fédéral américain. Cette norme est utilisée pour remplacer le DES d'origine et a été analysée par plusieurs parties et est largement utilisée dans le monde.
La plupart des calculs AES sont effectués dans un domaine fini particulier.
Le processus de chiffrement AES fonctionne sur une matrice d'octets 4 × 4, également connue sous le nom de "état", et sa valeur initiale est un bloc en texte clair (une taille d'élément dans la matrice est un octet dans le bloc en texte clair). (La méthode de cryptage Rijndael prend en charge des blocs plus grands, et son nombre de lignes matricielles peut être augmenté le cas échéant) pendant le chiffrement, chaque cycle de boucle de cryptage AES (sauf le dernier tour) contient 4 étapes:
L'étape MixColumns est omise dans la dernière boucle de cryptage et remplacée par un autre AddRoundkey.
Implémentation de base Java:
Package Com.stone.Security; import java.util.arrays; import javax.crypto.cipher; Importer javax.crypto.keygenerator; Importer Javax.crypto.SecretKey; Importer javax.crypto.spe.ivParameterspec; / ** * Escryption symétrique de l'algorithme AES, la norme de cryptage avancée en cryptographie est devenue une norme efficace en 2005 * / classe publique AES {Cipher statique Cipher; chaîne finale statique key_algorithm = "aes"; chaîne finale statique cipher_algorithm_ecb = "aes / ecb / pkcs5padding"; chaîne finale statique cipher_algorithm_cbc = "aes / cbc / pkcs5padding"; / ** * AES / CBC / Nopadding Exigences * La clé doit être 16 bits; Le vecteur d'initialisation (iv) doit être 16 bits * La longueur du contenu à crypter doit être un multiple de 16. S'il ne s'agit pas d'un multiple de 16, l'exception suivante apparaîtra: * javax.crypto.LelegalBlockSizeException: la longueur d'entrée n'est pas multiple de 16 octets * * Étant donné que le nombre de bits est fixé, les données d'origine sont en chinois, et l'ajout et le décrétion sont fixes * La longueur des données est n fois l'entier de 16, si la longueur des données d'origine est égale à 16 * n, la longueur de données cryptée est égale à 16 * n lors de l'utilisation de Nopadding, * Dans d'autres cas, la longueur de données cryptée est égale à 16 * n. Dans le cas de moins de 16 multiples entiers, si la longueur des données d'origine est égale à 16 * n + m [où m est inférieur à 16], * De toute façon, sauf le rembourrage de nopadding, la longueur des données cryptée est égale à 16 * (n + 1). * / Statique finale statique cipher_algorithm_cbc_nopadding = "aes / cbc / nopadding"; SecretKey Secretkey statique; public static void main (String [] args) lève une exception {méthode1 ("a * jal) k32j8czx country est national large"); Méthode 2 ("A * jal) K32J8CZX Le pays est largement national"); Méthode 3 ("A * jal) K32J8CZX est l'assainissement du pays"); Method4 ("123456781234 est l'assainissement du pays"); // longueur = 16 méthode4 ("12345678abcdefgh"); // longueur = 16} / ** * Utilisez l'algorithme AES pour crypter, le mode par défaut AES / ECB * / VOID STATIQUE MÉTHODE1 (String STR) Throws Exception {CiPher = Cipher.getInstance (key_algorithm); // keyGenerator génère AES Algorithm Key SecretKey = keyGenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("La longueur de la clé est:" + SecretKey.getEncoded (). Longueur); cipher.init (cipher.encrypt_mode, secretKey); // initialise la clé en utilisant le mode de chiffrement byte [] Encrypt = cipher.dofinal (str.getBytes ()); // crypter ou décrypter les données en fonction d'une opération en une seule partie, ou terminer une opération en plusieurs parties. System.out.println ("méthode1-crypted:" + arrays.toString (Encrypt)); cipher.init (cipher.decrypt_mode, secréty); // initialise la clé en utilisant le mode de décryptage byte [] decrypt = cipher.dofinal (crypt); System.out.println ("Method1-Decrypted:" + New String (Decrypt)); } / ** * crypté à l'aide de l'algorithme AES, mode par défaut aes / ecb / pkcs5padding * / static void method2 (string str) lève exception {cipher = cipher.getinstance (cipher_algorithm_ecb); // keyGenerator génère AES Algorithm Key SecretKey = keyGenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("La longueur de la clé est:" + SecretKey.getEncoded (). Longueur); Cipher.init (cipher.encrypt_mode, SecretKey); // Initialise la clé en utilisant le mode de cryptage byte [] encrypt = cipher.dofinal (str.getBytes ()); // crypter ou décrypter les données en fonction d'une opération en une seule partie, ou terminer une opération en plusieurs parties. System.out.println ("Method2-crypted:" + arrays.toString (Encrypt)); cipher.init (cipher.decrypt_mode, secréty); // initialise la clé en utilisant le mode de décryptage byte [] decrypt = cipher.dofinal (crypt); System.out.println ("Method2-Decrypted:" + New String (Decrypt)); } octet statique [] geniv () {String IV = "1234567812345678"; // Longueur iv: doit être de 16 octets de long rendement iv.getbytes (); } / ** * Utilisez l'algorithme AES pour crypter, mode par défaut aes / cbc / pkcs5padding * / static void method3 (string str) lève exception {cipher = cipher.getInstance (cipher_algorithm_cbc); // keyGenerator génère AES Algorithm Key SecretKey = keyGenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("La longueur de la clé est:" + SecretKey.getEncoded (). Longueur); cipher.init (cipher.encrypt_mode, secretKey, new ivParameterspec (getiv ())); // initialiser la clé en utilisant le mode de cryptage byte [] encrypt = cipher.dofinal (str.getBytes ()); // crypter ou décrypter les données en fonction d'une opération en une seule partie, ou terminer une opération en plusieurs parties. System.out.println ("Method3-crypted:" + arrays.toString (Encrypt)); Cipher.init (cipher.decrypt_mode, SecretKey, new ivParameterspec (getiv ())); // initialiser la clé en utilisant le mode de décryptage byte [] decrypt = cipher.dofinal (crypt); System.out.println ("Method3-Decrypted:" + New String (Decrypt)); } / ** * crypté à l'aide de l'algorithme AES, mode par défaut aes / cbc / nopadding voir ci-dessus pour les limitations de données pour ce mode * / static void method4 (String str) lève une exception {cipher = cipher.getinstance (cipher_algorithm_cbc_nopadding); // keyGenerator génère AES Algorithm Key SecretKey = keyGenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("La longueur de la clé est:" + SecretKey.getEncoded (). Longueur); cipher.init (cipher.encrypt_mode, secretKey, new ivParameterspec (getiv ())); // initialiser la clé en utilisant le mode de cryptage byte [] encrypt = cipher.dofinal (str.getbytes (), 0, str.length ()); // crypter ou décrypter les données en fonction d'une opération en une seule partie, ou terminer une opération en plusieurs parties. System.out.println ("Method4-Encrypt:" + Arrays.ToString (Encrypt)); Cipher.init (cipher.decrypt_mode, SecretKey, new ivParameterspec (getiv ())); // initialiser la clé en utilisant le mode de décryptage byte [] decrypt = cipher.dofinal (crypt); System.out.println ("Method4-Decrypted:" + New String (Decrypt)); }}