O padrão avançado de criptografia (AES), também conhecido como Método de Criptografia Rijndael em criptografia, é um padrão de criptografia em bloco adotado pelo governo federal dos EUA. Esse padrão é usado para substituir o DES original e foi analisado por várias partes e é amplamente utilizado em todo o mundo.
A maioria dos cálculos do AES é feita em um domínio finito específico.
O processo de criptografia AES opera em uma matriz de 4 × 4 bytes, também conhecida como "Estado", e seu valor inicial é um bloco de texto simples (um tamanho de elemento na matriz é um byte no bloco de texto simples). (O método de criptografia Rijndael suporta blocos maiores, e sua contagem de linhas da matriz pode ser aumentada conforme apropriado) durante a criptografia, cada rodada de loop de criptografia AES (exceto a última rodada) contém 4 etapas:
A etapa de mixcolumns é omitida no último loop de criptografia e substituída por outra chave addround.
Implementação básica de Java:
pacote com.stone.security; importar java.util.arrays; importar javax.crypto.cipher; importar javax.crypto.keygenerator; importar javax.crypto.secretkey; importar javax.crypto.spec.ivparameterspec; / *** Algoritmo AES Criptografia simétrica, o padrão de criptografia avançado na criptografia tornou -se um padrão eficaz em 2005*/ classe pública AES {cifra estática cifra; String final estática key_algorithm = "aes"; String final estática Cipher_algorithm_ecb = "AES/ECB/PKCS5Padding"; String final estática cipher_algorithm_cbc = "AES/CBC/PKCS5Padding"; /** * Requisitos de AES/CBC/Nopadding * A chave deve ser de 16 bits; Initialization vector (IV) must be 16-bit* The length of the content to be encrypted must be a multiple of 16. If it is not a multiple of 16, the following exception will appear: * javax.crypto.IllegalBlockSizeException: Input length not multiple of 16 bytes * * Since the number of bits is fixed, the encrypted data is in Chinese, and the addition and decryption are incomplete* * You can see that when the original O comprimento dos dados é n vezes o número inteiro de 16, se o comprimento original dos dados for igual a 16*n, o comprimento dos dados criptografados é igual a 16*n ao usar nopadding,*em outros casos, o comprimento dos dados criptografados é igual a 16*n. No caso de menos de 16 múltiplos inteiros, se o comprimento dos dados originais for igual a 16*n+m [onde m for menor que 16],*de qualquer maneira, exceto o preenchimento de não, o comprimento dos dados criptografados é igual a 16*(n+1). */String final estática cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; estático secretKey SecretKey; public static void main (string [] args) lança exceção {métod1 ("a*jal) k32j8czx país é nacional"); Method2 ("A*Jal) K32J8CZX Country é nacional"); Method3 ("A*Jal) K32J8CZX é o saneamento do país"); Method4 ("123456781234 é o saneamento do país"); // comprimento = 16 Método4 ("12345678ABCDefgh"); // Comprimento = 16}/** * Use o algoritmo AES de Encropts, Modo Aes/Ecb */Static Void Method1 (STR) Cipher.getInstance (key_algorithm); // keyGenerator gera algoritmo AES key SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("O comprimento da chave é:" + secretKey.getEncoded (). Comprimento); cipher.init (cipher.encrypt_mode, secretKey); // inicialize a chave usando o modo de criptografia byte [] Encrypt = cipher.dofinal (str.getBytes ()); // criptografar ou descriptografar os dados de acordo com uma operação em uma única parte ou encerrar uma operação de várias partes. System.out.println ("Method1-Encryped:" + Arrays.toString (Encrypt)); cipher.init (cipher.decrypt_mode, secretKey); // inicialize a chave usando o modo de descriptografia byte [] decrypt = cipher.dofinal (Encrypt); System.out.println ("Method1 decripto:" + new String (descriptografia)); }/** * Criptografado usando o algoritmo AES, modo padrão AES/ECB/PKCS5padding */Método Void Static2 (String str) lança exceção {cifra = cipher.getInstance (cipher_algorithm_ecb); // keyGenerator gera algoritmo AES key SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("O comprimento da chave é:" + secretKey.getEncoded (). Comprimento); cipher.init (cipher.encrypt_mode, secretKey); // inicialize a chave usando o modo de criptografia byte [] Encrypt = cipher.dofinal (str.getBytes ()); // criptografar ou descriptografar dados de acordo com uma operação de uma única parte ou encerrar uma operação de várias partes. System.out.println ("Method2-Encrypted:" + Arrays.toString (Encrypt)); cipher.init (cipher.decrypt_mode, secretKey); // inicialize a chave usando o modo de descriptografia byte [] decrypt = cipher.dofinal (Encrypt); System.out.println ("Method2-Decrypted:" + New String (descriptografar)); } byte estático [] getiv () {string iv = "1234567812345678"; // comprimento iv: deve ter 16 bytes de retorno iv.getBytes (); }/** * Use o algoritmo AES para criptografar, modo padrão AES/CBC/PKCS5padding */Método Void Static3 (String str) lança exceção {cipher = cipher.getInstance (cipher_algorithm_cbc); // keyGenerator gera algoritmo AES key SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("O comprimento da chave é:" + secretKey.getEncoded (). Comprimento); cipher.init (cipher.encrypt_mode, secretKey, new IVParameterspec (getiv ())); // inicialize a chave usando o modo de criptografia byte [] Encrypt = cipher.dofinal (str.getBytes ()); // criptografar ou descriptografar os dados de acordo com uma operação em uma única parte ou encerrar uma operação de várias partes. System.out.println ("Method3-Encrypted:" + Arrays.toString (Encrypt)); cipher.init (cipher.decrypt_mode, secretKey, new IVParameterspec (getiv ())); // inicialize a chave usando o modo de descriptografia byte [] descriptografia = cipher.Dofinal (Encrypt); System.out.println ("Method3 Decrypted:" + New String (descriptografar)); }/*** Criptografado usando o algoritmo AES, modo padrão AES/CBC/Nopadding Veja acima para limitações de dados para este modo*/Método estático de void4 (String str) lança exceção {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // keyGenerator gera algoritmo AES key SecretKey = keyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("O comprimento da chave é:" + secretKey.getEncoded (). Comprimento); cipher.init (cipher.encrypt_mode, secretKey, novo IVParameterspec (getiv ())); // inicialize a chave usando o modo de criptografia byte [] Encrypt = cipher.dofinal (str.getBytes (), 0, str.Length ()); // criptografar ou descriptografar dados de acordo com uma operação de uma única parte ou encerrar uma operação de várias partes. System.out.println ("Method4-Encrypt:" + Arrays.ToString (Encrypt)); cipher.init (cipher.decrypt_mode, secretKey, new IVParameterspec (getiv ())); // inicialize a chave usando o modo de descriptografia byte [] descriptografia = cipher.Dofinal (Encrypt); System.out.println ("Method4 decripto:" + new String (descriptografia)); }}