Криптография в Kotlin: шифрование и хеши

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Криптография в Kotlin: шифрование и хеширование

Современная разработка на Kotlin (особенно для Android и бэкенда) часто требует реализации криптографических функций. В этой статье мы рассмотрим основные подходы к шифрованию и хешированию данных с использованием Kotlin и стандартных библиотек Java Cryptography Extension (JCE) и Bouncy Castle.

Основные понятия

Криптография в Kotlin опирается на возможности JVM. Вы можете использовать:

  • Симметричное шифрование (AES, DES) — один ключ для шифрования и расшифровки.
  • Асимметричное шифрование (RSA) — пара ключей: публичный и приватный.
  • Хеширование (SHA-256, MD5) — необратимое преобразование данных.
  • HMAC — хеширование с секретным ключом для проверки целостности.

Настройка проекта

Для большинства примеров достаточно стандартной библиотеки Java. Для расширенных алгоритмов (например, AES с GCM) добавьте в build.gradle.kts зависимость:

dependencies {
    implementation("org.bouncycastle:bcprov-jdk15on:1.70")
}

1. Симметричное шифрование (AES)

AES — самый популярный алгоритм. Пример шифрования и расшифровки строки:

import javax.crypto.Cipher
import javax.crypto.KeyGenerator
import javax.crypto.SecretKey
import javax.crypto.spec.IvParameterSpec
import java.util.Base64

fun aesEncrypt(plainText: String, secretKey: SecretKey): String {
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    val iv = ByteArray(16) // Генерация IV
    java.security.SecureRandom().nextBytes(iv)
    cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(iv))
    val encrypted = cipher.doFinal(plainText.toByteArray())
    // Объединяем IV и шифротекст
    val combined = iv + encrypted
    return Base64.getEncoder().encodeToString(combined)
}

fun aesDecrypt(encryptedBase64: String, secretKey: SecretKey): String {
    val combined = Base64.getDecoder().decode(encryptedBase64)
    val iv = combined.copyOfRange(0, 16)
    val encrypted = combined.copyOfRange(16, combined.size)
    val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding")
    cipher.init(Cipher.DECRYPT_MODE, secretKey, IvParameterSpec(iv))
    return String(cipher.doFinal(encrypted))
}

// Использование
fun main() {
    val keyGen = KeyGenerator.getInstance("AES")
    keyGen.init(256)
    val secretKey = keyGen.generateKey()

    val original = "Hello, Kotlin Crypto!"
    val encrypted = aesEncrypt(original, secretKey)
    println("Зашифровано: $encrypted")

    val decrypted = aesDecrypt(encrypted, secretKey)
    println("Расшифровано: $decrypted")
}

2. Асимметричное шифрование (RSA)

RSA используется для безопасной передачи данных. Пример:

import java.security.KeyPairGenerator
import java.security.PrivateKey
import java.security.PublicKey
import javax.crypto.Cipher
import java.util.Base64

fun generateRSAKeyPair(): Pair<PublicKey, PrivateKey> {
    val generator = KeyPairGenerator.getInstance("RSA")
    generator.initialize(2048)
    val keyPair = generator.generateKeyPair()
    return Pair(keyPair.public, keyPair.private)
}

fun rsaEncrypt(plainText: String, publicKey: PublicKey): String {
    val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
    cipher.init(Cipher.ENCRYPT_MODE, publicKey)
    return Base64.getEncoder().encodeToString(cipher.doFinal(plainText.toByteArray()))
}

fun rsaDecrypt(encryptedBase64: String, privateKey: PrivateKey): String {
    val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")
    cipher.init(Cipher.DECRYPT_MODE, privateKey)
    return String(cipher.doFinal(Base64.getDecoder().decode(encryptedBase64)))
}

fun main() {
    val (publicKey, privateKey) = generateRSAKeyPair()
    val message = "Секретное сообщение"
    val encrypted = rsaEncrypt(message, publicKey)
    println("RSA зашифровано: $encrypted")
    val decrypted = rsaDecrypt(encrypted, privateKey)
    println("RSA расшифровано: $decrypted")
}

3. Хеширование (SHA-256)

Хеширование используется для проверки целостности и хранения паролей (с солью).

import java.security.MessageDigest
import java.security.SecureRandom

fun sha256Hash(input: String): String {
    val digest = MessageDigest.getInstance("SHA-256")
    val hashBytes = digest.digest(input.toByteArray())
    return hashBytes.joinToString("") { "%02x".format(it) }
}

fun hashWithSalt(password: String): Pair<String, String> {
    val salt = ByteArray(16)
    Secure                    

Рекомендаций