Given a message, We would like to encrypt & decrypt plain/cipher text using AES CBC algorithm in java. We will perform following operations:
- Generate symmetric key using AES-128.
- Generate initialization vector used for CBC (Cipher Block Chaining).
- Encrypt message using symmetric key and initialization vector.
- Decrypt the encrypted message using symmetric key and initialization vector.
Program to encrypt & decrypt message in java:
- Given encryption key & initialization vector.
- We will use AES algorithm to encrypt & decrypt input text.
- CryptoMngr is used generate cipher text from plain text & vice versa.
package org.learn; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class CryptoMngr { public static String ALGORITHM = "AES" ; private static String AES_CBS_PADDING = "AES/CBC/PKCS5Padding" ; public static byte [] encrypt( final byte [] key, final byte [] IV, final byte [] message) throws Exception { return CryptoMngr.encryptDecrypt(Cipher.ENCRYPT_MODE, key, IV, message); } public static byte [] decrypt( final byte [] key, final byte [] IV, final byte [] message) throws Exception { return CryptoMngr.encryptDecrypt(Cipher.DECRYPT_MODE, key, IV, message); } private static byte [] encryptDecrypt( final int mode, final byte [] key, final byte [] IV, final byte [] message) throws Exception { final Cipher cipher = Cipher.getInstance(AES_CBS_PADDING); final SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM); final IvParameterSpec ivSpec = new IvParameterSpec(IV); cipher.init(mode, keySpec, ivSpec); return cipher.doFinal(message); } } |
CryptoMngrClient Class: CryptoMngrClient class will generate random input message and will invoke CryptoMngr to encrypt & decrypt input message.
package org.learn; import java.util.Base64; import java.util.UUID; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class CryptoMngrClient { private static int AES_128 = 128 ; public static void main(String[] args) throws Exception { KeyGenerator keyGenerator = KeyGenerator.getInstance(CryptoMngr.ALGORITHM); keyGenerator.init(AES_128); //Generate Key SecretKey key = keyGenerator.generateKey(); //Initialization vector SecretKey IV = keyGenerator.generateKey(); String randomString = UUID.randomUUID().toString().substring( 0 , 16 ); System.out.println( "1. Message to Encrypt: " + randomString); byte [] cipherText = CryptoMngr.encrypt(key.getEncoded(), IV.getEncoded(), randomString.getBytes()); System.out.println( "2. Encrypted Text: " + Base64.getEncoder().encodeToString(cipherText)); byte [] decryptedString = CryptoMngr.decrypt(key.getEncoded(), IV.getEncoded(), cipherText); System.out.println( "3. Decrypted Message : " + new String(decryptedString)); } } |
Program output to encrypt & decrypt to / from plain text is java:
1. Message to Encrypt: d6d0c0d9-a53c-42 2. Encrypted Text: hdZSyZiTq8t0FCifdgH0mqw0inpyZKLdGpbRgKjPUdA= 3. Decrypted Message : d6d0c0d9-a53c-42 |