O sgcWebSockets inclui o sgcCrypto, uma biblioteca de criptografia de propósito geral escrita inteiramente em Pascal puro. Ela não tem nenhuma dependência do OpenSSL nem de qualquer outra biblioteca externa, e compila sem alterações do Delphi 7 até o Delphi 13, no Win32, Win64, Linux64, macOS e iOS.
A biblioteca cobre hashing e autenticação de mensagens, hashing de senhas e derivação de chaves, criptografia simétrica, criptografia de chave pública clássica, criptografia pós-quântica, certificados X.509, senhas de uso único, criptografia de arquivos e um hash difuso para detecção de quase duplicados. Ela é organizada em uma unit por família de algoritmo (sgcCrypto_AES, sgcCrypto_MLKEM, sgcCrypto_TLSH, e assim por diante), de modo que uma aplicação inclui apenas o código que realmente utiliza.
Cada função é uma chamada simples que recebe e retorna TBytes: não há componentes para soltar em um formulário nem configuração em tempo de design. A implementação de cada algoritmo listado abaixo foi verificada, byte a byte, em relação a uma implementação independente do mesmo padrão (OpenSSL, o hashlib/cryptography do Python, ou uma implementação de referência publicada pelos autores do padrão), e não apenas em relação à sua própria saída, que é o que deixa passar um bug internamente consistente, mas incorreto.
Habilitando a biblioteca
As units de criptografia pertencem ao pacote de instalação Criptografia, controlado pela definição condicional SGC_PACK_CRYPTO em sgcVer.inc. Com a definição desativada, cada unit sgcCrypto_* compila como um stub vazio, o que mantém o pacote fora de um build que não precisa dele. Selecione o pacote no instalador, ou defina SGC_PACK_CRYPTO nas opções do seu projeto se você compilar a partir do código-fonte.
Se um projeto precisa usar apenas algoritmos aprovados pelo FIPS, a definição opcional SGC_CRYPTO_FIPS remove todos os outros algoritmos das units do sgcCrypto em tempo de compilação. Ela vem desativada por padrão. Veja Modo FIPS para saber o que ela mantém, o que ela remove e por que ela não é uma validação FIPS 140-3.
As units do sgcCrypto também são o que permite ao restante da biblioteca rodar sem OpenSSL: a opção sgcCryptoBackend em tempo de execução (ou a definição opcional SGC_NATIVE_CRYPTO) e o IOHandler iohNativeTLS. Veja Executar sem OpenSSL.
O que é abordado nesta página
A tabela abaixo é o inventário completo: todos os algoritmos que a biblioteca implementa, e em qual unit cada um vive. As páginas a seguir explicam cada família uma por uma, com as assinaturas exatas das funções e um breve exemplo em Delphi.
| Categoria | Algoritmos | Padrão | 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 (com chave, até 512 bits) | RFC 7693 | sgcCrypto_Blake2b |
| Hashing | BLAKE2s (com chave, até 256 bits) | RFC 7693 | sgcCrypto_Blake2s |
| Hashing | SipHash-2-4 | — | sgcCrypto_SipHash |
| Hashing | RIPEMD-160, HMAC-RIPEMD160 | ISO/IEC 10118-3, RFC 2286 | sgcCrypto_Legacy |
| Hashing (legado) | MD4, MD5, DES-ECB, hash NTLM v1 | — | sgcCrypto_Legacy |
| Hash difuso | Digest e distância TLSH | — | sgcCrypto_TLSH |
| Autenticação de mensagens | HMAC-SHA1/256/384/512, HMAC-MD5 | FIPS 198-1 | sgcCrypto_HMAC |
| Autenticação de mensagens | AES-CMAC | RFC 4493 | sgcCrypto_CMAC |
| Autenticação de mensagens | AES-GMAC | SP 800-38D | sgcCrypto_CMAC |
| Autenticação de mensagens | Poly1305 | RFC 8439 | sgcCrypto_Poly1305 |
| Hashing de senhas & KDF | PBKDF2 (SHA-1/256/384/512) | RFC 8018 | sgcCrypto_KDF |
| Hashing de senhas & KDF | KDF1, KDF2, ANSI X9.63 KDF | ISO 18033-2, ANSI X9.63 | sgcCrypto_KDF |
| Hashing de senhas & KDF | scrypt | RFC 7914 | sgcCrypto_Scrypt |
| Hashing de senhas & KDF | Argon2d, Argon2i, Argon2id | RFC 9106 | sgcCrypto_Argon2 |
| Hashing de senhas & KDF | HKDF (SHA-256/384) | RFC 5869 | sgcCrypto_HKDF |
| Criptografia simétrica | AES-128/192/256: ECB, CBC, CFB, OFB, CTR, CBC ciphertext stealing, GCM | FIPS 197, SP 800-38A/D | sgcCrypto_AES, sgcCrypto_Modes |
| Criptografia simétrica | AES-CBC sem padding, e os esquemas de 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 |
| Criptografia simétrica | AES-CCM (AEAD) | RFC 3610, SP 800-38C | sgcCrypto_Modes |
| Criptografia simétrica | AES Key Wrap, AES Key Wrap com Padding | RFC 3394, RFC 5649 | sgcCrypto_Modes |
| Criptografia simétrica | ChaCha20, XChaCha20, Salsa20, XSalsa20 | RFC 8439 | sgcCrypto_ChaCha |
| Criptografia simétrica | ChaCha20-Poly1305, XChaCha20-Poly1305 (AEAD) | RFC 8439 | sgcCrypto_Poly1305 |
| Criptografia de chave pública | Geração de chave RSA, RSA-OAEP, RSA-PSS, assinatura/verificação PKCS#1 v1.5 | RFC 8017 | sgcCrypto_RSA_Keys, sgcCrypto_RSA |
| Criptografia de chave pública | Criptografia RSA PKCS#1 v1.5 | RFC 8017 | sgcCrypto_RSA_Keys |
| Criptografia de chave pública | Ed25519, Ed448 (assinaturas) | RFC 8032 | sgcCrypto_Ed25519, sgcCrypto_Ed448 |
| Criptografia de chave pública | X25519, X448 (acordo de chave) | RFC 7748 | sgcCrypto_X25519, sgcCrypto_X448 |
| Criptografia de chave pública | Criptografia ECIES sealed box | — | sgcCrypto_ECIES |
| Criptografia de chave pública | ECDSA / ECDH nas curvas NIST P-256, P-384, P-521 | FIPS 186-5 | sgcCrypto_EC, sgcCrypto_ECCurves |
| Criptografia de chave pública | ECDSA / ECDH em secp256k1, brainpoolP256r1, brainpoolP384r1, brainpoolP512r1 | SEC 2, RFC 5639 | sgcCrypto_ECCurves |
| Criptografia de chave pública | Assinaturas ECDSA codificadas em DER, conversão entre bruto e DER | RFC 3279 | sgcCrypto_ECCurves, sgcCrypto_EC |
| Criptografia de chave pública | Assinaturas Schnorr em secp256k1 | BIP-340 | sgcCrypto_ECCurves |
| Criptografia de chave pública | Exportação e importação de chaves RSA e EC: PKCS#1, PKCS#8, SEC1, SubjectPublicKeyInfo, DER e PEM | RFC 8017, RFC 5958, RFC 5280 | sgcCrypto_RSA_Keys, sgcCrypto_ECCurves |
| Criptografia pós-quântica | ML-KEM-512/768/1024, híbrido 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 |
| Criptografia pós-quântica | ML-DSA-44/65/87 | FIPS 204, RFC 9881, RFC 9964 | sgcCrypto_MLDSA |
| Criptografia pós-quântica | SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f | FIPS 205, RFC 9909 | sgcCrypto_SLHDSA |
| Certificados & PKI | Parsing de X.509, verificação de cadeia e CRL | RFC 5280 | sgcCrypto_X509 |
| Certificados & PKI | Geração de certificado X.509 autoassinado e de CSR PKCS#10 | RFC 5280, RFC 2986 | sgcCrypto_X509_Gen |
| Certificados & PKI | Certificados X.509 e CSRs assinados com EC, nomes alternativos do assunto (subject alternative names) do tipo URI | RFC 5280, RFC 2986 | sgcCrypto_X509_Gen |
| Certificados & PKI | Leitura de PKCS#12 (.pfx, .p12): certificado folha, cadeia e chave privada. PBES2 com AES, e os esquemas legados Triple DES e RC2 | RFC 7292, RFC 9579 | sgcCrypto_PKCS12 |
| Certificados & PKI | Leitor e escritor de DER / ASN.1, PEM, Base64 | — | sgcCrypto_ASN1, sgcCrypto_DER |
| Senhas de uso único | HOTP, TOTP | RFC 4226, RFC 6238 | sgcCrypto_OTP |
| Criptografia de arquivos | WinZip AE-1 / AE-2 | WinZip AE-2 | sgcCrypto_Zip_AE2 |
| Codificação & utilitários | Hex, Base32, Base64url, comparação em tempo constante, zero seguro, bytes aleatórios | RFC 4648 | sgcCrypto_Encoding, sgcCrypto_Random |
Explicado um por um
1. Hashing & Autenticação de Mensagens: SHA-2, SHA-3, SHAKE, BLAKE2, SipHash, HMAC, AES-CMAC e Poly1305, os blocos de construção com os quais quase todos os outros algoritmos desta página são construídos.
2. Hashing de Senhas & Derivação de Chaves: PBKDF2, scrypt, Argon2id e HKDF. Armazenar uma senha e derivar uma chave a partir de um segredo já existente são tarefas diferentes; esta página explica por quê e qual função se encaixa em qual caso.
3. Criptografia Simétrica: AES em todos os modos que a biblioteca suporta, key wrapping de AES, ChaCha20/Salsa20 e suas construções AEAD com Poly1305, e por que um modo autenticado deveria ser a escolha padrão.
4. Criptografia de Chave Pública: RSA, assinaturas Ed25519/Ed448, acordo de chave X25519/X448, ECIES, ECDSA/ECDH nas curvas NIST, secp256k1 e Brainpool, e assinaturas Schnorr BIP-340.
5. Criptografia Pós-Quântica: ML-KEM, ML-DSA e SLH-DSA, os três esquemas padronizados pelo NIST na FIPS 203-205, e a construção híbrida a ser adotada hoje.
6. Certificados & PKI: fazer parsing e verificar certificados X.509 que você recebe, e gerar seus próprios certificados autoassinados e requisições PKCS#10, assinados com uma chave RSA ou EC.
7. Senhas de Uso Único: HOTP e TOTP, os códigos que um aplicativo autenticador gera, incluindo a URI de provisionamento.
8. Hash Difuso (TLSH): um hash sensível à localidade para detecção de quase duplicados, diferente de todo outro hash desta página, ele não é feito para integridade ou segurança.
9. Criptografia de Arquivos WinZip AE-2: a criptografia AES utilizada dentro de arquivos .zip, e o que ela protege e o que não protege.
10. Modo FIPS: uma opção em tempo de compilação que deixa na biblioteca apenas algoritmos aprovados pelo FIPS, o que ela remove e verifica, e por que ela não é uma validação FIPS 140-3.
Demos
A pasta Demos\18.Cryptography tem sete aplicações executáveis, uma para cada área acima (hashing, criptografia simétrica, senhas, chave pública, pós-quântica, certificados, e senhas de uso único com WinZip AE-2), cada uma mostrando a API em uso e explicando o raciocínio por trás das escolhas recomendadas.