El estándar de cifrado avanzado (AES), también conocido como método de cifrado de Rijndael en criptografía, es un estándar de cifrado de bloque adoptado por el gobierno federal de los Estados Unidos. Este estándar se utiliza para reemplazar el DES original, y ha sido analizado por múltiples partes y se usa ampliamente en todo el mundo.
La mayoría de los cálculos de AES se realizan en un dominio finito particular.
El proceso de cifrado AES funciona en una matriz de 4 × 4 de bytes, también conocida como "estado", y su valor inicial es un bloque de texto sin formato (un tamaño de elemento en la matriz es un byte en el bloque de texto sin formato). (El método de cifrado Rijndael admite bloques más grandes, y su recuento de hileras de matriz se puede aumentar según corresponda) durante el cifrado, cada ronda de bucle de cifrado AES (excepto la última ronda) contiene 4 pasos:
El paso de mixcolumns se omite en el último bucle de cifrado y se reemplaza por otra tecla adicional.
Implementación básica de Java:
paquete com.stone.security; importar java.util.arrays; import javax.crypto.cipher; import javax.crypto.KeyGenerator; import javax.crypto.secretkey; import javax.crypto.spec.ivparameterspec; / *** Cifrado simétrico del algoritmo AES, el estándar de cifrado avanzado en criptografía se convirtió en un estándar efectivo en 2005*/ clase pública AES {cifrado de cifrado estático; cadena final estática key_algorithm = "AES"; cadena final estática cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; cadena final estática cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * requisitos AES/CBC/NOPADDING * La clave debe ser de 16 bits; El vector de inicialización (iv) debe ser de 16 bits * La longitud del contenido que se encriptará debe ser un múltiplo de 16. Si no es un múltiplo de 16, la siguiente excepción aparecerá: * javax.crypto.illegalblocksizeException: la longitud de entrada no múltiple de 16 bytes * * Dado que el número de bits está fijo, los datos acriptados están en chinos y la adición y decryción son incrementadas * * que puede verlo. La longitud es n veces el número entero de 16, si la longitud de los datos original es igual a 16*n, la longitud de datos cifrados es igual a 16*n cuando se usa nopadding,*en otros casos, la longitud de datos encriptados es igual a 16*n. En el caso de menos de 16 múltiplos enteros, si la longitud de los datos original es igual a 16*n+m [donde m es menor que 16],*de cualquier manera, excepto el relleno de nopadding, la longitud de los datos encriptados es igual a 16*(n+1). */static final String cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; Secretkey estático SecretKey; public static void main (String [] args) lanza la excepción {método1 ("a*jal) k32j8czx país es nacional"); Method2 ("A*Jal) K32J8CZX El país es amplio"); método3 ("a*jal) k32j8czx es el saneamiento del país"); Method4 ("123456781234 es el saneamiento del país"); // longitud = 16 método4 ("12345678abcdefgh"); // longitud = 16}/** * Use el algoritmo AES para cifrar, modo predeterminado AES/ECB */Método estático void1 (String Str) Lanza la excepción {CIPHER = = Cipher.getInstance (key_algorithm); // KeyGenerator genera el algoritmo AES Key SecretKey = KeyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("La longitud de la clave es:" + SecretKey.getEncoded (). Longitud); cipher.init (cipher.encrypt_mode, secretkey); // Inicializar la clave usando el byte del modo de cifrado [] encrypt = cipher.dofinal (str.getbytes ()); // Cifrar o descifrar los datos de acuerdo con una operación de una sola parte, o finalizar una operación de múltiples partes. System.out.println ("Method1-cifrado:" + arrays.toString (encrypt)); cipher.init (cipher.decrypt_mode, secretkey); // inicializar la clave usando el byte del modo de descifrado [] descrypt = cipher.dofinal (encrypt); System.out.println ("Method1-Decrypted:" + new String (Decrypt)); }/** * encriptado usando el algoritmo AES, el modo predeterminado AES/ECB/PKCS5PADDING */STATIC VOID2 (String Str) arroja excepción {cipher = cipher.getInstance (cipher_algorithm_ecb); // KeyGenerator genera el algoritmo AES Key SecretKey = KeyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("La longitud de la clave es:" + SecretKey.getEncoded (). Longitud); cipher.init (cipher.encrypt_mode, secretkey); // Inicializa la clave usando el byte del modo de cifrado [] cifrado = cipher.dofinal (str.getbytes ()); // Cifrar o descifrar datos de acuerdo con una operación de una sola parte, o finalizar una operación de múltiples partes. System.out.println ("Method2-cifrado:" + arrays.toString (encrypt)); cipher.init (cipher.decrypt_mode, secretkey); // inicializar la clave usando el byte del modo de descifrado [] descrypt = cipher.dofinal (encrypt); System.out.println ("Method2-Decrypted:" + New String (Decrypt)); } byte static [] getiv () {String IV = "1234567812345678"; // longitud iv: debe ser de 16 bytes de larga retorno iv.getBytes (); }/** * Utilice el algoritmo AES para cifrar, el modo predeterminado AES/CBC/PKCS5PADDING */STATIC VOID METHOT3 (String Str) arroja excepción {cipher = cipher.getInstance (cipher_algorithm_cbc); // KeyGenerator genera el algoritmo AES Key SecretKey = KeyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("La longitud de la clave es:" + SecretKey.getEncoded (). Longitud); cipher.init (cipher.encrypt_mode, SecretKey, New IVParamETERSPEC (getiv ())); // Inicializa la clave usando el byte del modo de cifrado [] cifrado = cipher.dofinal (str.getbytes ()); // Cifrar o descifrar los datos de acuerdo con una operación de una sola parte, o finalizar una operación de múltiples partes. System.out.println ("Method3-cifrado:" + arrays.toString (encrypt)); cipher.init (cipher.decrypt_mode, secretkey, new iVParamETERSPEC (getiv ())); // Inicializa la tecla usando el byte del modo de descifrado [] Decrypt = cipher.dofinal (encrypt); System.out.println ("Method3-Decrypted:" + New String (Decrypt)); }/*** En cifrado utilizando el algoritmo AES, el modo predeterminado AES/CBC/NOPADDING VEA ARRIBA las limitaciones de datos para este modo*/Método Void Static4 (String Str) lanza la excepción {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // KeyGenerator genera el algoritmo AES Key SecretKey = KeyGenerator.getInstance (key_algorithm) .GenerateKey (); System.out.println ("La longitud de la clave es:" + SecretKey.getEncoded (). Longitud); cipher.init (cipher.encrypt_mode, SecretKey, new IvParamETERSPEC (getiv ())); // Inicializa la clave usando el byte del modo de cifrado [] cifrado = cipher.dofinal (str.getBytes (), 0, str.length ()); // Cifrar o descifrar datos de acuerdo con una operación de una sola parte, o finalizar una operación de múltiples partes. System.out.println ("Method4-ciRypt:" + Arrays.ToString (CiCrypt)); cipher.init (cipher.decrypt_mode, secretkey, new iVParamETERSPEC (getiv ())); // Inicializa la tecla usando el byte del modo de descifrado [] Decrypt = cipher.dofinal (encrypt); System.out.println ("Method4-Decrypted:" + New String (Decrypt)); }}