To start with, here's an "encrypt" method that takes a key, IV (initialization vector), and message and returns the encryption of the message under the specified key and IV. All of the method parameters are expected to be hex-encoded. Note that I'm using a utility method I created to convert the hex strings to byte arrays, which is what the crypto library expects as input. This utility method is included in the code on Git.
def encrypt(hexEncodedIv : String, hexEncodedKey : String, hexEncodedMessage : String) = { // we're using Bouncy Castle Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) // create our key specification val secretKeySpec = new SecretKeySpec(hexStringToByteArray(hexEncodedKey), "AES") // create an AES engine in CTR mode (no padding) val aes = Cipher.getInstance("AES/CTR/NoPadding", BouncyCastleProvider.PROVIDER_NAME) // initialize the AES engine in encrypt mode with the key and IV aes.init(Cipher.ENCRYPT_MODE, secretKeySpec, new IvParameterSpec(hexStringToByteArray(hexEncodedIv))) // encrypt the message and return the encrypted byte array aes.doFinal(hexStringToByteArray(hexEncodedMessage)) }
Our "decrypt" method will be the same as the "encrypt" method; however, instead of Cipher.ENCRYPT_MODE, we'll use Cipher.DECRYPT_MODE. Of course, we'll be passing the ciphertext to the method instead of the plaintext message.
def decrypt(hexEncodedIv : String, hexEncodedKey : String, hexEncodedCipherText : String) = { // we're using Bouncy Castle Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()) // create our key specification val secretKeySpec = new SecretKeySpec(hexStringToByteArray(hexEncodedKey), "AES") // create an AES engine in CTR mode (no padding) val aes = Cipher.getInstance("AES/CTR/NoPadding", BouncyCastleProvider.PROVIDER_NAME) // initialize the AES engine in decrypt mode with the key and IV aes.init(Cipher.DECRYPT_MODE, secretKeySpec, new IvParameterSpec(hexStringToByteArray(hexEncodedIv))) // decrypt the ciphertext and return the plaintext as a byte array aes.doFinal(hexStringToByteArray(hexEncodedCipherText)) }