El algoritmo AES es ampliamente utilizado para cifrado simétrico debido a su alta seguridad y eficiencia. En este ejemplo, utilizaremos el modo de operación CBC (Cipher Block Chaining) para cifrar y descifrar un mensaje.
Este ejemplo generará una clave AES, cifrará un mensaje y luego lo descifrará nuevamente para obtener el mensaje original. El resultado mostrará el mensaje original, el mensaje cifrado en formato de bytes y el mensaje descifrado que debería ser igual al original.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 |
import java.nio.charset.StandardCharsets import java.security.Key import javax.crypto.Cipher import javax.crypto.KeyGenerator import javax.crypto.spec.IvParameterSpec import javax.crypto.spec.SecretKeySpec fun generateAESKey(): Key { val keyGenerator = KeyGenerator.getInstance("AES") keyGenerator.init(128) // Tamaño de clave: 128 bits (AES-128) return keyGenerator.generateKey() } fun encryptAES(text: String, key: Key): ByteArray { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") cipher.init(Cipher.ENCRYPT_MODE, key) val iv = cipher.parameters.getParameterSpec(IvParameterSpec::class.java).iv val encryptedText = cipher.doFinal(text.toByteArray(StandardCharsets.UTF_8)) return iv + encryptedText } fun decryptAES(encryptedData: ByteArray, key: Key): String { val ivSize = 16 // Tamaño del vector de inicialización (IV) utilizado en AES val iv = encryptedData.copyOfRange(0, ivSize) val encryptedText = encryptedData.copyOfRange(ivSize, encryptedData.size) val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") cipher.init(Cipher.DECRYPT_MODE, key, IvParameterSpec(iv)) val decryptedText = cipher.doFinal(encryptedText) return String(decryptedText, StandardCharsets.UTF_8) } fun main() { val originalMessage = "¡Hola, este es un ejemplo de cifrado AES en Kotlin!" val aesKey = generateAESKey() val encryptedData = encryptAES(originalMessage, aesKey) val decryptedMessage = decryptAES(encryptedData, aesKey) println("Mensaje original: $originalMessage") println("Mensaje cifrado: ${encryptedData.contentToString()}") println("Mensaje descifrado: $decryptedMessage") } |