AES
También conocido como Rijndael (pronunciado «Rain Doll» en inglés), es un esquema de cifrado por bloques adoptado como un estándar de cifrado por el gobierno de los Estados Unidos, creado en Bélgica. El AES fue anunciado por el Instituto Nacional de Estándares y Tecnología (NIST) como FIPS PUB 197 de los Estados Unidos (FIPS 197) el 26 de noviembre de 2001 después de un proceso de estandarización que duró 5 años. Se transformó en un estándar efectivo el 26 de mayo de 2002. Desde 2006, el AES es uno de los algoritmos más populares usados en criptografía simétrica.
EN 2011 un equipo de investigadores descubrieron la primera vulnerabilidad en el estándar de cifrado AES (Advanced Encryption Standard) que reduce la longitud de la llave efectiva del algoritmo en dos bits. Esto significa que las longitudes usuales de la llave de 128, 192 y 256 bits son reducidas a 126, 190 y 254 bits. Los investigadores emplearon un ataque Meet-in-the-middle, un enfoque que hasta ahora ha sido utilizado principalmente con algoritmo de hashing, combinándolo con un ataque «Biclique». Su método permitió a los investigadores calcular la llave de un simple par de texto plano / texto cifrado, de forma más rápida que lanzando un ataque de fuerza bruta en el espacio de claves completo.
Los algoritmos de cifrado por bloques toman bloques de tamaño fijo del texto en claro y producen un bloque de tamaño fijo de texto cifrado, generalmente del mismo tamaño que la entrada. El tamaño del bloque debe ser lo suficientemente grande como para evitar ataques de texto cifrado. La asignación de bloques de entrada a bloques de salida debe ser uno a uno para hacer el proceso reversible y parecer aleatoria.
Para aplicar un algoritmo por bloques es necesario descomponer el texto de entrada en bloques de tamaño fijo. Esto se puede hacer de varias maneras:
- ECB (Electronic Code Book). Se parte el mensaje en bloques de k bits, rellenando el último si es necesario y se encripta cada bloque. Para desencriptar se trocea el texto cifrado en bloques de k bits y se desencripta cada bloque. Este sistema es vulnerable a ataques ya que dos bloques idénticos de la entrada generan el mismo bloque de salida. En la práctica no se utiliza.
- CBC (Cipher Block Chaining). Este método soluciona el problema del ECB haciendo una o-exclusiva de cada bloque de texto en claro con el bloque anterior cifrado antes de encriptar. Para el primer bloque se usa un vector de inicialización. Este es uno de los esquemas más empleados en la práctica.
- OFB (Output Feedback Mode). Este sistema emplea la clave de la sesión para crear un bloque pseudoaleatorio grande (pad) que se aplica en o-exclusiva al texto en claro para generar el texto cifrado. Este método tiene la ventaja de que el pad puede ser generado independientemente del texto en claro, lo que incrementa la velocidad de encriptación y desencriptación.
- CFB (Cipher Feedback Mode). Variante del método anterior para mensajes muy largos.
Cifrar desde PowerShell
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
$unencryptedString = "This is my plain text" # Cifrar $bytes = [System.Text.Encoding]::UTF8.GetBytes($unencryptedString) $aesManaged = New-Object "System.Security.Cryptography.AesManaged" $aesManaged.Mode = [System.Security.Cryptography.CipherMode]::ECB $aesManaged.BlockSize = 128 $aesManaged.Key = [System.Text.Encoding]::UTF8.GetBytes('This is my secre') $encryptor = $aesManaged.CreateEncryptor() $encryptedData = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length); $encrypted = [System.Convert]::ToBase64String($encryptedData) $web = iwr ("http://localhost:81/fich.php?cifrado="+$encrypted) $web.content |
Descifrar desde PHP (http://localhost:81/fich.php)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
<?php // Sustituir el " " por "+" porque se pierde en la url $cifrado = str_replace(" ","+",$_GET['cifrado']); echo $cifrado; function encrypt_decrypt($action, $string) { $output = false; $encrypt_method = "AES-128-ECB"; $key = 'This is my secre'; if ( $action == 'encrypt' ) { $output = openssl_encrypt($string, $encrypt_method, $key); $output; } else if( $action == 'decrypt' ) { $output = openssl_decrypt($string, $encrypt_method, $key); $output; } return $output; } $decrypted_txt = encrypt_decrypt('decrypt', $cifrado); echo "Decrypted Text =" .$decrypted_txt. "\n"; echo "\n"; ?> |