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.