Advertisement
saleks28

Encryption.kt

Sep 14th, 2020
337
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement