sgcWebSockets inclut sgcCrypto, une bibliothèque de cryptographie généraliste écrite entièrement en Pascal pur. Elle ne dépend ni d'OpenSSL ni d'aucune autre bibliothèque externe, et elle compile sans modification de Delphi 7 à Delphi 13, sous Win32, Win64, Linux64, macOS et iOS.
La bibliothèque couvre le hachage et l'authentification des messages, le hachage de mots de passe et la dérivation de clé, le chiffrement symétrique, la cryptographie à clé publique classique, la cryptographie post-quantique, les certificats X.509, les mots de passe à usage unique, le chiffrement d'archives et un hachage flou pour la détection de quasi-doublons. Elle est organisée en une unité par famille d'algorithmes (sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH, etc.), de sorte qu'une application n'embarque que le code qu'elle appelle réellement.
Chaque fonction est un simple appel prenant et renvoyant des TBytes : il n'y a aucun composant à déposer sur une fiche ni de configuration en mode conception. L'implémentation de chaque algorithme listé ci-dessous a été vérifiée, octet par octet, par rapport à une implémentation indépendante de la même norme (OpenSSL, hashlib/cryptography de Python, ou une implémentation de référence publiée par les auteurs de la norme) plutôt que seulement par rapport à sa propre sortie, ce qui est ce qui permet de détecter un bug qui est cohérent en interne mais faux.
Activer la bibliothèque
Les unités de cryptographie appartiennent au package d'installation Cryptography, contrôlé par la directive de compilation conditionnelle SGC_PACK_CRYPTO dans sgcVer.inc. Lorsque la directive est désactivée, chaque unité sgcCrypto_* compile en un stub vide, ce qui permet d'exclure le package d'une compilation qui n'en a pas besoin. Sélectionnez le package depuis l'installeur, ou définissez SGC_PACK_CRYPTO dans les options de votre projet si vous compilez depuis les sources.
Si un projet ne doit utiliser que des algorithmes approuvés FIPS, la directive optionnelle SGC_CRYPTO_FIPS supprime tous les autres algorithmes des unités sgcCrypto au moment de la compilation. Elle est désactivée par défaut. Consultez la page Mode FIPS pour savoir ce qu'elle conserve, ce qu'elle supprime et pourquoi il ne s'agit pas d'une validation FIPS 140-3.
Les unités sgcCrypto sont aussi ce qui permet au reste de la bibliothèque de fonctionner sans OpenSSL : le commutateur d'exécution sgcCryptoBackend (ou la directive optionnelle SGC_NATIVE_CRYPTO) et l'IOHandler iohNativeTLS. Voir Fonctionner sans OpenSSL.
Contenu de cette page
Le tableau ci-dessous est l'inventaire complet : chaque algorithme implémenté par la bibliothèque, et l'unité dans laquelle il se trouve. Les pages qui suivent expliquent chaque famille une par une, avec les signatures exactes des fonctions et un court exemple Delphi.
| Catégorie | Algorithmes | Norme | Unité |
| Hachage | SHA-1, SHA-224, SHA-256, SHA-384, SHA-512 | FIPS 180-4 | sgcCrypto_SHA2 |
| Hachage | SHA3-224, SHA3-256, SHA3-384, SHA3-512, SHAKE128, SHAKE256, cSHAKE, KMAC | FIPS 202, SP 800-185 | sgcCrypto_Keccak |
| Hachage | BLAKE2b (avec clé, jusqu'à 512 bits) | RFC 7693 | sgcCrypto_Blake2b |
| Hachage | BLAKE2s (avec clé, jusqu'à 256 bits) | RFC 7693 | sgcCrypto_Blake2s |
| Hachage | SipHash-2-4 | — | sgcCrypto_SipHash |
| Hachage | RIPEMD-160, HMAC-RIPEMD160 | ISO/IEC 10118-3, RFC 2286 | sgcCrypto_Legacy |
| Hachage (ancien) | MD4, MD5, DES-ECB, hachage NTLM v1 | — | sgcCrypto_Legacy |
| Hachage flou | Empreinte et distance TLSH | — | sgcCrypto_TLSH |
| Authentification des messages | HMAC-SHA1/256/384/512, HMAC-MD5 | FIPS 198-1 | sgcCrypto_HMAC |
| Authentification des messages | AES-CMAC | RFC 4493 | sgcCrypto_CMAC |
| Authentification des messages | AES-GMAC | SP 800-38D | sgcCrypto_CMAC |
| Authentification des messages | Poly1305 | RFC 8439 | sgcCrypto_Poly1305 |
| Hachage de mot de passe & KDF | PBKDF2 (SHA-1/256/384/512) | RFC 8018 | sgcCrypto_KDF |
| Hachage de mot de passe & KDF | KDF1, KDF2, ANSI X9.63 KDF | ISO 18033-2, ANSI X9.63 | sgcCrypto_KDF |
| Hachage de mot de passe & KDF | scrypt | RFC 7914 | sgcCrypto_Scrypt |
| Hachage de mot de passe & KDF | Argon2d, Argon2i, Argon2id | RFC 9106 | sgcCrypto_Argon2 |
| Hachage de mot de passe & KDF | HKDF (SHA-256/384) | RFC 5869 | sgcCrypto_HKDF |
| Chiffrement symétrique | AES-128/192/256 : ECB, CBC, CFB, OFB, CTR, vol de texte chiffré CBC, GCM | FIPS 197, SP 800-38A/D | sgcCrypto_AES, sgcCrypto_Modes |
| Chiffrement symétrique | AES-CBC sans remplissage, et les schémas de remplissage PKCS#7, zéro, ANSI X9.23, ISO 7816-4, ISO 10126-2 et TBC | SP 800-38A, ISO/IEC 9797-1 | sgcCrypto_AES, sgcCrypto_Modes |
| Chiffrement symétrique | AES-CCM (AEAD) | RFC 3610, SP 800-38C | sgcCrypto_Modes |
| Chiffrement symétrique | AES Key Wrap, AES Key Wrap with Padding | RFC 3394, RFC 5649 | sgcCrypto_Modes |
| Chiffrement symétrique | ChaCha20, XChaCha20, Salsa20, XSalsa20 | RFC 8439 | sgcCrypto_ChaCha |
| Chiffrement symétrique | ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) | RFC 8439 | sgcCrypto_Poly1305 |
| Cryptographie à clé publique | Génération de clés RSA, RSA-OAEP, RSA-PSS, signature/vérification PKCS#1 v1.5 | RFC 8017 | sgcCrypto_RSA_Keys, sgcCrypto_RSA |
| Cryptographie à clé publique | Chiffrement RSA PKCS#1 v1.5 | RFC 8017 | sgcCrypto_RSA_Keys |
| Cryptographie à clé publique | Ed25519, Ed448 (signatures) | RFC 8032 | sgcCrypto_Ed25519, sgcCrypto_Ed448 |
| Cryptographie à clé publique | X25519, X448 (accord de clé) | RFC 7748 | sgcCrypto_X25519, sgcCrypto_X448 |
| Cryptographie à clé publique | Chiffrement scellé ECIES | — | sgcCrypto_ECIES |
| Cryptographie à clé publique | ECDSA / ECDH sur NIST P-256, P-384, P-521 | FIPS 186-5 | sgcCrypto_EC, sgcCrypto_ECCurves |
| Cryptographie à clé publique | ECDSA / ECDH sur secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 | SEC 2, RFC 5639 | sgcCrypto_ECCurves |
| Cryptographie à clé publique | Signatures ECDSA encodées en DER, conversion entre forme brute et DER | RFC 3279 | sgcCrypto_ECCurves, sgcCrypto_EC |
| Cryptographie à clé publique | Signatures Schnorr sur secp256k1 | BIP-340 | sgcCrypto_ECCurves |
| Cryptographie à clé publique | Export et import de clés RSA et EC : PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER et PEM | RFC 8017, RFC 5958, RFC 5280 | sgcCrypto_RSA_Keys, sgcCrypto_ECCurves |
| Cryptographie post-quantique | ML-KEM-512/768/1024, hybride 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 |
| Cryptographie post-quantique | ML-DSA-44/65/87 | FIPS 204, RFC 9881, RFC 9964 | sgcCrypto_MLDSA |
| Cryptographie post-quantique | SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f | FIPS 205, RFC 9909 | sgcCrypto_SLHDSA |
| Certificats & PKI | Analyse X.509, vérification de chaîne et de CRL | RFC 5280 | sgcCrypto_X509 |
| Certificats & PKI | Génération de certificat auto-signé X.509 et de CSR PKCS#10 | RFC 5280, RFC 2986 | sgcCrypto_X509_Gen |
| Certificats & PKI | Certificats X.509 et CSR signés EC, noms alternatifs du sujet de type URI | RFC 5280, RFC 2986 | sgcCrypto_X509_Gen |
| Certificats & PKI | Lecture PKCS#12 (.pfx, .p12) : certificat feuille, chaîne et clé privée. PBES2 avec AES, et les schémas historiques Triple DES et RC2 | RFC 7292, RFC 9579 | sgcCrypto_PKCS12 |
| Certificats & PKI | Lecteur et écrivain DER / ASN.1, PEM, Base64 | — | sgcCrypto_ASN1, sgcCrypto_DER |
| Mots de passe à usage unique | HOTP, TOTP | RFC 4226, RFC 6238 | sgcCrypto_OTP |
| Chiffrement d'archives | WinZip AE-1 / AE-2 | WinZip AE-2 | sgcCrypto_Zip_AE2 |
| Encodage & utilitaires | Hex, Base32, Base64url, comparaison en temps constant, effacement sécurisé, octets aléatoires | RFC 4648 | sgcCrypto_Encoding, sgcCrypto_Random |
Explication famille par famille
1. Hachage & authentification des messages : SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC et Poly1305, les briques de base sur lesquelles repose presque tout autre algorithme de cette page.
2. Hachage de mots de passe & dérivation de clé : PBKDF2, scrypt, Argon2id et HKDF. Stocker un mot de passe et dériver une clé à partir d'un secret existant sont deux tâches différentes ; cette page explique pourquoi et quelle fonction convient à laquelle.
3. Chiffrement symétrique : AES dans tous les modes pris en charge par la bibliothèque, l'encapsulation de clé AES, ChaCha20/Salsa20 et leurs constructions AEAD Poly1305, et pourquoi un mode authentifié devrait être le choix par défaut.
4. Cryptographie à clé publique : RSA, signatures Ed25519/Ed448, accord de clé X25519/X448, ECIES, ECDSA/ECDH sur les courbes NIST, secp256k1 et Brainpool, et signatures Schnorr BIP-340.
5. Cryptographie post-quantique : ML-KEM, ML-DSA et SLH-DSA, les trois schémas normalisés par le NIST dans les FIPS 203-205, et la construction hybride à déployer dès aujourd'hui.
6. Certificats & PKI : analyse et vérification des certificats X.509 que vous recevez, et génération de vos propres certificats auto-signés et de requêtes PKCS#10, signées avec une clé RSA ou une clé EC.
7. Mots de passe à usage unique : HOTP et TOTP, les codes que produit une application d'authentification, y compris l'URI de provisionnement.
8. Hachage flou (TLSH) : un hachage sensible à la localité pour la détection de quasi-doublons, contrairement à tout autre hachage de cette page il n'est pas destiné à l'intégrité ou à la sécurité.
9. Chiffrement d'archive WinZip AE-2 : le chiffrement AES utilisé à l'intérieur des archives .zip, et ce qu'il protège ou non.
10. Mode FIPS : un commutateur de compilation qui ne laisse dans la bibliothèque que les algorithmes approuvés FIPS, ce qu'il supprime et ce qu'il vérifie, et pourquoi il ne s'agit pas d'une validation FIPS 140-3.
Démos
Le dossier Demos\18.Cryptography contient sept applications exécutables, une par domaine ci-dessus (hachage, chiffrement symétrique, mots de passe, clé publique, post-quantique, certificats, et mots de passe à usage unique avec WinZip AE-2), chacune illustrant l'API en cours d'utilisation et expliquant le raisonnement derrière les choix recommandés.