Archive for August, 2013
Encrypt and decrypt with Java
Encryption is a very important subject in computer science which developers need to deal with quite often. I already wrote a few years ago an article containing some code to encrypt data with PHP and decrypt it with Java.
I will give you this time the code to encrypt and decrypt data with the same language: Java. Once again, I used a secret key and an initialization vector for the encryption and decryption.
And here it is:
import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.math.BigInteger; import java.security.InvalidAlgorithmParameterException; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * This class provides methods to encrypt and decrypt data. * @author Stephane Moreau */ public class Crypto { private static String md5(final String input) throws NoSuchAlgorithmException { final MessageDigest md = MessageDigest.getInstance("MD5"); final byte[] messageDigest = md.digest(input.getBytes()); final BigInteger number = new BigInteger(1, messageDigest); return String.format("%032x", number); } private Cipher initCipher(final int mode, final String initialVectorString, final String secretKey) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, InvalidAlgorithmParameterException { final SecretKeySpec skeySpec = new SecretKeySpec(md5(secretKey).getBytes(), "AES"); final IvParameterSpec initialVector = new IvParameterSpec(initialVectorString.getBytes()); final Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); cipher.init(mode, skeySpec, initialVector); return cipher; } public String encrypt(final String dataToEncrypt, final String initialVector, final String secretKey) { String encryptedData = null; try { // Initialize the cipher final Cipher cipher = initCipher(Cipher.ENCRYPT_MODE, initialVector, secretKey); // Encrypt the data final byte[] encryptedByteArray = cipher.doFinal(dataToEncrypt.getBytes()); // Encode using Base64 encryptedData = (new BASE64Encoder()).encode(encryptedByteArray); } catch (Exception e) { System.err.println("Problem encrypting the data"); e.printStackTrace(); } return encryptedData; } public String decrypt(final String encryptedData, final String initialVector, final String secretKey) { String decryptedData = null; try { // Initialize the cipher final Cipher cipher = initCipher(Cipher.DECRYPT_MODE, initialVector, secretKey); // Decode using Base64 final byte[] encryptedByteArray = (new BASE64Decoder()).decodeBuffer(encryptedData); // Decrypt the data final byte[] decryptedByteArray = cipher.doFinal(encryptedByteArray); decryptedData = new String(decryptedByteArray, "UTF8"); } catch (Exception e) { System.err.println("Problem decrypting the data"); e.printStackTrace(); } return decryptedData; } public static void main(final String[] args) { final String iv = "0123456789123456"; // This has to be 16 characters final String secretKey = "Replace this by your secret key"; final Crypto crypto = new Crypto(); final String encryptedData = crypto.encrypt("This is a test message.", iv, secretKey); System.out.println(encryptedData); final String decryptedData = crypto.decrypt(encryptedData, iv, secretKey); System.out.println(decryptedData); } }