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.