Cryptografie

sgcWebSockets bevat sgcCrypto, een algemeen bruikbare cryptografiebibliotheek die volledig in pure Pascal is geschreven. Ze heeft geen afhankelijkheid van OpenSSL of enige andere externe bibliotheek, en compileert ongewijzigd van Delphi 7 tot en met Delphi 13, op Win32, Win64, Linux64, macOS en iOS.

De bibliotheek omvat hashing en berichtauthenticatie, wachtwoordhashing en sleutelafleiding, symmetrische versleuteling, klassieke public key-cryptografie, post-quantumcryptografie, X.509-certificaten, eenmalige wachtwoorden, archiefversleuteling en een fuzzy hash voor de detectie van bijna-duplicaten. Ze is georganiseerd als één unit per algoritmefamilie (sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH, enzovoort), zodat een toepassing alleen de code meeneemt die ze daadwerkelijk aanroept.

Elke functie is een eenvoudige aanroep die TBytes ontvangt en teruggeeft: er zijn geen componenten om op een formulier te plaatsen en geen ontwerptijdconfiguratie. De implementatie van elk hieronder vermeld algoritme is byte voor byte gecontroleerd tegen een onafhankelijke implementatie van dezelfde standaard (OpenSSL, Python's hashlib/cryptography, of een referentie-implementatie gepubliceerd door de auteurs van de standaard) in plaats van alleen tegen de eigen uitvoer, wat nu net de manier is om een fout op te sporen die intern consistent maar toch onjuist is.

De bibliotheek inschakelen

De cryptografie-units behoren tot het installatiepakket Cryptography, gestuurd door de voorwaardelijke define SGC_PACK_CRYPTO in sgcVer.inc. Wanneer de define is uitgeschakeld, compileert elke sgcCrypto_*-unit naar een lege stub, waardoor het pakket buiten een build blijft die het niet nodig heeft. Selecteer het pakket in het installatieprogramma, of definieer SGC_PACK_CRYPTO in uw projectopties als u vanuit de broncode compileert.

Als een project uitsluitend FIPS-goedgekeurde algoritmen mag gebruiken, verwijdert de optionele define SGC_CRYPTO_FIPS tijdens het compileren elk ander algoritme uit de sgcCrypto-units. Deze staat standaard uit. Zie FIPS-modus voor wat de define behoudt, wat hij verwijdert en waarom het geen FIPS 140-3-validatie is.

De sgcCrypto-units zijn ook wat de rest van de bibliotheek laat draaien zonder OpenSSL: de sgcCryptoBackend-runtimeschakelaar (of de optionele SGC_NATIVE_CRYPTO-define) en de iohNativeTLS-IOHandler. Zie Werken zonder OpenSSL.

Wat deze pagina behandelt

De onderstaande tabel is de volledige inventaris: elk algoritme dat de bibliotheek implementeert, en in welke unit het zich bevindt. De volgende pagina's lichten elke familie één voor één toe, met de exacte functiesignaturen en een kort Delphi-voorbeeld.

Categorie Algoritmen Standaard Unit
Hashing SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 FIPS 180-4 sgcCrypto_SHA2
Hashing SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, cSHAKE, KMAC FIPS 202, SP 800-185 sgcCrypto_Keccak
Hashing BLAKE2b (keyed, up to 512 bit) RFC 7693 sgcCrypto_Blake2b
Hashing BLAKE2s (keyed, up to 256 bit) RFC 7693 sgcCrypto_Blake2s
Hashing SipHash-2-4 — sgcCrypto_SipHash
Hashing RIPEMD-160, HMAC-RIPEMD160 ISO/IEC 10118-3, RFC 2286 sgcCrypto_Legacy
Hashing (verouderd) MD4, MD5, DES-ECB, NTLM v1 hash — sgcCrypto_Legacy
Fuzzy hashing TLSH digest and distance — sgcCrypto_TLSH
Berichtauthenticatie HMAC-SHA1/256/384/512, HMAC-MD5 FIPS 198-1 sgcCrypto_HMAC
Berichtauthenticatie AES-CMAC RFC 4493 sgcCrypto_CMAC
Berichtauthenticatie AES-GMAC SP 800-38D sgcCrypto_CMAC
Berichtauthenticatie Poly1305 RFC 8439 sgcCrypto_Poly1305
Wachtwoordhashing & KDF PBKDF2 (SHA-1/256/384/512) RFC 8018 sgcCrypto_KDF
Wachtwoordhashing & KDF KDF1, KDF2, ANSI X9.63 KDF ISO 18033-2, ANSI X9.63 sgcCrypto_KDF
Wachtwoordhashing & KDF scrypt RFC 7914 sgcCrypto_Scrypt
Wachtwoordhashing & KDF Argon2d, Argon2i, Argon2id RFC 9106 sgcCrypto_Argon2
Wachtwoordhashing & KDF HKDF (SHA-256/384) RFC 5869 sgcCrypto_HKDF
Symmetrische versleuteling AES-128/192/256: ECB, CBC, CFB, OFB, CTR, CBC ciphertext stealing, GCM FIPS 197, SP 800-38A/D sgcCrypto_AES, sgcCrypto_Modes
Symmetrische versleuteling AES-CBC with no padding, and the PKCS#7, zero, ANSI X9.23, ISO 7816-4, ISO 10126-2 and TBC padding schemes SP 800-38A, ISO/IEC 9797-1 sgcCrypto_AES, sgcCrypto_Modes
Symmetrische versleuteling AES-CCM (AEAD) RFC 3610, SP 800-38C sgcCrypto_Modes
Symmetrische versleuteling AES Key Wrap, AES Key Wrap with Padding RFC 3394, RFC 5649 sgcCrypto_Modes
Symmetrische versleuteling ChaCha20, XChaCha20, Salsa20, XSalsa20 RFC 8439 sgcCrypto_ChaCha
Symmetrische versleuteling ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) RFC 8439 sgcCrypto_Poly1305
Public key-cryptografie RSA key generation, RSA-OAEP, RSA-PSS, PKCS#1 v1.5 sign/verify RFC 8017 sgcCrypto_RSA_Keys, sgcCrypto_RSA
Public key-cryptografie RSA PKCS#1 v1.5 encryption RFC 8017 sgcCrypto_RSA_Keys
Public key-cryptografie Ed25519, Ed448 (signatures) RFC 8032 sgcCrypto_Ed25519, sgcCrypto_Ed448
Public key-cryptografie X25519, X448 (key agreement) RFC 7748 sgcCrypto_X25519, sgcCrypto_X448
Public key-cryptografie ECIES sealed box encryption — sgcCrypto_ECIES
Public key-cryptografie ECDSA / ECDH on NIST P-256, P-384, P-521 FIPS 186-5 sgcCrypto_EC, sgcCrypto_ECCurves
Public key-cryptografie ECDSA / ECDH on secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 SEC 2, RFC 5639 sgcCrypto_ECCurves
Public key-cryptografie ECDSA DER encoded signatures, raw and DER conversion RFC 3279 sgcCrypto_ECCurves, sgcCrypto_EC
Public key-cryptografie Schnorr signatures on secp256k1 BIP-340 sgcCrypto_ECCurves
Public key-cryptografie RSA and EC key export and import: PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER and PEM RFC 8017, RFC 5958, RFC 5280 sgcCrypto_RSA_Keys, sgcCrypto_ECCurves
Post-quantumcryptografie ML-KEM-512/768/1024, hybrid 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
Post-quantumcryptografie ML-DSA-44/65/87 FIPS 204, RFC 9881, RFC 9964 sgcCrypto_MLDSA
Post-quantumcryptografie SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f FIPS 205, RFC 9909 sgcCrypto_SLHDSA
Certificaten & PKI PKCS#12 (.pfx, .p12) reading: leaf certificate, chain and private key. PBES2 with AES, and the legacy Triple DES and RC2 schemes RFC 7292, RFC 9579 sgcCrypto_PKCS12
Certificaten & PKI X.509 parsing, chain and CRL verification RFC 5280 sgcCrypto_X509
Certificaten & PKI X.509 self-signed certificate and PKCS#10 CSR generation RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certificaten & PKI EC signed X.509 certificates and CSRs, URI subject alternative names RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certificaten & PKI DER / ASN.1 reader and writer, PEM, Base64 — sgcCrypto_ASN1, sgcCrypto_DER
Eenmalige wachtwoorden HOTP, TOTP RFC 4226, RFC 6238 sgcCrypto_OTP
Archiefversleuteling WinZip AE-1 / AE-2 WinZip AE-2 sgcCrypto_Zip_AE2
Encodering & hulpprogramma's Hex, Base32, Base64url, constant time compare, secure zero, random bytes RFC 4648 sgcCrypto_Encoding, sgcCrypto_Random

Één voor één toegelicht

1. Hashing & berichtauthenticatie: SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC en Poly1305, de bouwstenen waarop bijna elk ander algoritme op deze pagina is gebaseerd.

2. Wachtwoordhashing & sleutelafleiding: PBKDF2, scrypt, Argon2id en HKDF. Een wachtwoord opslaan en een sleutel afleiden van een bestaand geheim zijn twee verschillende taken; deze pagina legt uit waarom, en welke functie bij welke taak past.

3. Symmetrische versleuteling: AES in elke modus die de bibliotheek ondersteunt, AES-sleutelwrapping, ChaCha20/Salsa20 en hun Poly1305 AEAD-constructies, en waarom een geauthenticeerde modus de standaardkeuze zou moeten zijn.

4. Public key-cryptografie: RSA, Ed25519/Ed448-handtekeningen, X25519/X448-sleuteluitwisseling, ECIES, ECDSA/ECDH op de NIST-, secp256k1- en Brainpool-curven, en BIP-340 Schnorr-handtekeningen.

5. Post-quantumcryptografie: ML-KEM, ML-DSA en SLH-DSA, de drie schema's die NIST heeft gestandaardiseerd in FIPS 203-205, en de hybride constructie om vandaag al in te zetten.

6. Certificaten & PKI: het parseren en verifiëren van X.509-certificaten die u ontvangt, en het genereren van uw eigen zelfondertekende certificaten en PKCS#10-aanvragen, ondertekend met een RSA- of een EC-sleutel.

7. Eenmalige wachtwoorden: HOTP en TOTP, de codes die een authenticator-app genereert, inclusief de provisioning-URI.

8. Fuzzy hashing (TLSH): een locality sensitive hash voor de detectie van bijna-duplicaten; in tegenstelling tot elke andere hash op deze pagina is deze niet bedoeld voor integriteit of beveiliging.

9. WinZip AE-2-archiefversleuteling: de AES-versleuteling die binnen .zip-archieven wordt gebruikt, en wat deze wel en niet beschermt.

10. FIPS-modus: een compileerschakelaar die alleen FIPS-goedgekeurde algoritmen in de bibliotheek overlaat, wat hij verwijdert en controleert, en waarom het geen FIPS 140-3-validatie is.

Demo's

De map Demos\18.Cryptography bevat zeven uitvoerbare toepassingen, één per bovenstaand gebied (hashing, symmetrische versleuteling, wachtwoorden, public key, post-quantum, certificaten, en eenmalige wachtwoorden met WinZip AE-2), die elk de API in gebruik tonen en de redenering achter de aanbevolen keuzes uitleggen.