· 7 years ago · Feb 12, 2018, 06:22 AM
1class Encryptor(private val sharedPreferences: SharedPreferences) {
2 private val ANDROID_KEY_STORE = "AndroidKeyStore"
3
4 private var initVector: ByteArray? = null
5 private var encryption: ByteArray? = null
6 private val TRANSFORMATION = "AES/GCM/NoPadding"
7
8 @Throws(Exception::class)
9 fun encryptTextWithAES(alias: String, textToEncrypt: String): ByteArray? {
10 var alias = alias
11
12 alias = alias + "_AES"
13
14 val cipher = Cipher.getInstance(TRANSFORMATION)
15 cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(alias, KeyProperties.KEY_ALGORITHM_AES))
16
17 initVector = cipher.iv
18 encryption = cipher.doFinal(textToEncrypt.toByteArray(StandardCharsets.UTF_8))
19 val base64InitVector = Base64.encodeToString(initVector, Base64.NO_WRAP)
20 val base64Encryption = Base64.encodeToString(encryption, Base64.NO_WRAP)
21 sharedPreferences.edit().putString(alias + "_initVector", base64InitVector).apply()
22 sharedPreferences.edit().putString(alias + "_encryption", base64Encryption).apply()
23
24 Log.d("AndroidKeyStore", "aliases: " + getAllAliasesInTheKeystore())
25 return encryption
26 }
27
28 @Throws(Exception::class)
29 private fun getAllAliasesInTheKeystore(): ArrayList<String> {
30 val keyStore = KeyStore.getInstance("AndroidKeyStore")
31 keyStore.load(null)
32 return Collections.list(keyStore.aliases())
33 }
34
35 @Throws(Exception::class)
36 private fun getSecretKey(alias: String, algorithm: String): SecretKey {
37
38 val keyGenerator: KeyGenerator
39
40 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
41 keyGenerator = KeyGenerator.getInstance(algorithm, ANDROID_KEY_STORE)
42 keyGenerator.init(KeyGenParameterSpec.Builder(alias, KeyProperties.PURPOSE_ENCRYPT or KeyProperties.PURPOSE_DECRYPT)
43 .setBlockModes(KeyProperties.BLOCK_MODE_GCM)
44 .setEncryptionPaddings(KeyProperties.ENCRYPTION_PADDING_NONE)
45 .build())
46 } else {
47 keyGenerator = KeyGenerator.getInstance(KeyProperties.KEY_ALGORITHM_AES, ANDROID_KEY_STORE)
48 keyGenerator.init(SecureRandom.getInstance(KeyProperties.KEY_ALGORITHM_AES))
49 }
50 return keyGenerator.generateKey()
51 }
52
53 fun encryptTextWithRSA(alias: String, textToEncrypt: String): ByteArray? {
54 var alias = alias
55 alias = alias + "_RSA"
56 var publicKey: Key? = null
57 var privateKey: Key? = null
58 try {
59 getAllAliasesInTheKeystore()
60 val kpg = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, ANDROID_KEY_STORE)
61 kpg.initialize(1024)
62 val kp = kpg.genKeyPair()
63 publicKey = kp.public
64 privateKey = kp.private
65 } catch (e: Exception) {
66 e.printStackTrace()
67 }
68
69 // Encode the original data with RSA private key
70 var encodedBytes: ByteArray? = null
71 try {
72 val c = Cipher.getInstance("RSA")
73 c.init(Cipher.ENCRYPT_MODE, privateKey)
74 encodedBytes = c.doFinal(textToEncrypt.toByteArray())
75 val base64PublicKey = Base64.encodeToString(publicKey!!.encoded, Base64.NO_WRAP)
76 val base64Encrypted = Base64.encodeToString(encodedBytes, Base64.NO_WRAP)
77
78 sharedPreferences.edit().putString(alias + "_publicKey", base64PublicKey).apply()
79 sharedPreferences.edit().putString(alias + "_encryption", base64Encrypted).apply()
80 } catch (e: Exception) {
81 e.printStackTrace()
82 }
83 return encodedBytes
84 }
85}