Crittografia

sgcWebSockets include sgcCrypto, una libreria di crittografia general purpose scritta interamente in Pascal puro. Non ha alcuna dipendenza da OpenSSL o da altre librerie esterne, e si compila senza modifiche da Delphi 7 a Delphi 13, su Win32, Win64, Linux64, macOS e iOS.

La libreria copre hashing e autenticazione dei messaggi, hashing delle password e derivazione delle chiavi, crittografia simmetrica, crittografia a chiave pubblica classica, crittografia post-quantistica, certificati X.509, password monouso, cifratura degli archivi e un fuzzy hash per il rilevamento di quasi duplicati. È organizzata come un'unit per ogni famiglia di algoritmi (sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH, e così via), in modo che un'applicazione includa solo il codice che effettivamente utilizza.

Ogni funzione è una semplice chiamata che accetta e restituisce TBytes: non ci sono componenti da posizionare su una form e nessuna configurazione a design time. L'implementazione di ogni algoritmo elencato di seguito è stata verificata, byte per byte, rispetto a un'implementazione indipendente dello stesso standard (OpenSSL, hashlib/cryptography di Python, oppure un'implementazione di riferimento pubblicata dagli stessi autori dello standard) e non solo rispetto al proprio output, che è ciò che permette di individuare un bug internamente coerente ma comunque errato.

Attivazione della libreria

Le unit di crittografia appartengono al pacchetto di installazione Cryptography, controllato dalla direttiva condizionale SGC_PACK_CRYPTO in sgcVer.inc. Con la direttiva disattivata, ogni unit sgcCrypto_* viene compilata come uno stub vuoto, il che mantiene il pacchetto fuori da una build che non ne ha bisogno. Selezionare il pacchetto dall'installer, oppure definire SGC_PACK_CRYPTO nelle opzioni del progetto se si compila dal sorgente.

Se un progetto deve utilizzare solo algoritmi approvati FIPS, la direttiva facoltativa SGC_CRYPTO_FIPS rimuove ogni altro algoritmo dalle unit sgcCrypto in fase di compilazione. È disattivata per impostazione predefinita. Vedere Modalità FIPS per sapere cosa mantiene, cosa rimuove e perché non è una validazione FIPS 140-3.

Le unit sgcCrypto sono anche ciò che permette al resto della libreria di funzionare senza OpenSSL: l'interruttore in tempo di esecuzione sgcCryptoBackend (o la direttiva opzionale SGC_NATIVE_CRYPTO) e l'IOHandler iohNativeTLS. Vedere Eseguire senza OpenSSL.

Cosa tratta questa pagina

La tabella seguente è l'inventario completo: ogni algoritmo implementato dalla libreria e l'unit in cui risiede. Le pagine successive spiegano ogni famiglia una per una, con le firme esatte delle funzioni e un breve esempio Delphi.

Categoria Algoritmi Standard 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, fino a 512 bit) RFC 7693 sgcCrypto_Blake2b
Hashing BLAKE2s (keyed, fino a 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 (legacy) MD4, MD5, DES-ECB, hash NTLM v1 — sgcCrypto_Legacy
Fuzzy hashing digest e distanza TLSH — sgcCrypto_TLSH
Autenticazione dei messaggi HMAC-SHA1/256/384/512, HMAC-MD5 FIPS 198-1 sgcCrypto_HMAC
Autenticazione dei messaggi AES-CMAC RFC 4493 sgcCrypto_CMAC
Autenticazione dei messaggi AES-GMAC SP 800-38D sgcCrypto_CMAC
Autenticazione dei messaggi Poly1305 RFC 8439 sgcCrypto_Poly1305
Hashing delle password e KDF PBKDF2 (SHA-1/256/384/512) RFC 8018 sgcCrypto_KDF
Hashing delle password e KDF KDF1, KDF2, ANSI X9.63 KDF ISO 18033-2, ANSI X9.63 sgcCrypto_KDF
Hashing delle password e KDF scrypt RFC 7914 sgcCrypto_Scrypt
Hashing delle password e KDF Argon2d, Argon2i, Argon2id RFC 9106 sgcCrypto_Argon2
Hashing delle password e KDF HKDF (SHA-256/384) RFC 5869 sgcCrypto_HKDF
Crittografia simmetrica AES-128/192/256: ECB, CBC, CFB, OFB, CTR, CBC ciphertext stealing, GCM FIPS 197, SP 800-38A/D sgcCrypto_AES, sgcCrypto_Modes
Crittografia simmetrica AES-CBC senza padding, e gli schemi di padding PKCS#7, zero, ANSI X9.23, ISO 7816-4, ISO 10126-2 e TBC SP 800-38A, ISO/IEC 9797-1 sgcCrypto_AES, sgcCrypto_Modes
Crittografia simmetrica AES-CCM (AEAD) RFC 3610, SP 800-38C sgcCrypto_Modes
Crittografia simmetrica AES Key Wrap, AES Key Wrap with Padding RFC 3394, RFC 5649 sgcCrypto_Modes
Crittografia simmetrica ChaCha20, XChaCha20, Salsa20, XSalsa20 RFC 8439 sgcCrypto_ChaCha
Crittografia simmetrica ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) RFC 8439 sgcCrypto_Poly1305
Crittografia a chiave pubblica generazione chiavi RSA, RSA-OAEP, RSA-PSS, firma/verifica PKCS#1 v1.5 RFC 8017 sgcCrypto_RSA_Keys, sgcCrypto_RSA
Crittografia a chiave pubblica Cifratura RSA PKCS#1 v1.5 RFC 8017 sgcCrypto_RSA_Keys
Crittografia a chiave pubblica Ed25519, Ed448 (firme) RFC 8032 sgcCrypto_Ed25519, sgcCrypto_Ed448
Crittografia a chiave pubblica X25519, X448 (key agreement) RFC 7748 sgcCrypto_X25519, sgcCrypto_X448
Crittografia a chiave pubblica cifratura sealed box ECIES — sgcCrypto_ECIES
Crittografia a chiave pubblica ECDSA / ECDH su NIST P-256, P-384, P-521 FIPS 186-5 sgcCrypto_EC, sgcCrypto_ECCurves
Crittografia a chiave pubblica ECDSA / ECDH su secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 SEC 2, RFC 5639 sgcCrypto_ECCurves
Crittografia a chiave pubblica Firme ECDSA codificate in DER, conversione raw e DER RFC 3279 sgcCrypto_ECCurves, sgcCrypto_EC
Crittografia a chiave pubblica Firme Schnorr su secp256k1 BIP-340 sgcCrypto_ECCurves
Crittografia a chiave pubblica Esportazione e importazione di chiavi RSA ed EC: PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER e PEM RFC 8017, RFC 5958, RFC 5280 sgcCrypto_RSA_Keys, sgcCrypto_ECCurves
Crittografia post-quantistica ML-KEM-512/768/1024, ibrido 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
Crittografia post-quantistica ML-DSA-44/65/87 FIPS 204, RFC 9881, RFC 9964 sgcCrypto_MLDSA
Crittografia post-quantistica SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f FIPS 205, RFC 9909 sgcCrypto_SLHDSA
Certificati e PKI parsing X.509, verifica catena e CRL RFC 5280 sgcCrypto_X509
Certificati e PKI generazione certificati X.509 self-signed e CSR PKCS#10 RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certificati e PKI certificati X.509 e CSR firmati con EC, subject alternative name di tipo URI RFC 5280, RFC 2986 sgcCrypto_X509_Gen
Certificati e PKI lettura PKCS#12 (.pfx, .p12): certificato foglia, catena e chiave privata. PBES2 con AES, e gli schemi legacy Triple DES e RC2 RFC 7292, RFC 9579 sgcCrypto_PKCS12
Certificati e PKI reader e writer DER / ASN.1, PEM, Base64 — sgcCrypto_ASN1, sgcCrypto_DER
Password monouso HOTP, TOTP RFC 4226, RFC 6238 sgcCrypto_OTP
Cifratura degli archivi WinZip AE-1 / AE-2 WinZip AE-2 sgcCrypto_Zip_AE2
Codifica e utilità Hex, Base32, Base64url, confronto a tempo costante, azzeramento sicuro, byte casuali RFC 4648 sgcCrypto_Encoding, sgcCrypto_Random

Spiegato uno per uno

1. Hashing e autenticazione dei messaggi: SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC e Poly1305, i mattoni fondamentali su cui è costruito quasi ogni altro algoritmo di questa pagina.

2. Hashing delle password e derivazione delle chiavi: PBKDF2, scrypt, Argon2id e HKDF. Memorizzare una password e derivare una chiave da un segreto già esistente sono compiti diversi; questa pagina spiega perché e quale funzione è adatta a ciascuno di essi.

3. Crittografia simmetrica: AES in ogni modalità supportata dalla libreria, il key wrapping AES, ChaCha20/Salsa20 e le loro costruzioni AEAD con Poly1305, e perché una modalità autenticata dovrebbe essere la scelta predefinita.

4. Crittografia a chiave pubblica: RSA, firme Ed25519/Ed448, key agreement X25519/X448, ECIES, ed ECDSA/ECDH sulle curve NIST, secp256k1 e Brainpool, e le firme Schnorr BIP-340.

5. Crittografia post-quantistica: ML-KEM, ML-DSA e SLH-DSA, i tre schemi standardizzati da NIST nei FIPS 203-205, e la costruzione ibrida da adottare già oggi.

6. Certificati e PKI: analisi e verifica dei certificati X.509 ricevuti, e generazione di propri certificati self-signed e richieste PKCS#10, firmati con una chiave RSA o EC.

7. Password monouso: HOTP e TOTP, i codici generati da un'app di autenticazione, inclusa la URI di provisioning.

8. Fuzzy hashing (TLSH): un hash locality sensitive per il rilevamento di quasi duplicati, a differenza di ogni altro hash di questa pagina non è pensato per l'integrità o la sicurezza.

9. Cifratura degli archivi WinZip AE-2: la cifratura AES utilizzata all'interno degli archivi .zip, e cosa protegge e cosa non protegge.

10. Modalità FIPS: un'opzione di compilazione che lascia nella libreria solo gli algoritmi approvati FIPS, cosa rimuove e cosa verifica, e perché non è una validazione FIPS 140-3.

Demo

La cartella Demos\18.Cryptography contiene sette applicazioni eseguibili, una per ciascuna delle aree sopra elencate (hashing, crittografia simmetrica, password, chiave pubblica, post-quantistica, certificati, e password monouso con WinZip AE-2), ciascuna delle quali mostra l'API in uso e spiega il ragionamento alla base delle scelte consigliate.