· 8 years ago · Dec 07, 2017, 01:06 AM
1// Creates Cipher with asymmetric transformation and provides wrap and unwrap functions
2val cipherForWrapping = CipherWrapper("RSA/ECB/PKCS1Padding")
3
4// Creates Cipher with symmetric transformation and provides encrypt and decrypt functions
5val cipherForEncryption = CipherWrapper("AES/CBC/PKCS7Padding")
6
7// ---------------- Create Keys
8
9// Create AES BC provider key
10val symmetricKey = keyStoreWrapper.generateDefaultSymmetricKey()
11
12// Create RSA AndroidKeyStore Provider key and save it into keystore
13val masterKey = keyStoreWrapper.createAndroidKeyStoreAsymmetricKey(MASTER_KEY)
14
15// Wrap AES Secret key with RSA Public key
16val encryptedSymmetricKey = cipherForWrapping.wrapKey(symmetricKey, masterKey.public)
17
18// And save it to Shared Preferences
19storage.saveEncryptionKey(encryptedSymmetricKey)
20
21//----------------- Encrypt / Decrypt with keys
22
23// Get RSA master key from Android Key Store
24masterKey = keyStoreWrapper.getAndroidKeyStoreAsymmetricKeyPair("MASTER_KEY")
25
26// Get AES wrapped raw data from preferences
27val encryptionKey = storage.getEncryptionKey()
28
29// Unwrap AES key data with RSA Private key
30symmetricKey = cipherForWrapping.unWrapKey(encryptionKey, ALGORITHM_AES, Cipher.SECRET_KEY, masterKey?.private) as SecretKey
31
32// Encrypt message with AES Secret key
33val encryptedMessage = cipherForEncryption.encrypt(message, symmetricKey)
34
35// Encrypt message with AES Secret key
36val decryptedMessage = cipherForEncryption.decrypt(encryptedMessage, symmetricKey)
37
38// Ooops, InvalidKeyException: no IV set when one expected