Расширенный стандарт шифрования (AES), также известный как метод шифрования Rijndael в криптографии, является стандартом шифрования блока, принятым федеральным правительством США. Этот стандарт используется для замены исходного DES, и был проанализирован несколькими сторонами и широко используется во всем мире.
Большинство расчетов AES выполняются в определенной конечной области.
Процесс шифрования AES работает на матрице 4 × 4 байта, также известной как «состояние», а его начальным значением является публичный текст (размер элемента в матрице представляет собой байт в блоке открытого текста). (Метод шифрования Rijndael поддерживает большие блоки, и его матричное количество рядов может быть увеличено по мере необходимости) во время шифрования каждый раунд цикла шифрования AES (кроме последнего раунда) содержит 4 шага:
Шаг MixColumns опущен в последней петле шифрования и заменяется другим AddRoundKey.
Основная реализация Java:
пакет com.stone.security; импортировать java.util.arrays; Импорт javax.crypto.cipher; Импорт javax.crypto.keygenerator; Импорт javax.crypto.secretkey; Импорт javax.crypto.spec.ivparameterspec; / *** Алгоритм AES Симметричный шифрование, расширенный стандарт шифрования в криптографии стал эффективным стандартом в 2005 году*/ Public Class AES {статический шифр; статическая конечная строка key_algorithm = "aes"; Статическая конечная строка cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; Статическая конечная строка cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * AES/CBC/NOPADDING Требования * Ключ должен быть 16-битным; Вектор инициализации (iv) должен быть 16-битный * длина содержания, подлежащего зашифрованию, должна быть равной 16. Если оно не растоножна 16, то появится следующее исключение: * javax.crypto.illegalblocksizexexcept Длина данных равен n integer 16, если исходная длина данных равна 16*n, зашифрованная длина данных равна 16*N при использовании Nopadding,*В других случаях зашифрованная длина данных равна 16*n. В случае менее 16 целочисленных множества, если исходная длина данных равна 16*n+m [где m меньше 16],*каким -либо образом, кроме Nopadding Padding, зашифрованная длина данных равна 16*(n+1). */static final String cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; Статический секрет секретаря; public static void main (string [] args) выбрасывает исключение {method1 ("a*jal) k32j8czx страна национальная широкая"); Метод2 («a*jal) k32j8czx Страна национальная широкая»); Метод3 («a*jal) k32j8czx - санитария страны»); Метод4 ("123456781234 - санитария страны"); // length = 16 MED4 ("12345678ABCDEFGH"); // Length = 16}/** * Используйте алгоритм AES для шифрования, режима по умолчанию/ECB */Static Void MEDO1 Cipher.getinstance (key_algorithm); // Keygenerator генерирует AES -алгоритм ключ SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println («Длина ключа:» + secretKey.getEncoded (). Length); cipher.init (cipher.encrypt_mode, secretKey); // инициализировать ключ с помощью режима шифрования Byte [] encrypt = cipher.dofinal (str.getBytes ()); // шифровать или расшифровать данные в соответствии с операцией в одну часть или прекратите операцию с несколькими частями. System.out.println ("Method1-encrypted:" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretKey); // инициализировать ключ с помощью режима дешифрования Byte [] decrypt = cipher.dofinal (incrypt); System.out.println ("method1-decrypted:" + new String (decrypt)); }/** * Зашифровано с использованием алгоритма AES, режим по умолчанию AES/ECB/PKCS5Padding */Static Void Method2 (String Str) Throws Exception {cipher = cipher.getInstance (cipher_algorithm_ecb); // Keygenerator генерирует AES -алгоритм ключ SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println («Длина ключа:» + secretKey.getEncoded (). Length); cipher.init (cipher.encrypt_mode, secretkey); // Инициализировать ключ с помощью режима шифрования Byte [] incrypt = cipher.dofinal (str.getbytes ()); // зашифровать или расшифровать данные в соответствии с операцией в одну часть или заканчивают многочасовую операцию. System.out.println ("Method2-ecrypted:" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretKey); // инициализировать ключ с помощью режима дешифрования Byte [] decrypt = cipher.dofinal (incrypt); System.out.println ("method2-decrypted:" + new String (decrypt)); } static byte [] getiv () {string iv = "1234567812345678"; // IV Длина: должно быть длиной 16 байт return iv.getbytes (); }/** * Используйте алгоритм AES для шифрования, режим по умолчанию AES/CBC/PKCS5Padding */Static Void Method3 (String Str) Throws Exception {cipher = cipher.getInstance (cipher_algorithm_cbc); // Keygenerator генерирует AES -алгоритм ключ SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println («Длина ключа:» + secretKey.getEncoded (). Length); cipher.init (cipher.encrypt_mode, secretkey, new ivparameterspec (getiv ())); // инициализировать ключ, используя режим шифрования Byte [] encrypt = cipher.dofinal (str.getbytes ()); // шифровать или расшифровать данные в соответствии с операцией в одну часть или прекратите операцию с несколькими частями. System.out.println ("Method3-ecrypted:" + arrays.tostring (encrypt)); cipher.init (cipher.decrypt_mode, secretkey, new ivparameterspec (getiv ())); // инициализировать ключ, используя режим дешифрования byte [] decrypt = cipher.dofinal (encrypt); System.out.println ("method3-decrypted:" + new String (decrypt)); }/*** Зашифровано с использованием алгоритма AES, режим по умолчанию AES/CBC/NOPADDING См. Выше ограничения данных для этого режима*/static void method4 (String str) Throws Exception {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // Keygenerator генерирует AES -алгоритм ключ SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println («Длина ключа:» + secretKey.getEncoded (). Length); cipher.init (cipher.encrypt_mode, secretkey, new ivparameterspec (getiv ())); // инициализировать ключ, используя режим шифрования byte [] encrypt = cipher.dofinal (str.getbytes (), 0, str.length ()); // зашифровать или расшифровать данные в соответствии с операцией в одну часть или заканчивают многочасовую операцию. System.out.println ("Method4-Encrypt:" + Arrays.tostring (Encrypt)); cipher.init (cipher.decrypt_mode, secretkey, new ivparameterspec (getiv ())); // инициализировать ключ, используя режим дешифрования byte [] decrypt = cipher.dofinal (encrypt); System.out.println ("Method4-Decrypted:" + new String (decrypt)); }}