التشفير في 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.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) // توليد 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.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 = "رسالة سرية" val encryp