Delphi'de Kuantum Sonrası Kriptografi

· Bileşenler
Delphi'de Kuantum Sonrası Kriptografi

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 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:

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

İ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.