Criptografia

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.