· 7 years ago · Aug 12, 2018, 11:10 AM
1package io.gripxtech.odoojsonrpcclient.core.utils
2
3import android.util.Base64
4import java.security.SecureRandom
5import java.util.*
6import javax.crypto.Cipher
7import javax.crypto.spec.IvParameterSpec
8import javax.crypto.spec.SecretKeySpec
9
10
11private const val algorithm = "AES"
12private const val tokenKey = "fqJfdzGDvfwbedsKSUGty3VZ9taXxMVw"
13private const val padding = "AES/CBC/PKCS5Padding"
14private const val ivSize = 16
15
16fun String.encryptAES(): String {
17 val byteArray = ByteArray(ivSize)
18 SecureRandom().nextBytes(byteArray)
19 val cipher = Cipher.getInstance(padding)
20 val secretKey = SecretKeySpec(tokenKey.toByteArray(Charsets.UTF_8), algorithm)
21 cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(byteArray))
22
23 val cipherText = cipher.doFinal(toByteArray(Charsets.UTF_8))
24 val ivAndCipherText = getCombinedArray(byteArray, cipherText)
25 return Base64.encodeToString(ivAndCipherText, Base64.NO_WRAP)
26}
27
28fun String.decryptAES(): String {
29 val ivAndCipherText = Base64.decode(this, Base64.NO_WRAP)
30 val iv = Arrays.copyOfRange(ivAndCipherText, 0, ivSize)
31 val cipherText = Arrays.copyOfRange(ivAndCipherText, ivSize, ivAndCipherText.size)
32
33 val cipher = Cipher.getInstance(padding)
34 cipher.init(Cipher.DECRYPT_MODE, SecretKeySpec(tokenKey.toByteArray(Charsets.UTF_8), algorithm), IvParameterSpec(iv))
35 return cipher.doFinal(cipherText).toString(Charsets.UTF_8)
36}
37
38private fun getCombinedArray(one: ByteArray, two: ByteArray): ByteArray {
39 val combined = ByteArray(one.size + two.size)
40 for (i in combined.indices) {
41 combined[i] = if (i < one.size) one[i] else two[i - one.size]
42 }
43 return combined
44}