Delphi'de OpenPGP: GnuPG Olmadan Şifreleyin, İmzalayın ve Doğrulayın

· Bileşenler
Delphi'de OpenPGP: GnuPG Olmadan Şifreleyin, İmzalayın ve Doğrulayın

OpenPGP, birçok kurumun dosya alışverişi yaptığı yöntem olmaya devam ediyor. Bir banka ödeme dosyalarının kendi açık anahtarıyla şifrelenmesini ister, bir iş ortağı raporları GnuPG ile şifreleyerek gönderir, bir sürümün ayrık bir imzayla dağıtılması gerekir. Delphi'den bu genellikle her makineye GnuPG kurmak ve gpg.exe dosyasını komut satırından çağırmak anlamına geliyordu; yanında yol, anahtar halkası ve çıkış kodu yönetiminin tüm yükü de geliyordu.

sgcCrypto artık OpenPGP'yi kendisi, saf Object Pascal ile uyguluyor. Dağıtılacak bir DLL, çağrılacak bir komut satırı aracı ve Indy bağımlılığı yok. Anahtarlar, şifreleme, çözme, imzalar ve doğrulama, TBytes üzerinde birkaç fonksiyon çağrısından ibaret ve sonuç GnuPG ile iki yönde de birlikte çalışır.

Sürüm 4 ve Sürüm 6

Biçimin iki kuşağı desteklenir:

Birden çok alıcıya şifrelediğinizde kütüphane, hepsinin okuyabileceği biçimi seçer: hepsi destekliyorsa RFC 9580'in AEAD biçimini, aksi halde klasik bütünlük korumalı biçimi. Eski ve yeni anahtarların karışımına gönderilen bir mesaj yine de her yerde açılır.

Anahtar Üretme

Tek bir çağrı eksiksiz bir anahtar oluşturur: bir birincil imzalama anahtarı, bir şifreleme alt anahtarı, kullanıcı kimliği ve bunları birbirine bağlayan öz imzalar.

uses
  sgcCrypto_PGP, sgcCrypto_PGP_Cert;

var
  oAlice: TsgcPGPKey;
begin
  // v4 Ed25519 + Curve25519, the default key type of GnuPG
  oAlice := sgcPGP_GenerateKey('Alice <alice@example.com>', 'secret',
    pgpkEd25519, 4);
  try
    Memo1.Text := oAlice.SaveToArmored(False);  // public key, share it
    SaveSecretKey(oAlice.SaveToArmored(True));  // protected secret key
  finally
    oAlice.Free;
  end;
end;

Anahtar türleri RSA 2048, 3072 ve 4096, Ed25519, Ed448 (sürüm 6) ile NIST P-256, P-384 ve P-521 üzerinde ECDSA ve ECDH'dir. Brainpool anahtarları içe aktarılabilir. Gizli anahtarlar parolanızla korunur; sürüm 4 için yinelemeli SHA-256, sürüm 6 için AES-OCB ile Argon2 kullanılır.

Şifreleme ve Çözme

Bir veya daha fazla açık anahtara şifreleyin, isterseniz gönderen tarafından imzalanmış olarak. Çıktı varsayılan olarak ASCII zırhlıdır, bir postaya eklemeye veya bir sunucuya yüklemeye hazırdır.

// encrypt to Bob, signed by Alice, compressed with ZIP
vEncrypted := sgcPGP_Encrypt(vData, [oBob], oAlice);

// or protect a file with a passphrase only
vEncrypted := sgcPGP_EncryptSymmetric(vData, 'shared passphrase');

Çözme işlemi gizli anahtarlarınızı içeren bir anahtar halkası alır. Kilitli bir anahtarın kilidi parolayla özel bir kopya üzerinde açılır, böylece anahtar halkasının kendisi hiç değişmez. Sonuç, mesajın kimin için olduğunu, nasıl şifrelendiğini ve içindeki imzanın geçerli olup olmadığını söyler.

var
  oRing: TsgcPGPKeyRing;
  vResult: TsgcPGPDecryptResult;
begin
  oRing := TsgcPGPKeyRing.Create;
  try
    oRing.LoadFromFile('bob-secret.asc');
    vData := sgcPGP_Decrypt(vEncrypted, oRing, 'bob passphrase', oContacts,
      vResult);
    if vResult.Verify.Valid then
      Log('Signed by ' + vResult.Verify.SignerUserID);
  finally
    oRing.Free;
  end;
end;

İmzalama ve Doğrulama

Dosyalar ve sürümler için ayrık imzalar, satır içi imzalı mesajlar ve okunabilir kalması gereken metinler için açık metin imzaları desteklenir; satır sonundan bağımsız imzalar için metin modu da vardır.

// detached signature, the classic file.sig
vSignature := sgcPGP_Sign(vData, oAlice);
if sgcPGP_VerifyDetached(vData, vSignature, oContacts, vVerify) then
  Log('Valid signature from ' + vVerify.SignerUserID);

// cleartext signed text, readable without any tool
vSigned := sgcPGP_ClearSign('Payment batch 2026-10 approved', oAlice);

GnuPG ile Birlikte Çalışır

Her özellik GnuPG 2.4.5'e karşı iki yönde de test edildi: GnuPG'nin ürettiği dosyalar ve imzalar Delphi'de çözülür ve doğrulanır, kütüphanenin ürettiği her şey gpg --decrypt ve gpg --verify tarafından kabul edilir. Buna, GnuPG 2.4'ün kendi ürettiği anahtarlar için varsayılan olarak yazdığı ve birçok OpenPGP kütüphanesinin okuyamadığı OCB şifreli mesajlar da dahildir. Sürüm 6 desteği, RFC 9580'in örnek anahtarları ve mesajlarıyla denetlendi.

Anahtarlar iki dünya arasında zırhlı metin olarak taşınır. Bir anahtarı Delphi'den dışa aktarıp gpg --import çalıştırın veya gpg --export --armor çıktısını bir TsgcPGPKeyRing içine yükleyin.

Güvenilmeyen Girdi İçin Tasarlandı

Dışarıdan gelen dosyaları çözen bir uygulama, bazılarının düşmanca olduğunu varsaymak zorundadır. Kütüphane eski korumasız şifreleme biçimini reddeder, her çözme hatasını aynı hatayla bildirir, böylece bir kehanet mekanizması olarak kullanılamaz, belgelerdeki SHA-1 imzalarını reddeder ve parola iş faktörleri ile açılmış veri boyutu için sınırlara sahiptir, böylece özel hazırlanmış bir mesaj sunucuyu meşgul edemez.

Başka Neler Yeni

OpenPGP birimleri Delphi 7'den Delphi 13'e ve C++Builder ile Win32 ve Win64 için derlenir. DSA ve ElGamal anahtarları yüklenebilir ancak kullanılamaz, eski CAST5, 3DES ve IDEA şifreleri desteklenmez.

Sırada Ne Var

Belirli bir entegrasyon, bir banka biçimi veya içe aktarmanız gereken bir anahtar hakkında sorularınız mı var? İletişime geçin. Kodu yazan kişilerden yanıt alacaksınız.