sgcCrypto to nowa uniwersalna biblioteka kryptograficzna dla Delphi i C++ Builder: 43 jednostki w czystym Object Pascalu, obejmujące szyfrowanie symetryczne, funkcje skrótu, podpisy cyfrowe, PKI i postkwantową wymianę kluczy. Nie ma tu komponentów działających w czasie projektowania, klas Tsgc* ani niczego do umieszczenia na formularzu. Wystarczy dodać jednostkę do klauzuli uses i wywołać funkcję, tak samo jak w przypadku procedury z RTL.
sgcCrypto jest dołączane bezpłatnie do sgcWebSockets Standard, Professional i Enterprise, więc jeśli masz już jedną z tych licencji lub All-Access, po prostu już go masz, nic nie trzeba instalować ani zamawiać osobno. Jest też sprzedawane jako samodzielny pakiet, zawierający środowisko uruchomieniowe sgcWebSockets Core, dla klientów posiadających jedynie Core lub w ogóle nieposiadających licencji sgcWebSockets.
Jak to działa
Każda jednostka eksportuje zwykłe funkcje i procedury, które przyjmują TBytes na wejściu i zwracają TBytes na wyjściu. Nie trzeba alokować żadnego obiektu kontekstu, implementować interfejsu ani szukać pliku sgcCrypto_Reg.pas, ponieważ nie ma tu niczego do zarejestrowania. Pełny kod źródłowy w Pascalu dołączony jest do każdej licencji, dzięki czemu każdy prymityw kryptograficzny można przejść krok po kroku we własnym debuggerze, zamiast gubić go w DLL-u czy powiązaniu z OpenSSL.
Biblioteka nie zależy od żadnej zewnętrznej biblioteki. Każdy algorytm, od AES po postkwantowe schematy podpisów, jest zaimplementowany bezpośrednio w jednostce, która go udostępnia, a ten sam kod źródłowy kompiluje się bez zmian od Delphi 7 po RAD Studio 13, dla Win32, Win64, Linux64, macOS, iOS i Android.
uses
sgcCrypto_Random, sgcCrypto_AES, sgcCrypto_Keccak, sgcCrypto_Ed25519,
sgcCrypto_MLKEM;
var
vKey, vIV, vPlain, vAAD, vTag, vCipher: TBytes;
vDigest, vSeed, vSignature, vMessage: TBytes;
vPublicKey, vPrivateKey, vSharedSecret, vCiphertext: TBytes;
begin
// AES-256-GCM: authenticated encryption in one call
vKey := sgcRandomBytes(32);
vIV := sgcRandomBytes(12);
vPlain := TEncoding.UTF8.GetBytes('confidential payload');
vCipher := sgcAES_GCM_Encrypt(vKey, vIV, vPlain, vAAD, vTag);
// SHA-3-256, one call, no context object to manage
vDigest := sgcSHA3_256(vPlain);
// Ed25519: sign a message
vSeed := sgcRandomBytes(32);
vMessage := TEncoding.UTF8.GetBytes('sign me');
vSignature := sgcEd25519_Sign(vSeed, vMessage);
// ML-KEM-768: post-quantum key encapsulation (FIPS 203)
sgcMLKEM_GenerateKeyPair(mlkem768, vPublicKey, vPrivateKey);
sgcMLKEM_Encapsulate(mlkem768, vPublicKey, vCiphertext, vSharedSecret);
end;
Szyfrowanie symetryczne i AEAD
sgcCrypto_AES obejmuje CBC, GCM i CTR. sgcCrypto_Modes dodaje ECB, OFB, CFB, tryb CTS z kradzieżą tekstu zaszyfrowanego oraz AES Key Wrap i Key Wrap with Padding (RFC 3394 i RFC 5649), natomiast sgcCrypto_CMAC to AES-CMAC. sgcCrypto_ChaCha implementuje ChaCha20, XChaCha20, Salsa20 i XSalsa20, a sgcCrypto_Poly1305 łączy z nimi Poly1305, tworząc szyfry AEAD ChaCha20-Poly1305 i XChaCha20-Poly1305 z RFC 8439. Każdy tag uwierzytelniający, czy to z GCM, czy z Poly1305, jest porównywany w czasie stałym, dzięki czemu nieudana weryfikacja nigdy nie zdradza, jak blisko była poprawna wartość.
Funkcje skrótu, wyprowadzanie kluczy i MAC
sgcCrypto_SHA2 i sgcCrypto_Keccak obejmują SHA-1/2, SHA-3, SHAKE, cSHAKE i KMAC, a sgcCrypto_Blake2b/Blake2s dodają BLAKE2. sgcCrypto_HMAC to uwierzytelnianie wiadomości z kluczem. Do przekształcania hasła w klucz służą sgcCrypto_KDF (PBKDF2), sgcCrypto_HKDF, sgcCrypto_Scrypt oraz sgcCrypto_Argon2, który implementuje wszystkie trzy warianty Argon2, d, i oraz id, zwycięzcę Password Hashing Competition. sgcCrypto_SipHash zapewnia szybki skrót z kluczem do wykorzystania w kluczach tablic haszujących, a sgcCrypto_TLSH to rozmyty skrót podobieństwa, przydatny raczej do wykrywania niemal identycznych danych niż jako skrót kryptograficzny.
Podpisy, wymiana kluczy i PKI
sgcCrypto_Ed25519 i sgcCrypto_Ed448 podpisują i weryfikują, a sgcCrypto_X25519 oraz sgcCrypto_X448 realizują odpowiadającą im wymianę kluczy Diffiego-Hellmana. sgcCrypto_ECCurves dodaje ECDSA i ECDH na krzywej secp256k1 oraz trzech krzywych Brainpool, z deterministycznymi nonce'ami z RFC 6979, a sgcCrypto_RSA_Keys obejmuje generowanie kluczy RSA o dowolnej długości bitowej, szyfrowanie OAEP i podpisy PSS.
Po stronie PKI, sgcCrypto_X509 analizuje certyfikat, weryfikuje, że został podpisany przez danego wystawcę, przechodzi i weryfikuje łańcuch certyfikatów oraz sprawdza CRL pod kątem unieważnienia. sgcCrypto_X509_Gen generuje od podstaw samopodpisany certyfikat X.509 lub CSR w formacie PKCS#10, wraz z alternatywnymi nazwami podmiotu, przeznaczeniem klucza i ograniczeniami długości ścieżki CA, korzystając z dedykowanego do tego celu zapisywacza DER.
Kryptografia postkwantowa
sgcCrypto implementuje również wszystkie trzy postkwantowe standardy NIST. sgcCrypto_MLKEM to enkapsulacja kluczy zgodna z FIPS 203, obejmująca wszystkie trzy zestawy parametrów, ML-KEM-512, 768 i 1024, z niejawnym odrzuceniem przy zniekształconym szyfrogramie, dzięki czemu błędne dane wejściowe nigdy nie ujawniają informacji. sgcCrypto_MLDSA to podpisywanie zgodne z FIPS 204, ML-DSA-44/65/87, a sgcCrypto_SLHDSA to FIPS 205 dla wszystkich sześciu zestawów parametrów SHAKE. Ponieważ założenie oparte na kratach jest młodsze niż krzywe eliptyczne, sgcCrypto_MLKEM_Hybrid łączy sekret X25519 z sekretem ML-KEM w jeden wspólny klucz, czyli hybrydowy wzorzec migracji, ku któremu zmierza cała branża.
Dostępność
sgcCrypto jest dołączane bezpłatnie do sgcWebSockets Standard, Professional i Enterprise oraz do All-Access. Jeśli masz już jedną z tych licencji, 43 jednostki znajdują się już w Twoim instalatorze, nie trzeba składać osobnego zamówienia. Jeśli posiadasz jedynie sgcWebSockets Core lub w ogóle nie masz licencji sgcWebSockets, sgcCrypto jest też sprzedawane jako samodzielny pakiet z dołączonym środowiskiem uruchomieniowym Core. Każda licencja, zarówno dołączona, jak i samodzielna, zawiera pełny kod źródłowy w Pascalu oraz roczny okres aktualizacji.
Pełny opis jednostek oraz możliwość samodzielnego wypróbowania znajdziesz na stronie produktu sgcCrypto.
Masz pytania lub uwagi? Skontaktuj się z nami, odpowiedź otrzymasz od osób, które napisały ten kod.
