密码学

sgcWebSockets 包含 sgcCrypto, 这是一个完全用纯 Pascal 编写的通用密码学库。它不依赖 OpenSSL 或任何其他外部库, 并且从 Delphi 7 到 Delphi 13、在 Win32、Win64、Linux64、macOS 和 iOS 上均可原样编译。

 

该库涵盖哈希与消息认证、密码哈希与密钥派生、对称加密、经典公钥密码学、 后量子密码学、X.509 证书、一次性密码、归档加密,以及用于近似重复检测的模糊哈希。 库按算法族分为一个个独立单元(sgcCrypto_AES、 sgcCrypto_MLKEM、 sgcCrypto_TLSH 等),因此应用程序只会引入自己实际调用的代码。

 

每个函数都是接受并返回 TBytes 的普通调用:没有可拖放到窗体上的组件,也没有设计期配置。下面列出的每个算法的实现, 都逐字节与该标准的一个独立实现(OpenSSL、Python 的 hashlib/cryptography, 或该标准作者发布的参考实现)进行过交叉核对,而不仅仅是与自身的输出比对, 因为只与自身比对恰恰会漏掉那种内部自洽但实际有误的 bug。

 

启用该库

 

密码学相关单元属于 Cryptography 安装包,由 sgcVer.inc 中的 SGC_PACK_CRYPTO 条件编译开关控制。该开关关闭时,每个 sgcCrypto_* 单元都会编译为空存根,从而使不需要该功能包的构建不包含它。请在安装程序中选择该功能包, 或者,如果您从源码编译,请在项目选项中定义 SGC_PACK_CRYPTO。

 

如果项目必须只使用 FIPS 批准的算法,可选的 SGC_CRYPTO_FIPS 条件编译开关会在编译时从 sgcCrypto 单元中移除所有其他算法。该开关默认关闭。 请参阅FIPS 模式,了解它保留哪些算法、移除哪些算法, 以及为何它并不等同于 FIPS 140-3 验证。

 

sgcCrypto 单元同样是让库的其余部分得以在不使用 OpenSSL 的情况下运行的基础:sgcCryptoBackend 运行时开关(或可选的 SGC_NATIVE_CRYPTO 开关)和 iohNativeTLS IOHandler。请参阅不使用 OpenSSL 运行。

 

本页涵盖的内容

 

下表是完整清单:列出了该库实现的每一种算法,以及它所在的单元。后续各页将逐一说明每个算法族, 并给出准确的函数签名和一个简短的 Delphi 示例。

 

类别 算法 标准 单元
哈希 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 FIPS 180-4 sgcCrypto_SHA2
哈希 SHA3-224、SHA3-256、SHA3-384、SHA3-512、SHAKE128、SHAKE256、cSHAKE、KMAC FIPS 202, SP 800-185 sgcCrypto_Keccak
哈希 BLAKE2b(带密钥,最高 512 位) RFC 7693 sgcCrypto_Blake2b
哈希 BLAKE2s(带密钥,最高 256 位) RFC 7693 sgcCrypto_Blake2s
哈希 SipHash-2-4 — sgcCrypto_SipHash
哈希 RIPEMD-160、HMAC-RIPEMD160 ISO/IEC 10118-3, RFC 2286 sgcCrypto_Legacy
哈希(遗留) MD4、MD5、DES-ECB、NTLM v1 哈希 — sgcCrypto_Legacy
模糊哈希 TLSH 摘要及距离计算 — sgcCrypto_TLSH
消息认证 HMAC-SHA1/256/384/512、HMAC-MD5 FIPS 198-1 sgcCrypto_HMAC
消息认证 AES-CMAC RFC 4493 sgcCrypto_CMAC
消息认证 AES-GMAC SP 800-38D sgcCrypto_CMAC
消息认证 Poly1305 RFC 8439 sgcCrypto_Poly1305
密码哈希与 KDF PBKDF2(SHA-1/256/384/512) RFC 8018 sgcCrypto_KDF
密码哈希与 KDF KDF1、KDF2、ANSI X9.63 KDF ISO 18033-2, ANSI X9.63 sgcCrypto_KDF
密码哈希与 KDF scrypt RFC 7914 sgcCrypto_Scrypt
密码哈希与 KDF Argon2d、Argon2i、Argon2id RFC 9106 sgcCrypto_Argon2
密码哈希与 KDF HKDF(SHA-256/384) RFC 5869 sgcCrypto_HKDF
对称加密 AES-128/192/256:ECB、CBC、CFB、OFB、CTR、CBC 密文窃取、GCM FIPS 197, SP 800-38A/D sgcCrypto_AES, sgcCrypto_Modes
对称加密 无填充的 AES-CBC,以及 PKCS#7、零填充、ANSI X9.23、ISO 7816-4、ISO 10126-2 和 TBC 填充方案 SP 800-38A, ISO/IEC 9797-1 sgcCrypto_AES, sgcCrypto_Modes
对称加密 AES-CCM(AEAD) RFC 3610, SP 800-38C sgcCrypto_Modes
对称加密 AES 密钥包装(Key Wrap)、带填充的 AES 密钥包装 RFC 3394, RFC 5649 sgcCrypto_Modes
对称加密 ChaCha20、XChaCha20、Salsa20、XSalsa20 RFC 8439 sgcCrypto_ChaCha
对称加密 ChaCha20-Poly1305、XChaCha20-Poly1305(AEAD) RFC 8439 sgcCrypto_Poly1305
公钥密码学 RSA 密钥生成、RSA-OAEP、RSA-PSS、PKCS#1 v1.5 签名/验证 RFC 8017 sgcCrypto_RSA_Keys, sgcCrypto_RSA
公钥密码学 RSA PKCS#1 v1.5 加密 RFC 8017 sgcCrypto_RSA_Keys
公钥密码学 Ed25519、Ed448(签名) RFC 8032 sgcCrypto_Ed25519, sgcCrypto_Ed448
公钥密码学 X25519、X448(密钥协商) RFC 7748 sgcCrypto_X25519, sgcCrypto_X448
公钥密码学 ECIES 密封盒加密 — sgcCrypto_ECIES
公钥密码学 基于 NIST P-256、P-384、P-521 的 ECDSA / ECDH FIPS 186-5 sgcCrypto_EC, sgcCrypto_ECCurves
公钥密码学 基于 secp256k1、brainpoolP256r1、brainpoolP384r1、brainpoolP512r1 的 ECDSA / ECDH SEC 2, RFC 5639 sgcCrypto_ECCurves
公钥密码学 ECDSA DER 编码签名,原始与 DER 格式互转 RFC 3279 sgcCrypto_ECCurves, sgcCrypto_EC
公钥密码学 基于 secp256k1 的 Schnorr 签名 BIP-340 sgcCrypto_ECCurves
公钥密码学 RSA 与 EC 密钥的导出与导入:PKCS#1、PKCS#8、SEC1、SubjectPublicKeyInfo、DER 和 PEM RFC 8017, RFC 5958, RFC 5280 sgcCrypto_RSA_Keys, sgcCrypto_ECCurves
后量子密码学 ML-KEM-512/768/1024,混合 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
后量子密码学 ML-DSA-44/65/87 FIPS 204, RFC 9881, RFC 9964 sgcCrypto_MLDSA
后量子密码学 SLH-DSA-SHAKE-128s/128f/192s/192f/256s/256f FIPS 205, RFC 9909 sgcCrypto_SLHDSA
证书与 PKI X.509 解析、证书链与 CRL 验证 RFC 5280 sgcCrypto_X509
证书与 PKI X.509 自签名证书及 PKCS#10 CSR 生成 RFC 5280, RFC 2986 sgcCrypto_X509_Gen
证书与 PKI 以 EC 签名的 X.509 证书与 CSR,URI 主题备用名称 RFC 5280, RFC 2986 sgcCrypto_X509_Gen
证书与 PKI PKCS#12(.pfx、.p12)读取:叶节点证书、证书链和私钥。PBES2 配合 AES,以及旧式的 Triple DES 和 RC2 方案 RFC 7292, RFC 9579 sgcCrypto_PKCS12
证书与 PKI DER / ASN.1 读写器、PEM、Base64 — sgcCrypto_ASN1, sgcCrypto_DER
一次性密码 HOTP、TOTP RFC 4226, RFC 6238 sgcCrypto_OTP
归档加密 WinZip AE-1 / AE-2 WinZip AE-2 sgcCrypto_Zip_AE2
编码与实用工具 十六进制、Base32、Base64url、恒定时间比较、安全清零、随机字节 RFC 4648 sgcCrypto_Encoding, sgcCrypto_Random

 

逐一说明

 

1. 哈希与消息认证:SHA-2、SHA-3、SHAKE、BLAKE2、 SipHash、HMAC、AES-CMAC 和 Poly1305,本页几乎所有其他算法都是基于这些构建模块构建的。

 

2. 密码哈希与密钥派生:PBKDF2、scrypt、Argon2id 和 HKDF。存储密码与从已有密钥材料派生密钥是两项不同的工作;本页说明了原因,以及哪个函数适用于哪种场景。

 

3. 对称加密:本库支持的每种 AES 模式、AES 密钥包装、 ChaCha20/Salsa20 及其 Poly1305 AEAD 构造,以及为何应默认选择带认证的模式。

 

4. 公钥密码学:RSA、Ed25519/Ed448 签名、X25519/X448 密钥协商、ECIES,以及基于 NIST、secp256k1 和 Brainpool 曲线的 ECDSA/ECDH,还有 BIP-340 Schnorr 签名。

 

5. 后量子密码学:ML-KEM、ML-DSA 和 SLH-DSA, 这是 NIST 在 FIPS 203-205 中标准化的三种方案,以及当前应部署的混合构造。

 

6. 证书与 PKI:解析并验证您收到的 X.509 证书, 以及生成您自己的自签名证书和 PKCS#10 请求,可使用 RSA 或 EC 密钥进行签名。

 

7. 一次性密码:HOTP 和 TOTP,即身份验证器应用生成的验证码, 包括配置 URI。

 

8. 模糊哈希(TLSH):一种用于近似重复检测的局部敏感哈希, 与本页其他哈希不同,它并非用于完整性或安全目的。

 

9. WinZip AE-2 归档加密:.zip 归档内部使用的 AES 加密方式,以及它能保护和不能保护的内容。

 

10. FIPS 模式:一个使库中只保留 FIPS 批准算法的编译时开关, 它会移除和检查哪些内容,以及为何它并不等同于 FIPS 140-3 验证。

 

演示程序

 

Demos\18.Cryptography 文件夹中包含七个可运行的应用程序,分别对应上述各个领域(哈希、对称加密、密码、公钥、后量子、证书, 以及带 WinZip AE-2 的一次性密码),每个应用程序都展示了 API 的实际用法,并说明了推荐选择背后的理由。