Cryptographie en Kotlin : chiffrement et hachage
Le développement moderne en Kotlin (notamment pour Android et le backend) nécessite souvent l'implémentation de fonctions cryptographiques. Dans cet article, nous examinerons les principales approches de chiffrement et de hachage des données en utilisant Kotlin et les bibliothèques standard Java Cryptography Extension (JCE) et Bouncy Castle.
Concepts de base
La cryptographie en Kotlin s'appuie sur les capacités de la JVM. Vous pouvez utiliser :
- Chiffrement symétrique (AES, DES) — une seule clé pour le chiffrement et le déchiffrement.
- Chiffrement asymétrique (RSA) — une paire de clés : publique et privée.
- Hachage (SHA-256, MD5) — transformation irréversible des données.
- HMAC — hachage avec une clé secrète pour vérifier l'intégrité.
Configuration du projet
Pour la plupart des exemples, la bibliothèque standard Java suffit. Pour les algorithmes avancés (par exemple, AES avec GCM), ajoutez la dépendance dans build.gradle.kts :
dependencies { implementation("org.bouncycastle:bcprov-jdk15on:1.70")}1. Chiffrement symétrique (AES)
AES est l'algorithme le plus populaire. Exemple de chiffrement et déchiffrement d'une chaîne :
import javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.SecretKeyimport javax.crypto.spec.IvParameterSpecimport java.util.Base64
fun aesEncrypt(plainText: String, secretKey: SecretKey): String { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") val iv = ByteArray(16) // Génération de l'IV java.security.SecureRandom().nextBytes(iv) cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(iv)) val encrypted = cipher.doFinal(plainText.toByteArray()) // Combinaison de l'IV et du texte chiffré 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))}
// Utilisationfun main() { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(256) val secretKey = keyGen.generateKey()
val original = "Hello, Kotlin Crypto!" val encrypted = aesEncrypt(original, secretKey) println("Chiffré : $encrypted")
val decrypted = aesDecrypt(encrypted, secretKey) println("Déchiffré : $decrypted")}2. Chiffrement asymétrique (RSA)
RSA est utilisé pour la transmission sécurisée des données. Exemple :
import java.security.KeyPairGeneratorimport java.security.PrivateKeyimport java.security.PublicKeyimport javax.crypto.Cipherimport 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 = "Message secret" val encryp Aussi dans la bibliothèque
Files d'attente de tâches pour TypeScript : Bull, Bee-Queue et traitement asynchrone
Génération de PDF en JavaScript (Node.js) : bibliothèques et outils
ORM pour Rust : comparaison et exemples d'utilisation de Diesel, SeaORM et SQLx
Client Redis pour C++ : connexion, installation et exemples d'utilisation
Travailler avec S3 et les stockages cloud en TypeScript : bibliothèques et exemples