saleks28

Encryption.kt

Sep 14th, 2020
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.87 KB | None | 0 0
  1. package io.nemiron.fileencryptor
  2.  
  3. import android.util.Log
  4. import java.security.SecureRandom
  5. import javax.crypto.Cipher
  6. import javax.crypto.SecretKeyFactory
  7. import javax.crypto.spec.IvParameterSpec
  8. import javax.crypto.spec.PBEKeySpec
  9. import javax.crypto.spec.SecretKeySpec
  10.  
  11. class Encryption {
  12.     fun encrypt(dataToEncrypt: ByteArray, password: CharArray): HashMap<String, ByteArray> {
  13.         val hashMap = HashMap<String, ByteArray>()
  14.         try {
  15.             // создаём соль на 256 байт из на основе случайного числа
  16.             val salt = ByteArray(256)
  17.             SecureRandom().nextBytes(salt)
  18.  
  19.             /** устанавливаем параметры генерации ключа: 256 бит длина; передаём пароль и соль;
  20.              * устанавливаем количество хеширований пароля с солью в 1337 раз */
  21.             val pbKeySpec = PBEKeySpec(password, salt, 1337, 256)
  22.             /** выбираем алгоритм генерации ключа: Password-based-Key-Derivative-Function 2 версии
  23.              * с генерацией SHA1 хеша длиной 160 бит */
  24.             val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
  25.             // генерируем ключ
  26.             val keyBytes = secretKeyFactory.generateSecret(pbKeySpec).encoded
  27.             // оборачиваем ключ ByteArray в объект SecretKeySpec
  28.             val keySpec = SecretKeySpec(keyBytes, "AES")
  29.  
  30.             // генерируем инициализирующий вектор на байт и оборачиваем в объект IvParameterSpec
  31.             val iv = ByteArray(16)
  32.             SecureRandom().nextBytes(iv)
  33.             val ivSpec = IvParameterSpec(iv)
  34.  
  35.             // устанавливаем параметры: AES, блочный режим CBC, дополнение блоков в байтах
  36.             val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
  37.  
  38.             // устанавливаем режим шифрования и шифруем блок данных
  39.             cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
  40.             val encrypted = cipher.doFinal(dataToEncrypt)
  41.  
  42.  
  43.             hashMap["salt"] = salt
  44.             hashMap["iv"] = iv
  45.             hashMap["encrypted"] = encrypted
  46.         }
  47.         catch (e: Exception) {
  48.             Log.e("CRTPT", "encryption exception", e)
  49.         }
  50.  
  51.         return hashMap
  52.     }
  53.  
  54.     fun decrypt(hashMap: HashMap<String, ByteArray>, password: CharArray): ByteArray? {
  55.         var decrypted: ByteArray? = null
  56.         try {
  57.             val salt = hashMap["salt"]
  58.             val iv = hashMap["iv"]
  59.             val encrypted = hashMap["encrypted"]
  60.  
  61.             // восстанавливаем ключ из пароля, соли, инициализирующего вектора
  62.             val pbKeySpec = PBEKeySpec(password, salt, 1337, 256)
  63.             val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
  64.             val keyBytes = secretKeyFactory.generateSecret(pbKeySpec).encoded
  65.             val keySpec = SecretKeySpec(keyBytes, "AES")
  66.  
  67.             // устанавливаем параметры: AES, блочный режим CBC, дополнение блоков в байтах
  68.             val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
  69.             val ivSpec = IvParameterSpec(iv)
  70.  
  71.             // устанавливаем режим расшифрования и расшифровываем блок данных
  72.             cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec)
  73.             decrypted = cipher.doFinal(encrypted)
  74.         }
  75.         catch (e: Exception) {
  76.             Log.e("CRTPT", "decryption exception", e)
  77.         }
  78.  
  79.         return decrypted
  80.     }
  81. }
Add Comment
Please, Sign In to add comment