Uygulamanızın bugün taşıdığı veriler hakkında sorulmaya değer bir soru var: bu veriler ne kadar süre hassas kalır? Bir tıbbi kayıt, bir sözleşme, bir bordro dosyası, bir kimlik bilgileri kümesi. Eğer cevap birkaç yıldan fazlaysa, asıl ilginç tehdit şifrelemenizi şimdi kıran bir saldırgan değildir. Trafiği şimdi kaydeden, saklayan ve araçlar yetiştiğinde daha sonra çözen bir saldırgandır. Bu alışkanlığın bir adı var, harvest now, decrypt later (şimdi topla, sonra çöz), ve bunun için bugün kimsenin bir kuantum bilgisayar inşa etmesine gerek yoktur. Sadece birinin bunu yapacağına inanmaları yeterlidir.
Standartların önce harekete geçmesinin nedeni de budur. NIST algoritmaları 2024'te yayımladı, tarayıcılar ve CDN'ler 2025 yılında hibrit anahtar değişimini etkinleştirdi ve RSA ile eliptik eğri anahtar anlaşmasının kullanımdan kaldırılması için son tarihler artık kamuya açık kılavuzlarda yazılı. sgcWebSockets 2026.10 tüm bu setini Delphi'ye getiriyor; sgcCrypto paketinin içinde Object Pascal ile yazılmış, kurulacak veya dağıtılacak herhangi bir harici kütüphane olmadan.
Üç Algoritma, Tek Paket
Üç NIST standardı farklı işler yapar ve normalde ilk ikisini kullanırsınız:
- ML-KEM (FIPS 203) paylaşılan bir sır üzerinde anlaşır. Bugün Diffie-Hellman'ın yaptığı işin yerini alır.
- ML-DSA (FIPS 204) imzalar. RSA ve ECDSA imzalarının yerini alır.
- SLH-DSA (FIPS 205) da imzalar; yalnızca özet (hash) fonksiyonları üzerine kurulmuştur ve mevcut en muhafazakâr varsayımı istediğiniz ve imza boyutunun bedelini ödeyebileceğiniz durumlar içindir.
ML-KEM ile Anahtar Anlaşması
Bir anahtar kapsülleme mekanizması, kullanımı Diffie-Hellman'dan daha basittir. Gönderen, alıcının genel anahtarını alır ve iki şey üretir: yeni bir paylaşılan sır ve bunu ileten bir şifreli metin. Alıcı, şifreli metni tekrar aynı sırra dönüştürür.
uses
sgcCrypto_MLKEM;
var
oPublicKey, oPrivateKey, oCiphertext, oSecret, oSame: TBytes;
begin
sgcMLKEM_GenerateKeyPair(mlkem768, oPublicKey, oPrivateKey);
// the sender, who only ever sees the public key
sgcMLKEM_Encapsulate(mlkem768, oPublicKey, oCiphertext, oSecret);
// the recipient, who holds the private key, gets the same 32 bytes
oSame := sgcMLKEM_Decapsulate(mlkem768, oPrivateKey, oCiphertext);
end;
Parametre setleri mlkem512, mlkem768 ve mlkem1024'tür. FIPS 203'ün gerektirdiği girdi kontrolleri her şeyden önce çalışır, bu nedenle hatalı biçimlendirilmiş bir genel anahtar sessizce bir sır üretmek yerine hata verir ve çözülmeyen bir şifreli metin, standardın istediği örtük reddetme (implicit rejection) doğrultusunda bir hata yerine sözde rastgele bir sır döndürür.
Seçim Yapmak İstemediğinizde X-Wing
Yeni bir algoritmayı benimsemek ona güvenmek anlamına gelir. Hibrit yapılar bu kararı ortadan kaldırır: klasik bir algoritmayı kuantum sonrası bir algoritmayla birleştirirler, böylece sonuç, iki yarıdan herhangi biri geçerli olduğu sürece güvenlidir. X-Wing, X25519'u ML-KEM-768 ile eşleştirir ve tek bir anahtar çifti sunar.
uses
sgcCrypto_MLKEM_Hybrid;
var
oPublicKey, oPrivateKey, oCiphertext, oSecret: TBytes;
begin
sgcXWing_GenerateKeyPair(oPublicKey, oPrivateKey);
sgcXWing_Encapsulate(oPublicKey, oCiphertext, oSecret);
oSecret := sgcXWing_Decapsulate(oPrivateKey, oCiphertext);
end;
ML-DSA ile İmzalama
İmzalama; parametre setini, özel anahtarı, mesajı ve normalde boş olan bir bağlam dizesini alır:
uses
sgcCrypto_MLDSA;
var
oSeed, oPublicKey, oPrivateKey, oSignature: TBytes;
begin
sgcMLDSA_GenerateKeyPairAndSeed(mldsa65, oSeed, oPublicKey, oPrivateKey);
oSignature := sgcMLDSA_Sign(mldsa65, oPrivateKey, aMessage, nil);
if sgcMLDSA_Verify(mldsa65, oPublicKey, aMessage, oSignature, nil) then
ShowMessage('signature is valid');
end;
Tohum (seed) değerine dikkat edin. Bir ML-DSA özel anahtarı, üretildiği 32 bayt olarak, genişletilmiş anahtar olarak veya her ikisi olarak saklanabilir ve kütüphane üçünü de okuyup yazar. Tohum, bir yapılandırma dosyasında istediğiniz biçimdir: küçüktür ve genişletilmiş anahtar ondan deterministik olarak türetilir.
Taşınabilen Anahtarlar
Kimsenin anahtar değişimi yapamadığı bir algoritmanın pek bir faydası yoktur, bu nedenle kodlamalar yayımlanan profilleri takip eder: ML-KEM için RFC 9935, ML-DSA için RFC 9881 ve SLH-DSA için RFC 9909 uyarınca, DER veya PEM biçiminde SubjectPublicKeyInfo ve PKCS#8.
var
vPublicPEM, vPrivatePEM: string;
begin
vPublicPEM := sgcMLDSA_ExportPublicKeyPEM(mldsa65, oPublicKey);
vPrivatePEM := sgcMLDSA_ExportPrivateKeyPEM(mldsa65, oSeed, nil);
end;
Bunlar, diğer uygulamaların okuyabildiği sıradan BEGIN PUBLIC KEY ve BEGIN PRIVATE KEY bloklarıdır. Bir özel anahtar içe aktarıldığında kontrol edilir: genel yarısı yeniden türetilir ve karşılaştırılır, böylece sertifikasına ait olmayan bir anahtar, kimsenin doğrulayamayacağı imzalar üretmek yerine hemen orada reddedilir.
Sertifikalar ve Kuantum Sonrası Bir CA
Sertifikalar ve sertifika istekleri kuantum sonrası anahtarlar taşıyabilir, bir sertifika otoritesi de bir tane tutabilir; böylece tüm zincir kuantum sonrası olabilir:
var
vKey: TsgcX509SignKey;
vOptions: TsgcX509Options;
oCertDER: TBytes;
begin
vKey := sgcX509_MLDSAKey(mldsa65, oPrivateKey, oPublicKey);
vOptions.Subject.CommonName := 'My Post-Quantum CA';
vOptions.KeyUsage := [kuKeyCertSign, kuCRLSign];
oCertDER := sgcX509_CreateSelfSignedEx(vKey, vOptions);
end;
Profillerin anahtar kullanım kuralları herhangi bir şey imzalanmadan önce uygulanır, bu nedenle anahtar şifreleme (key encipherment) yapması istenen bir kuantum sonrası anahtar, kendi profilini ihlal eden bir sertifika üretmek yerine hata verir. Zincir doğrulaması artık veren sertifikaların bildirdiği yol uzunluğunu ve ad kısıtlamalarını da zorunlu kılıyor.
Zaten Entegre Edildiği Yerler
Kütüphanede, herhangi bir kriptografi yazmanıza gerek kalmadan tüm bunları sizin için kullanan iki yer vardır:
- TLS. Yerel TLS 1.3 motoru, RFC 10024'ün hibrit anahtar değişimi gruplarını,
X25519MLKEM768,SecP256r1MLKEM768veSecP384r1MLKEM1024'ü müzakere eder ve varsayılan liste zaten hibrit biriyle başlar. Bkz. OpenSSL DLL'leri Olmadan Delphi TLS 1.3. - JWT. Belirteçler (token), RFC 9964 kapsamında ML-DSA ile imzalanabilir ve doğrulanabilir. Bkz. Delphi'de ML-DSA ile JWT İmzalama.
Doğru Olduğunu Nasıl Biliyoruz
Bir standardın uygulaması, biri onu doğrulayana kadar sadece bir iddiadır. Üç algoritmanın tümü NIST bilinen yanıt vektörlerine karşı doğrulanmıştır ve bu vektörler bir veri sayfasındaki bir cümle olarak değil, çalıştırılabilir bir test seti olarak kütüphaneyle birlikte gelir. ML-DSA imzalayıcı deterministik varyanttır, bu nedenle aynı anahtar ve aynı mesaj her zaman aynı imzayı verir; bu da RFC'lerde yayımlanan örnekleri bayt bayt yeniden üretilebilir kılar.
Hangisini Kullanmalısınız
Anahtar anlaşması için bir hibrit kullanın: tek başına X-Wing veya trafik TLS ise hibrit TLS grupları. Neredeyse hiçbir şeyden ödün vermezsiniz ve hangi varsayımın yanlış çıktığı fark etmeksizin güvence altındasınızdır. İmzalar için, boyutun önemli olduğu durumlarda ML-DSA-44 ve önemli olmadığı durumlarda ML-DSA-87 ile birlikte, ML-DSA-65 mantıklı varsayılan seçimdir. İmzanın, güncelleyemeyeceğiniz bir şey (örneğin bir ürün yazılımı) tarafından yıllar sonra doğrulanacağı ve imza boyutunun uygun olduğu durumlarda SLH-DSA'ya başvurun.
Yükseltme
Tüm bunlar sgcCrypto paketinde yer alır ve hiçbir bağımlılık eklemez: OpenSSL yok, DLL yok, uygulamanızı çalıştıran makineye kurulacak hiçbir şey yok. Siz onu çağırana kadar mevcut kod dokunulmadan kalır.
Sırada Ne Var
- OpenSSL DLL'leri Olmadan Delphi TLS 1.3
- Delphi'de ML-DSA ile JWT İmzalama
- sgcWebSockets 2026.10, bu sürümdeki diğer her şey
İzleyin
Bu konuda eSeGeCe kanalında kısa bir video var.
Sorularınız, geri bildiriminiz mi var ya da geçiş konusunda yardıma mı ihtiyacınız var? Bizimle iletişime geçin — yanıtı bu kodu yazan kişilerden alacaksınız.
