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 的实际用法,并说明了推荐选择背后的理由。