Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package io.nemiron.fileencryptor
- import android.util.Log
- import java.security.SecureRandom
- import javax.crypto.Cipher
- import javax.crypto.SecretKeyFactory
- import javax.crypto.spec.IvParameterSpec
- import javax.crypto.spec.PBEKeySpec
- import javax.crypto.spec.SecretKeySpec
- class Encryption {
- fun encrypt(dataToEncrypt: ByteArray, password: CharArray): HashMap<String, ByteArray> {
- val hashMap = HashMap<String, ByteArray>()
- try {
- // создаём соль на 256 байт из на основе случайного числа
- val salt = ByteArray(256)
- SecureRandom().nextBytes(salt)
- /** устанавливаем параметры генерации ключа: 256 бит длина; передаём пароль и соль;
- * устанавливаем количество хеширований пароля с солью в 1337 раз */
- val pbKeySpec = PBEKeySpec(password, salt, 1337, 256)
- /** выбираем алгоритм генерации ключа: Password-based-Key-Derivative-Function 2 версии
- * с генерацией SHA1 хеша длиной 160 бит */
- val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
- // генерируем ключ
- val keyBytes = secretKeyFactory.generateSecret(pbKeySpec).encoded
- // оборачиваем ключ ByteArray в объект SecretKeySpec
- val keySpec = SecretKeySpec(keyBytes, "AES")
- // генерируем инициализирующий вектор на байт и оборачиваем в объект IvParameterSpec
- val iv = ByteArray(16)
- SecureRandom().nextBytes(iv)
- val ivSpec = IvParameterSpec(iv)
- // устанавливаем параметры: AES, блочный режим CBC, дополнение блоков в байтах
- val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
- // устанавливаем режим шифрования и шифруем блок данных
- cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec)
- val encrypted = cipher.doFinal(dataToEncrypt)
- hashMap["salt"] = salt
- hashMap["iv"] = iv
- hashMap["encrypted"] = encrypted
- }
- catch (e: Exception) {
- Log.e("CRTPT", "encryption exception", e)
- }
- return hashMap
- }
- fun decrypt(hashMap: HashMap<String, ByteArray>, password: CharArray): ByteArray? {
- var decrypted: ByteArray? = null
- try {
- val salt = hashMap["salt"]
- val iv = hashMap["iv"]
- val encrypted = hashMap["encrypted"]
- // восстанавливаем ключ из пароля, соли, инициализирующего вектора
- val pbKeySpec = PBEKeySpec(password, salt, 1337, 256)
- val secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1")
- val keyBytes = secretKeyFactory.generateSecret(pbKeySpec).encoded
- val keySpec = SecretKeySpec(keyBytes, "AES")
- // устанавливаем параметры: AES, блочный режим CBC, дополнение блоков в байтах
- val cipher = Cipher.getInstance("AES/CBC/PKCS7Padding")
- val ivSpec = IvParameterSpec(iv)
- // устанавливаем режим расшифрования и расшифровываем блок данных
- cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec)
- decrypted = cipher.doFinal(encrypted)
- }
- catch (e: Exception) {
- Log.e("CRTPT", "decryption exception", e)
- }
- return decrypted
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement