· 5 years ago · Jun 09, 2020, 09:46 PM
1package com.example.tp3_seg.entidades
2
3import android.annotation.TargetApi
4import android.os.Build
5import android.security.keystore.KeyGenParameterSpec
6import android.security.keystore.KeyProperties
7import android.util.Base64
8import androidx.annotation.RequiresApi
9import java.security.KeyStore
10import java.security.MessageDigest
11import javax.crypto.Cipher
12import javax.crypto.KeyGenerator
13import javax.crypto.SecretKey
14import javax.crypto.spec.IvParameterSpec
15
16class Criptografador {
17
18
19 val ks: KeyStore =
20 KeyStore.getInstance("AndroidKeyStore").apply { load(null) }
21
22 @RequiresApi(Build.VERSION_CODES.M)
23 fun getSecretKey(): SecretKey? {
24 var chave: SecretKey? = null
25 if(ks.containsAlias("chaveCripto")) {
26 val entrada = ks.getEntry("chaveCripto", null) as?
27 KeyStore.SecretKeyEntry
28 chave = entrada?.secretKey
29 } else {
30 val builder = KeyGenParameterSpec.Builder("chaveCripto",
31 KeyProperties.PURPOSE_ENCRYPT or
32 KeyProperties.PURPOSE_DECRYPT)
33 val keySpec = builder.setKeySize(256)
34 .setBlockModes(KeyProperties.BLOCK_MODE_CBC)
35 .setEncryptionPaddings(
36 KeyProperties.ENCRYPTION_PADDING_PKCS7).build()
37 val kg = KeyGenerator.getInstance("AES", "AndroidKeyStore")
38 kg.init(keySpec)
39 chave = kg.generateKey()
40 }
41 return chave
42 }
43
44
45 @RequiresApi(Build.VERSION_CODES.M)
46 fun cipher(original: String): ByteArray {
47 var chave = getSecretKey()
48 return cipher(original,chave)
49 }
50
51 fun cipher(original: String, chave: SecretKey?): ByteArray {
52 if (chave != null) {
53 Cipher.getInstance("AES/CBC/PKCS7Padding").run {
54 init(Cipher.ENCRYPT_MODE,chave)
55 var valorCripto = doFinal(original.toByteArray())
56 var ivCripto = ByteArray(16)
57 iv.copyInto(ivCripto,0,0,16)
58 return ivCripto + valorCripto
59 }
60 } else return byteArrayOf()
61 }
62
63
64 @TargetApi(Build.VERSION_CODES.M)
65 fun decipher(cripto: ByteArray): String{
66 var chave = getSecretKey()
67 return decipher(cripto,chave)
68 }
69 fun decipher(cripto: ByteArray, chave: SecretKey?): String{
70 if (chave != null) {
71 Cipher.getInstance("AES/CBC/PKCS7Padding").run {
72 var ivCripto = ByteArray(16)
73 var valorCripto = ByteArray(cripto.size-16)
74 cripto.copyInto(ivCripto,0,0,16)
75 cripto.copyInto(valorCripto,0,16,cripto.size)
76 val ivParams = IvParameterSpec(ivCripto)
77 init(Cipher.DECRYPT_MODE,chave,ivParams)
78 return String(doFinal(valorCripto))
79 }
80 } else return ""
81 }
82
83 fun getHash(texto: String): String{
84 var md = MessageDigest.getInstance("MD5")
85 return Base64.encodeToString(
86 md.digest(texto.toByteArray()), Base64.DEFAULT).trimEnd()
87 }
88
89
90
91
92
93}