Kryptografia

sgcWebSockets zawiera sgcCrypto, bibliotekę kryptograficzną ogólnego przeznaczenia napisaną w całości w czystym Pascalu. Nie ma ona żadnej zależności od OpenSSL ani żadnej innej biblioteki zewnętrznej i kompiluje się bez zmian od Delphi 7 do Delphi 13, na Win32, Win64, Linux64, macOS i iOS.

 

Biblioteka obejmuje haszowanie i uwierzytelnianie wiadomości, haszowanie haseł i wyprowadzanie kluczy, szyfrowanie symetryczne, klasyczną kryptografię klucza publicznego, kryptografię postkwantową, certyfikaty X.509, hasła jednorazowe, szyfrowanie archiwów oraz rozmyty skrót do wykrywania niemal identycznych danych. Jest zorganizowana jako jedna jednostka na rodzinę algorytmów (sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH i tak dalej), dzięki czemu aplikacja dołącza wyłącznie ten kod, który faktycznie wywołuje.

 

Każda funkcja jest zwykłym wywołaniem przyjmującym i zwracającym TBytes: nie ma tu komponentów do upuszczenia na formularzu ani konfiguracji w czasie projektowania. Implementacja każdego algorytmu wymienionego poniżej została porównana, bajt po bajcie, z niezależną implementacją tego samego standardu (OpenSSL, bibliotekami Pythona hashlib/cryptography lub implementacją referencyjną opublikowaną przez autorów standardu), a nie wyłącznie z własnym wynikiem, co pozwala wychwycić błąd, który jest wewnętrznie spójny, ale mimo to błędny.

 

Włączanie biblioteki

 

Jednostki kryptograficzne należą do pakietu instalacyjnego Kryptografia, kontrolowanego przez warunkową dyrektywę SGC_PACK_CRYPTO w pliku sgcVer.inc. Gdy dyrektywa jest wyłączona, każda jednostka sgcCrypto_* kompiluje się do pustej zaślepki, dzięki czemu pakiet nie trafia do kompilacji, która go nie potrzebuje. Wybierz pakiet w instalatorze, albo zdefiniuj SGC_PACK_CRYPTO w opcjach projektu, jeśli kompilujesz ze źródeł.

 

Jeśli projekt musi używać wyłącznie algorytmów zatwierdzonych przez FIPS, opcjonalna dyrektywa SGC_CRYPTO_FIPS usuwa z jednostek sgcCrypto każdy inny algorytm podczas kompilacji. Jest domyślnie wyłączona. Zobacz Tryb FIPS, aby dowiedzieć się, co zachowuje, co usuwa i dlaczego nie stanowi walidacji FIPS 140-3.

 

Jednostki sgcCrypto to również to, co pozwala reszcie biblioteki działać bez OpenSSL: przełącznik czasu działania sgcCryptoBackend (lub opcjonalna dyrektywa SGC_NATIVE_CRYPTO) oraz IOHandler iohNativeTLS. Zobacz Praca bez OpenSSL.

 

Co obejmuje ta strona

 

Poniższa tabela to pełny spis: każdy algorytm zaimplementowany w bibliotece oraz jednostka, w której się znajduje. Kolejne strony omawiają każdą rodzinę algorytmów po kolei, wraz z dokładnymi sygnaturami funkcji i krótkim przykładem w Delphi.

 

Kategoria Algorytmy Standard Jednostka
Haszowanie SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 FIPS 180-4 sgcCrypto_SHA2
Haszowanie SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, cSHAKE, KMAC FIPS 202, SP 800-185 sgcCrypto_Keccak
Haszowanie BLAKE2b (z kluczem, do 512 bitów) RFC 7693 sgcCrypto_Blake2b
Haszowanie BLAKE2s (z kluczem, do 256 bitów) RFC 7693 sgcCrypto_Blake2s
Haszowanie SipHash-2-4 — sgcCrypto_SipHash
Haszowanie RIPEMD-160, HMAC-RIPEMD160 ISO/IEC 10118-3, RFC 2286 sgcCrypto_Legacy
Haszowanie (starsze) MD4, MD5, DES-ECB, skrót NTLM v1 — sgcCrypto_Legacy
Haszowanie rozmyte Skrót i odległość TLSH — sgcCrypto_TLSH
Uwierzytelnianie wiadomości HMAC-SHA1/256/384/512, HMAC-MD5 FIPS 198-1 sgcCrypto_HMAC
Uwierzytelnianie wiadomości AES-CMAC RFC 4493 sgcCrypto_CMAC
Uwierzytelnianie wiadomości AES-GMAC SP 800-38D sgcCrypto_CMAC
Uwierzytelnianie wiadomości Poly1305 RFC 8439 sgcCrypto_Poly1305
Haszowanie haseł i KDF PBKDF2 (SHA-1/256/384/512) RFC 8018 sgcCrypto_KDF
Haszowanie haseł i KDF KDF1, KDF2, ANSI X9.63 KDF ISO 18033-2, ANSI X9.63 sgcCrypto_KDF
Haszowanie haseł i KDF scrypt RFC 7914 sgcCrypto_Scrypt
Haszowanie haseł i KDF Argon2d, Argon2i, Argon2id RFC 9106 sgcCrypto_Argon2
Haszowanie haseł i KDF HKDF (SHA-256/384) RFC 5869 sgcCrypto_HKDF
Szyfrowanie symetryczne AES-128/192/256: ECB, CBC, CFB, OFB, CTR, CBC ciphertext stealing, GCM FIPS 197, SP 800-38A/D sgcCrypto_AES, sgcCrypto_Modes
Szyfrowanie symetryczne AES-CBC bez dopełnienia oraz schematy dopełniania PKCS#7, zero, ANSI X9.23, ISO 7816-4, ISO 10126-2 i TBC SP 800-38A, ISO/IEC 9797-1 sgcCrypto_AES, sgcCrypto_Modes
Szyfrowanie symetryczne AES-CCM (AEAD) RFC 3610, SP 800-38C sgcCrypto_Modes
Szyfrowanie symetryczne AES Key Wrap, AES Key Wrap with Padding RFC 3394, RFC 5649 sgcCrypto_Modes
Szyfrowanie symetryczne ChaCha20, XChaCha20, Salsa20, XSalsa20 RFC 8439 sgcCrypto_ChaCha
Szyfrowanie symetryczne ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) RFC 8439 sgcCrypto_Poly1305
Kryptografia klucza publicznego Generowanie kluczy RSA, RSA-OAEP, RSA-PSS, podpisywanie/weryfikacja PKCS#1 v1.5 RFC 8017 sgcCrypto_RSA_Keys, sgcCrypto_RSA
Kryptografia klucza publicznego Szyfrowanie RSA PKCS#1 v1.5 RFC 8017 sgcCrypto_RSA_Keys
Kryptografia klucza publicznego Ed25519, Ed448 (podpisy) RFC 8032 sgcCrypto_Ed25519, sgcCrypto_Ed448
Kryptografia klucza publicznego X25519, X448 (uzgadnianie klucza) RFC 7748 sgcCrypto_X25519, sgcCrypto_X448
Kryptografia klucza publicznego Szyfrowanie sealed box ECIES — sgcCrypto_ECIES
Kryptografia klucza publicznego ECDSA / ECDH na NIST P-256, P-384, P-521 FIPS 186-5 sgcCrypto_EC, sgcCrypto_ECCurves
Kryptografia klucza publicznego ECDSA / ECDH na secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 SEC 2, RFC 5639 sgcCrypto_ECCurves
Kryptografia klucza publicznego Podpisy ECDSA zakodowane w DER, konwersja postaci surowej i DER RFC 3279 sgcCrypto_ECCurves, sgcCrypto_EC
Kryptografia klucza publicznego Podpisy Schnorra na secp256k1 BIP-340 sgcCrypto_ECCurves
Kryptografia klucza publicznego Eksport i import kluczy RSA i EC: PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER i PEM RFC 8017, RFC 5958, RFC 5280 sgcCrypto_RSA_Keys, sgcCrypto_ECCurves
Kryptografia postkwantowa ML-KEM-512/768/1024, hybrydowy X25519 + ML-KEM-768, X-Wing, X25519MLKEM768, SecP256r1MLKEM768, SecP384r1MLKEM1024 FIPS 203, RFC 9935, RFC 10024, draft-connolly-cfrg-xwing-kem sgcCrypto_MLKEM, sgcCrypto_MLKEM_Hybrid
Kryptografia postkwantowa ML-DSA-44/65/87 FIPS 204, RFC 9881, RFC 9964 sgcCrypto_MLDSA
Kryptografia postkwantowa SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f FIPS 205, RFC 9909 sgcCrypto_SLHDSA
Certyfikaty i PKI Parsowanie X.509, weryfikacja łańcucha i CRL RFC 5280 sgcCrypto_X509
Certyfikaty i PKI Generowanie samopodpisanych certyfikatów X.509 i żądań CSR PKCS#10 RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certyfikaty i PKI Certyfikaty X.509 i CSR podpisane kluczem EC, alternatywne nazwy podmiotu typu URI RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certyfikaty i PKI Odczyt PKCS#12 (.pfx, .p12): certyfikat, łańcuch i klucz prywatny. PBES2 z AES oraz starsze schematy Triple DES i RC2 RFC 7292, RFC 9579 sgcCrypto_PKCS12
Certyfikaty i PKI Odczyt i zapis DER / ASN.1, PEM, Base64 — sgcCrypto_ASN1, sgcCrypto_DER
Hasła jednorazowe HOTP, TOTP RFC 4226, RFC 6238 sgcCrypto_OTP
Szyfrowanie archiwów WinZip AE-1 / AE-2 WinZip AE-2 sgcCrypto_Zip_AE2
Kodowanie i narzędzia Hex, Base32, Base64url, porównanie w stałym czasie, bezpieczne zerowanie, losowe bajty RFC 4648 sgcCrypto_Encoding, sgcCrypto_Random

 

Omówienie punkt po punkcie

 

1. Haszowanie i uwierzytelnianie wiadomości: SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC i Poly1305, elementy składowe, z których zbudowana jest niemal każda inna funkcja z tej strony.

 

2. Haszowanie haseł i wyprowadzanie kluczy: PBKDF2, scrypt, Argon2id i HKDF. Przechowywanie hasła i wyprowadzanie klucza z istniejącego już sekretu to dwa różne zadania; ta strona wyjaśnia dlaczego i która funkcja pasuje do którego przypadku.

 

3. Szyfrowanie symetryczne: AES we wszystkich trybach obsługiwanych przez bibliotekę, zawijanie kluczy AES, ChaCha20/Salsa20 oraz ich konstrukcje AEAD oparte na Poly1305, a także dlaczego tryb uwierzytelniony powinien być wyborem domyślnym.

 

4. Kryptografia klucza publicznego: podpisy RSA, Ed25519/Ed448, uzgadnianie klucza X25519/X448, ECIES oraz ECDSA/ECDH na krzywych NIST, secp256k1 i Brainpool, a także podpisy Schnorra BIP-340.

 

5. Kryptografia postkwantowa: ML-KEM, ML-DSA i SLH-DSA, trzy schematy ustandaryzowane przez NIST w FIPS 203-205, oraz konstrukcja hybrydowa, którą warto wdrożyć już dziś.

 

6. Certyfikaty i PKI: parsowanie i weryfikacja otrzymanych certyfikatów X.509 oraz generowanie własnych certyfikatów samopodpisanych i żądań PKCS#10, podpisanych kluczem RSA albo EC.

 

7. Hasła jednorazowe: HOTP i TOTP, kody generowane przez aplikację uwierzytelniającą, wraz z URI do aprowizacji.

 

8. Haszowanie rozmyte (TLSH): skrót wrażliwy na lokalność (locality sensitive hash) do wykrywania niemal identycznych danych, w odróżnieniu od każdego innego skrótu na tej stronie nie jest przeznaczony do integralności ani bezpieczeństwa.

 

9. Szyfrowanie archiwów WinZip AE-2: szyfrowanie AES stosowane wewnątrz archiwów .zip oraz to, co chroni, a czego nie.

 

10. Tryb FIPS: przełącznik kompilacji, który pozostawia w bibliotece wyłącznie algorytmy zatwierdzone przez FIPS, to, co usuwa i sprawdza, oraz dlaczego nie stanowi walidacji FIPS 140-3.

 

Dema

 

Folder Demos\18.Cryptography zawiera siedem uruchamialnych aplikacji, po jednej dla każdego z powyższych obszarów (haszowanie, szyfrowanie symetryczne, hasła, klucz publiczny, postkwantowa, certyfikaty oraz hasła jednorazowe wraz z WinZip AE-2), z których każda pokazuje API w użyciu i wyjaśnia sposób rozumowania stojący za zalecanymi wyborami.