Cryptographie en Kotlin : chiffrement et hachage
Kotlin, en tant que langage moderne pour la JVM, donne accès à toutes les puissances de Java Cryptography Architecture (JCA). Cela permet de mettre en œuvre aussi bien le chiffrement symétrique (AES, DES) qu'asymétrique (RSA), ainsi que les fonctions de hachage cryptographique (SHA-256, MD5) et les signatures numériques. Dans cet article, nous analyserons des exemples pratiques d'utilisation de la cryptographie en Kotlin, utiles pour protéger les données dans les applications web, le développement mobile et les services backend.
Tous les exemples de code utilisent les capacités intégrées de Java, ce qui les rend multiplateformes et sans nécessité de bibliothèques supplémentaires.
1. Chiffrement symétrique AES en Kotlin
Le chiffrement symétrique utilise la même clé pour chiffrer et déchiffrer. L'algorithme AES (Advanced Encryption Standard) est la référence en matière de sécurité. Voici un exemple de chiffrement d'une chaîne avec le mode CBC et PKCS5Padding.
import javax.crypto.Cipherimport javax.crypto.KeyGeneratorimport javax.crypto.SecretKeyimport javax.crypto.spec.IvParameterSpecimport javax.crypto.spec.SecretKeySpecimport java.util.Base64
fun generateAESKey(): SecretKey { val keyGen = KeyGenerator.getInstance("AES") keyGen.init(256) // Longueur de clé : 128, 192 ou 256 bits return keyGen.generateKey()}
fun encryptAES(plainText: String, secretKey: SecretKey, iv: ByteArray): String { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") val ivSpec = IvParameterSpec(iv) cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec) val encrypted = cipher.doFinal(plainText.toByteArray()) return Base64.getEncoder().encodeToString(encrypted)}
fun decryptAES(encryptedText: String, secretKey: SecretKey, iv: ByteArray): String { val cipher = Cipher.getInstance("AES/CBC/PKCS5Padding") val ivSpec = IvParameterSpec(iv) cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec) val decoded = Base64.getDecoder().decode(encryptedText) val decrypted = cipher.doFinal(decoded) return String(decrypted)}
fun main() { val key = generateAESKey() val iv = ByteArray(16) // Vecteur d'initialisation (16 octets pour AES) // Dans un projet réel, iv doit être aléatoire et transmis avec le texte chiffré val original = "Привет, Kotlin!" val encrypted = encryptAES(original, key, iv) val decrypted = decryptAES(encrypted, key, iv) println("Оригинал: $original") println("Зашифровано: $encrypted") println("Расшифровано: $decrypted")}Important : Le vecteur d'initialisation (IV) doit être aléatoire pour chaque chiffrement et transmis en clair avec les données chiffrées. N'utilisez jamais un IV fixe en production.
2. Chiffrement asymétrique RSA en Kotlin
RSA utilise une paire de clés : une clé publique pour le chiffrement et une clé privée pour le déchiffrement. C'est idéal pour le transfert sécurisé de données entre parties.
import java.security.KeyPairGeneratorimport java.security.PrivateKeyimport java.security.PublicKeyimport javax.crypto.Cipherimport java.util.Base64
fun generateRSAKeyPair(): Pair<PublicKey, PrivateKey> { val keyGen = KeyPairGenerator.getInstance("RSA") keyGen.initialize(2048) // Taille de clé recommandée val keyPair = keyGen.generateKeyPair() return Pair(keyPair.public, keyPair.private)}
fun encryptRSA(plainText: String, publicKey: PublicKey): String { val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.ENCRYPT_MODE, publicKey) val encrypted = cipher.doFinal(plainText.toByteArray()) return Base64.getEncoder().encodeToString(encrypted)}
fun decryptRSA(encryptedText: String, privateKey: PrivateKey): String { val cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding") cipher.init(Cipher.DECRYPT_MODE, privateKey Aussi dans la bibliothèque
NaturalLanguage pour Swift : guide complet avec exemples
Frameworks CLI pour Go (Golang) : aperçu complet et comparaison
Travailler avec Kafka en C# (.NET) : la bibliothèque Confluent.Kafka
Travailler avec les dates en Rust : aperçu des bibliothèques pour le temps et le calendrier