Data Encryption/Decryption
This topic discusses how encryption and decryption works in Android.
AES encryption of data using password in a secure way
Section titled “AES encryption of data using password in a secure way”The following example encrypts a given data block using AES. The encryption key is derived in a secure way (random salt, 1000 rounds of SHA-256). The encryption uses AES in CBC mode with random IV.
Note that the data stored in the class EncryptedData (salt, iv, and encryptedData) can be concatenated to a single byte array. You can then save the data or transmit it to the recipient.
private static final int SALT_BYTES = 8;private static final int PBK_ITERATIONS = 1000;private static final String ENCRYPTION_ALGORITHM = "AES/CBC/PKCS5Padding";private static final String PBE_ALGORITHM = "PBEwithSHA256and128BITAES-CBC-BC";
private EncryptedData encrypt(String password, byte[] data) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException { EncryptedData encData = new EncryptedData(); SecureRandom rnd = new SecureRandom(); encData.salt = new byte[SALT_BYTES]; encData.iv = new byte[16]; // AES block size rnd.nextBytes(encData.salt); rnd.nextBytes(encData.iv);
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), encData.salt, PBK_ITERATIONS); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM); Key key = secretKeyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance(ENCRYPTION_ALGORITHM); IvParameterSpec ivSpec = new IvParameterSpec(encData.iv); cipher.init(Cipher.ENCRYPT_MODE, key, ivSpec); encData.encryptedData = cipher.doFinal(data); return encData;}
private byte[] decrypt(String password, byte[] salt, byte[] iv, byte[] encryptedData) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException, InvalidAlgorithmParameterException { PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, PBK_ITERATIONS); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM); Key key = secretKeyFactory.generateSecret(keySpec); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); IvParameterSpec ivSpec = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, key, ivSpec); return cipher.doFinal(encryptedData);}
private static class EncryptedData { public byte[] salt; public byte[] iv; public byte[] encryptedData;}The following example code shows how to test encryption and decryption:
try { String password = "test12345"; byte[] data = "plaintext11223344556677889900".getBytes("UTF-8"); EncryptedData encData = encrypt(password, data); byte[] decryptedData = decrypt(password, encData.salt, encData.iv, encData.encryptedData); String decDataAsString = new String(decryptedData, "UTF-8"); Toast.makeText(this, decDataAsString, Toast.LENGTH_LONG).show();} catch (Exception e) { e.printStackTrace();}