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:
- Sürüm 4 (RFC 4880 ve RFC 6637), bugün GnuPG, Kleopatra ve çoğu posta istemcisinin kullandığı sürümdür. Mevcut araçlarla anahtar ve dosya alışverişi yaparken bunu seçin.
- Sürüm 6 (RFC 9580) güncel standarttır. Kimlik doğrulamalı şifreleme (OCB, EAX veya GCM ile AEAD), parolalar için Argon2 ve yerel Ed25519, Ed448, X25519 ve X448 anahtarları ekler.
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
- AES-OCB (RFC 7253) ve AES-EAX kimlik doğrulamalı şifreleme, sgcCrypto içinde tek başına da kullanılabilir.
- Yeni bir saf Object Pascal biriminde,
sgcCrypto_Deflate, DEFLATE ve ZLIB sıkıştırma. - Anahtar üretme, içe ve dışa aktarma, şifreleme, çözme, imzalama ve doğrulamayı tek pencerede sunan bir VCL demosu,
Demos\18.Cryptography\09.OpenPGP.
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
- Delphi'de Kuantum Sonrası Kriptografi
- Delphi'de OpenSSL mi Yerel Kripto mu: Çalışma Zamanında Seçin
- sgcCrypto, kriptografi paketindeki her şey
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.
