Kryptographie in Kotlin: Verschlüsselung und Hashing mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Kryptographie in Kotlin: Verschlüsselung und Hashing



Kotlin, als moderne Sprache für die JVM, bietet Zugriff auf die gesamte Leistungsfähigkeit der Java Cryptography Architecture (JCA). Dies ermöglicht die Implementierung sowohl symmetrischer (AES, DES) als auch asymmetrischer (RSA) Verschlüsselung sowie kryptografischer Hash-Funktionen (SHA-256, MD5) und digitaler Signaturen. In diesem Artikel werden wir praktische Beispiele für den Einsatz von Kryptographie in Kotlin durchgehen, die für den Schutz von Daten in Webanwendungen, der mobilen Entwicklung und Backend-Diensten nützlich sind.



Alle Codebeispiele nutzen die integrierten Funktionen von Java, was sie plattformunabhängig macht und keine zusätzlichen Bibliotheken erfordert.



1. Symmetrische AES-Verschlüsselung in Kotlin



Symmetrische Verschlüsselung verwendet denselben Schlüssel zum Verschlüsseln und Entschlüsseln. Der AES-Algorithmus (Advanced Encryption Standard) ist der Goldstandard für Sicherheit. Betrachten wir ein Beispiel zur Verschlüsselung eines Strings unter Verwendung des CBC-Modus und 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) // Schlüssellänge: 128, 192 oder 256 Bit 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) // Initialisierungsvektor (16 Byte für AES) // In einem echten Projekt sollte iv zufällig sein und zusammen mit dem Chiffretext übertragen werden val original = "Привет, Kotlin!" val encrypted = encryptAES(original, key, iv) val decrypted = decryptAES(encrypted, key, iv) println("Оригинал: $original") println("Зашифровано: $encrypted") println("Расшифровано: $decrypted")}


Wichtig: Der Initialisierungsvektor (IV) sollte für jede Verschlüsselung zufällig sein und offen zusammen mit den verschlüsselten Daten übertragen werden. Verwenden Sie niemals einen festen IV in der Produktion.



2. Asymmetrische RSA-Verschlüsselung in Kotlin



RSA verwendet ein Schlüsselpaar: einen öffentlichen (public) zum Verschlüsseln und einen privaten (private) zum Entschlüsseln. Dies ist ideal für die sichere Datenübertragung zwischen Parteien.



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) // Empfohlene Schlüssellänge 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

Empfehlungen