sgcCrypto 功能矩阵
sgcCrypto 所做的一切,映射到磁盘上的 43 个单元。这里没有组件,也没有设计时属性:下面的每一行都是一个可以直接调用的函数或过程。每份许可证都附带完整源代码。下方的锚点会带您跳转到这些单元所属的六大能力分类,以及同一个产品包在它们之上构建的 TLS 1.3 和 TLS 1.2 引擎。
sgcCrypto 所做的一切,映射到磁盘上的 43 个单元。这里没有组件,也没有设计时属性:下面的每一行都是一个可以直接调用的函数或过程。每份许可证都附带完整源代码。下方的锚点会带您跳转到这些单元所属的六大能力分类,以及同一个产品包在它们之上构建的 TLS 1.3 和 TLS 1.2 引擎。
sgcCrypto 没有组件。下面的 43 个单元只导出普通函数,没有 Tsgc* 类,也没有 sgcCrypto_Reg.pas。将一个单元添加到您的 uses 子句中,然后调用该函数即可。
已经包含在内。sgcCrypto 已免费包含在 sgcWebSockets Standard、Professional 和 Enterprise 中,以及 All-Access 中。它也作为独立产品出售(捆绑 sgcWebSockets Core 运行时),供只拥有 Core 的客户使用。参见价格页面。
sgcWebSockets/delphi/Source/ 下的每个 sgcCrypto_*.pas 单元,按分类列出。
| 单元 | 分类 | 功能 |
|---|---|---|
sgcCrypto_AES | 对称加密 | AES-CBC、AES-GCM(AEAD)、AES-CTR。 |
sgcCrypto_Modes | 对称加密 | AES-ECB、OFB、CFB、CTS、CCM(AEAD)、Key Wrap / 带填充的 Key Wrap,以及七种填充方案。 |
sgcCrypto_CMAC | 对称加密 | AES-CMAC 和 AES-GMAC 消息认证。 |
sgcCrypto_ChaCha | 对称加密 | ChaCha20、XChaCha20、Salsa20、XSalsa20。 |
sgcCrypto_Poly1305 | 对称加密 | Poly1305 MAC、ChaCha20-Poly1305 和 XChaCha20-Poly1305 AEAD。 |
sgcCrypto_SHA2 | 哈希与 KDF | SHA-1、SHA-224、SHA-256、SHA-384、SHA-512。 |
sgcCrypto_Keccak | 哈希与 KDF | SHA-3、SHAKE128/256、cSHAKE、KMAC。 |
sgcCrypto_Blake2b | 哈希与 KDF | BLAKE2b,带密钥或不带密钥。 |
sgcCrypto_Blake2s | 哈希与 KDF | BLAKE2s,带密钥或不带密钥。 |
sgcCrypto_HMAC | 哈希与 KDF | HMAC-SHA1/256/384/512。 |
sgcCrypto_KDF | 哈希与 KDF | PBKDF2、KDF1、KDF2 和 X9.63,可选哈希算法。 |
sgcCrypto_HKDF | 哈希与 KDF | HKDF 提取与展开。 |
sgcCrypto_Scrypt | 哈希与 KDF | scrypt 内存困难型 KDF。 |
sgcCrypto_Argon2 | 哈希与 KDF | Argon2d、Argon2i、Argon2id。 |
sgcCrypto_SipHash | 哈希与 KDF | SipHash-2-4 带密钥哈希。 |
sgcCrypto_TLSH | 哈希与 KDF | TLSH 模糊哈希与相似度比较。 |
sgcCrypto_Ed25519 | 签名与密钥交换 | Ed25519 签名 / 验证。 |
sgcCrypto_X25519 | 签名与密钥交换 | X25519 Diffie-Hellman。 |
sgcCrypto_Ed448 | 签名与密钥交换 | Ed448 签名 / 验证。 |
sgcCrypto_X448 | 签名与密钥交换 | X448 Diffie-Hellman。 |
sgcCrypto_GF448 | 签名与密钥交换 | 为 Ed448/X448 提供内部 GF(2^448-2^224-1) 域运算。 |
sgcCrypto_ECCurves | 签名与密钥交换 | 基于 secp256k1、Brainpool P256r1/P384r1/P512r1 和 NIST P-256/P-384/P-521 的 ECDSA / ECDH,DER 签名,密钥导出/导入,以及 BIP-340 Schnorr。 |
sgcCrypto_EC | 签名与密钥交换 | 通用 EC 签名/验证,格式为 JWS(ES256/384/512),以及 ECDH。 |
sgcCrypto_RSA | 签名与密钥交换 | RSA PKCS#1 v1.5 签名,PKCS#1 v1.5 / PSS 验证,来自 PEM 或原始数据。 |
sgcCrypto_RSA_Keys | 签名与密钥交换 | RSA 密钥生成、OAEP(可独立指定 MGF1 哈希)、PSS、PKCS#1 v1.5 签名/验证/加密/解密、PKCS#1 和 PKCS#8 格式的 DER/PEM 导出与导入。 |
sgcCrypto_ECIES | 签名与密钥交换 | 基于 X25519 的 ECIES 封装 / 解封混合加密。 |
sgcCrypto_ASN1 | PKI | DER 读取器、PEM 编解码器、PKCS#1/SEC 1 密钥解析。 |
sgcCrypto_DER | PKI | DER 写入原语。 |
sgcCrypto_BigInteger | PKI | 内部任意精度整数运算。 |
sgcCrypto_X509 | PKI | X.509 解析、验证、带 pathLenConstraint 与 nameConstraints 的证书链验证、CSR 验证、CRL、吊销检查。可读取 RSA、EC、Ed25519、ML-DSA、SLH-DSA 和 ML-KEM 公钥。 |
sgcCrypto_X509_Gen | PKI | 自签名、CA 签发和 PKCS#10 CSR 生成,可使用 RSA、EC、ML-DSA 或 SLH-DSA 签名,并支持 URI 与 IPv6 主题备用名称以及 nameConstraints。 |
sgcCrypto_MLKEM | 后量子 | ML-KEM 密钥封装(FIPS 203),3 种参数集,支持 SubjectPublicKeyInfo、PKCS#8 和 PEM 密钥导入导出。 |
sgcCrypto_MLKEM_Poly | 后量子 | ML-KEM 背后的内部多项式环运算。 |
sgcCrypto_MLKEM_Hybrid | 后量子 | 混合 X25519 + ML-KEM 密钥封装、X-Wing,以及 RFC 10024 的 TLS 1.3 混合密钥共享。 |
sgcCrypto_MLDSA | 后量子 | ML-DSA 数字签名(FIPS 204),3 种参数集,支持 SubjectPublicKeyInfo、PKCS#8 和 PEM 密钥导入导出。 |
sgcCrypto_MLDSA_Poly | 后量子 | ML-DSA 背后的内部多项式环运算。 |
sgcCrypto_SLHDSA | 后量子 | SLH-DSA 签名(FIPS 205),6 种 SHAKE 参数集,支持 SubjectPublicKeyInfo、PKCS#8 和 PEM 密钥导入导出。 |
sgcCrypto_OTP | OTP 与杂项 | HOTP、TOTP,恒定时间验证窗口。 |
sgcCrypto_Encoding | OTP 与杂项 | 恒定时间比较、安全清零、十六进制/Base64url/Base32。 |
sgcCrypto_Zip_AE2 | OTP 与杂项 | ZIP 条目的 WinZip AES 加密,AE-1 / AE-2。 |
sgcCrypto_Legacy | OTP 与杂项 | MD4、MD5、HMAC-MD5、DES-ECB、RIPEMD-160 和 HMAC-RIPEMD160,仅用于互操作。 |
sgcCrypto_Random | OTP 与杂项 | 跨平台 CSPRNG。 |
sgcCrypto_Int64 | OTP 与杂项 | 为 Delphi 7 提供的内部 64 位整数模拟。 |
生产代码实际会用到的 AES 模式,外加 ChaCha20/Poly1305 AEAD 系列。
| 能力 | 函数 | 说明 |
|---|---|---|
| AES-CBC | sgcAES_CBC_Encrypt / sgcAES_CBC_Decrypt | PKCS#7 填充,16 字节 IV。密钥长度决定所用的密码:16/24/32 字节对应 AES-128/192/256。 |
| 无填充的 AES-CBC | sgcAES_CBC_Encrypt_NoPad / sgcAES_CBC_Decrypt_NoPad | Java 写作 AES/CBC/NoPadding 的模式。输入长度必须已经是 16 字节的整数倍;长度不对齐时会引发异常,而不是被悄悄填充成对方无法读取的内容。 |
| AES-GCM(AEAD) | sgcAES_GCM_Encrypt / sgcAES_GCM_Decrypt | 建议使用 12 字节 IV。16 字节标签,以恒定时间比较;标签校验失败时解密函数返回 False 和空明文。 |
| AES 内核 | sgcAES_GetCore / sgcAES_SetCore | aescConstantTime 为默认值,是一个位切片内核,从不用机密字节索引内存,也从不依据它分支,从而堵住了针对密钥和明文的缓存时序通道。aescTable 是经典的查表内核,会通过数据缓存泄露信息,并且在每次测量中都更慢,因此仅作为后备保留。用于认证 GCM 的 GHASH 在掩码下相乘,而不是依据密钥分支。请在启动时设置一次内核,且要在任何工作线程运行之前。 |
| AES-CCM(AEAD) | sgcAES_CCM_Encrypt / sgcAES_CCM_Decrypt | 资源受限设备和物联网协议栈所指定使用的 AEAD:Zigbee、802.15.4、蓝牙以及 TLS CCM 密码套件,因为它只需要分组密码本身,无需 GHASH 表。随机数为 7 到 13 字节,标签为 4 到 16 字节,以恒定时间验证。 |
| AES-CTR | sgcAES_CTR | SRTP 风格的 AES-CM(RFC 3711)。对称调用,无填充,128 位大端计数器。 |
| AES-ECB | sgcAES_ECB_Encrypt / sgcAES_ECB_Decrypt | 没有 IV,没有链接。为了与指定该模式的格式互操作而提供。 |
| 填充方案 | sgcPad_Add / sgcPad_Remove、sgcAES_CBC_EncryptPad / DecryptPad、sgcAES_ECB_EncryptPad / DecryptPad | TsgcPadding 涵盖 None、PKCS#7、Zero、ANSI X9.23、ISO 7816-4、ISO 10126-2 和 TBC,因此 CBC 和 ECB 都能读写并非选择 PKCS#7 的系统所生成的数据。sgcPad_Remove 对任何一种错误填充都走同一条路径,返回 False。 |
| AES-OFB / AES-CFB | sgcAES_OFB、sgcAES_CFB_Encrypt / sgcAES_CFB_Decrypt | 流密码风格的反馈模式。 |
| AES-CTS | sgcAES_CTS_Encrypt / sgcAES_CTS_Decrypt | 密文窃取:加密长度不是块大小整数倍的数据,且无需填充开销。 |
| AES Key Wrap | sgcAES_KeyWrap / sgcAES_KeyUnwrap | RFC 3394,用于将一个密钥包装在另一个密钥之下。 |
| 带填充的 AES Key Wrap | sgcAES_KeyWrapPad / sgcAES_KeyUnwrapPad | RFC 5649,用于长度不是 8 字节整数倍的密钥材料。 |
| AES-CMAC | sgcAES_CMAC / sgcAES_CMAC_Verify | RFC 4493 消息认证码。 |
| AES-GMAC | sgcAES_GMAC / sgcAES_GMAC_Verify | GCM 的仅认证模式:整条消息都作为附加数据传输,没有任何内容被加密。同一个密钥下 IV 绝不能重复,16 字节标签以恒定时间比较。 |
| 底层块原语 | sgcAES_ExpandKey、sgcAES_EncryptBlock、sgcAES_DecryptBlock | 供上述模式和 MAC 单元使用;仅在需要构建一种尚未提供的模式时才直接调用。 |
| ChaCha20 | sgcChaCha20 | RFC 8439,96 位 nonce,32 位计数器。 |
| XChaCha20 | sgcXChaCha20 | 192 位扩展 nonce,适合大规模生成随机 nonce 的场景。 |
| Salsa20 / XSalsa20 | sgcSalsa20 / sgcXSalsa20 | 前身流密码系列,两种 nonce 长度均支持。 |
| 子密钥派生 | sgcHChaCha20 / sgcHSalsa20 | X 变体内部用它们从前 16 个 nonce 字节派生子密钥。 |
| Poly1305 MAC | sgcPoly1305 / sgcPoly1305_Verify | 一次性认证器,RFC 8439。切勿重复使用同一个 Poly1305 密钥。 |
| ChaCha20-Poly1305 AEAD | sgcChaCha20Poly1305_Encrypt / _Decrypt | TLS 1.3 第二套密码套件以及 SSH 背后所用的 AEAD 密码。 |
| XChaCha20-Poly1305 AEAD | sgcXChaCha20Poly1305_Encrypt / _Decrypt | 同样的 AEAD,192 位 nonce,即 libsodium 所称的 crypto_aead_xchacha20poly1305_ietf 构造。 |
每一种主流哈希系列,外加 PBKDF2、HKDF、scrypt 以及全部三种 Argon2 变体。
| 能力 | 函数 | 说明 |
|---|---|---|
| SHA-1 / SHA-2 | sgcSHA1、sgcSHA224、sgcSHA256、sgcSHA384、sgcSHA512 | FIPS 180-4。SHA-1 仅为互操作而保留,不建议用于新签名。 |
| SHA-3 | sgcSHA3_224 / _256 / _384 / _512 | FIPS 202,Keccak 海绵结构,与 SHA-2 在结构上完全独立。 |
| SHAKE128 / SHAKE256 | sgcSHAKE128 / sgcSHAKE256 | 可扩展输出函数:可请求任意摘要长度。 |
| cSHAKE128 / cSHAKE256 | sgcCSHAKE128 / sgcCSHAKE256 | 带域分离的 SHAKE,NIST SP 800-185,是 KMAC 的基础。 |
| KMAC128 / KMAC256 | sgcKMAC128 / sgcKMAC256 | 基于 Keccak 的 MAC,输出长度可变。 |
| BLAKE2b | sgcBlake2b / sgcBlake2b_Keyed | RFC 7693,摘要长度最多 64 字节,内置密钥支持(无需单独的 HMAC)。 |
| BLAKE2s | sgcBlake2s / sgcBlake2s_Keyed | RFC 7693,摘要长度最多 32 字节,为 32 位平台优化。 |
| 流式摘要 | sgcBlake2b_Init/_Update/_Final,Keccak/Blake2s 上的对应调用 | 用于哈希无法一次性放入内存的大型数据。 |
| HMAC | sgcHMAC_SHA1 / _SHA256 / _SHA384 / _SHA512 | RFC 2104,基于 SHA-1/2 系列的带密钥哈希。 |
| RIPEMD-160 / HMAC-RIPEMD160 | sgcRIPEMD160、sgcHMAC_RIPEMD160 | ISO/IEC 10118-3 与 RFC 2286。比特币地址叠加在 SHA-256 之上使用的 160 位摘要,也是 OpenPGP 按名称指定使用的哈希。 |
| PBKDF2 | sgcPBKDF2、sgcPBKDF2_SHA1 / _SHA256 / _SHA512 | RFC 8018。仅具备轻度内存困难性;可选时优先使用 Argon2id 或 scrypt。 |
| HKDF | sgcHKDF_Extract_SHA256 / _SHA384、sgcHKDF_Expand_SHA256 / _SHA384、sgcHKDF_SHA256 / _SHA384 | RFC 5869,提取再展开的密钥派生方式,是将共享密钥转换为多个密钥的标准做法。 |
| KDF1 / KDF2 / X9.63 | sgcKDF1、sgcKDF2、sgcKDF_X963 | ISO 18033-2、IEEE 1363a 和 ANSI X9.63 定义的计数器模式密钥派生函数,也是 RSA-KEM 和 ECIES 按名称指定使用的函数。KDF1 从 0 开始计数,KDF2 从 1 开始,这一差异已经造成过真实的互操作性问题,请务必核实您的规范所指的是哪一个。 |
| scrypt | sgcScrypt | RFC 7914,内存困难,抵御 GPU/ASIC 攻击的能力远优于 PBKDF2。 |
| Argon2 | sgcArgon2(d / i / id)、便捷封装 sgcArgon2id | RFC 9106,密码哈希竞赛的获胜者。完整接口支持可选密钥(pepper)和关联数据。 |
| SipHash-2-4 | sgcSipHash24 / sgcSipHash24_Value | 用于哈希表键的快速带密钥 PRF,可抵御哈希洪泛拒绝服务。 |
| TLSH 模糊哈希 | sgcTLSH、sgcTLSH_Init/_Update/_Final | 用于近似重复检测的局部敏感哈希,不是密码学摘要。 |
| TLSH 相似度分数 | sgcTLSH_Diff | 两个 TLSH 摘要之间的距离;数值越低表示越相似。 |
在五个不同的曲线系列以及 RSA 上进行签名、验证和共享密钥推导。
| 能力 | 函数 | 说明 |
|---|---|---|
| Ed25519 签名 / 验证 | sgcEd25519_Sign / sgcEd25519_Verify、sgcEd25519_PublicKey | RFC 8032。32 字节公钥,64 字节签名。验证会拒绝非规范点以及第 5.1.7 节所规定的 S >= L 情形。签名对机密标量和每条消息的 nonce 都是恒定时间的:固定的四位窗口,通过在掩码下扫描全部十六个条目来选取表项,以及第 5.1.4 节的完备加法公式。公钥由 32 字节种子生成。 |
| X25519 密钥交换 | sgcX25519、sgcX25519_PublicKey、sgcX25519_SharedSecret | RFC 7748,基于 Curve25519 的 Diffie-Hellman。 |
| Ed448 签名 / 验证 | sgcEd448_GenerateKeyPair、sgcEd448_Sign、sgcEd448_Verify | RFC 8032,448 位(Goldilocks)EdDSA 曲线。 |
| X448 密钥交换 | sgcX448、sgcX448_PublicKey、sgcX448_SharedSecret | RFC 7748,基于 Curve448 的 Diffie-Hellman。 |
| secp256k1 | 使用 eccSecp256k1 的 sgcECDSA_SignHash / VerifyHash | 比特币/以太坊所用的曲线,SEC 2,位于 sgcCrypto_ECCurves 中。 |
| Brainpool P256r1 / P384r1 / P512r1 | 同一组函数,配合 eccBrainpoolP256r1 / P384r1 / P512r1 | RFC 5639,常见于欧盟 eIDAS 和政府配置文件。 |
| NIST P-256 / P-384 / P-521 | 同一组函数,配合 eccP256 / eccP384 / eccP521 | TsgcECCurve 现在命名了七条曲线,因此密钥生成、签名、验证、ECDH 和点压缩都能直接从原始密钥字节到达 NIST 素数曲线,而不必再借助 PEM 文件。 |
| 确定性 ECDSA nonce | 内置于 sgcECDSA_SignHash | RFC 6979:nonce 由私钥和消息派生,没有 RNG 失效的风险。 |
| 恒定时间标量乘法 | 位于 sgcECDSA_SignHash、sgcECDH_SharedSecret 和 EC 密钥生成内部 | sgcCrypto_ECCurves 中的每条曲线都运行同一个引擎:没有数据相关步骤的 Montgomery 约简,窗口数量由曲线决定的固定窗口,在掩码下扫描全部条目来选取表项,以及从不查看坐标来判断适用哪种情况的完备加法公式。sgcCrypto_EC 的 JOSE、WebAuthn 和 E2EE 路径运行同一份代码。 |
| ECDH(secp256k1 / Brainpool) | sgcECDH_SharedSecret | 在同一四条曲线上计算共享密钥。 |
| 点压缩 | sgcEC_Compress / sgcEC_Decompress | 存储或传输更短的压缩公钥形式。 |
| EC 作为 JWS(ES256/384/512) | sgcECDSA_SignJWS / sgcECDSA_VerifyJWS | 根据所请求的位长自动选择曲线,可直接从 PEM 密钥签名/验证,是 ECCurves 面向 JOSE 的姊妹单元。 |
| 通用 ECDH | sgcECDH | 由原始私钥和对方公钥点计算共享密钥。 |
| 原始 / DER ECDSA 验证 | sgcECDSA_VerifyRaw / sgcECDSA_VerifyDER | 针对原始 (Qx, Qy, r, s) 元组或 DER 编码签名进行验证。 |
| DER ECDSA 签名与格式互转 | sgcECDSA_SignDER / sgcECDSA_VerifyDER、sgcECDSA_RawToDER / sgcECDSA_DERToRaw | X.509、CMS 和 TLS 携带的是 DER 编码的 ECDSA-Sig-Value,即先 INTEGER r 后 INTEGER s 的 SEQUENCE。JOSE 和 WebAuthn 携带的则是原始的 R || S 字节对。既可以直接签出任意一种形式,也可以在两者之间转换一个已有的签名。 |
| Schnorr 签名(BIP-340) | sgcSchnorr_PublicKey、sgcSchnorr_Sign、sgcSchnorr_Verify | 仅限 secp256k1,采用仅 x 坐标的 32 字节公钥和 64 字节签名:Taproot、Nostr 和 Lightning 所使用的正是它。sgcSchnorr_TaggedHash 被单独导出,以便在同一构造之上构建 BIP-341 和 BIP-342 所需的标签。 |
| RSA 签名(PKCS#1 v1.5) | sgcRSA_SignPKCS1 | 从 PEM 私钥出发,SHA-1/256/384/512 摘要。 |
| RSA 私钥操作 | sgcRSA_SignPKCS1 以及 sgcCrypto_RSA_Keys 中其他的签名和解密调用 | 每次操作都用新的随机数对进行盲化,再经过固定窗口幂运算和 CRT 重组,其耗时不取决于因子或数据,并且在返回结果之前会用公钥指数进行检查。CRT 某一半中的错误否则会在一次签名中泄露一个因子,因此一旦不匹配就不返回任何结果。 |
| RSA 验证(PKCS#1 v1.5 / PSS) | sgcRSA_VerifyPKCS1、sgcRSA_VerifyPSS,以及基于模数/指数的 _Raw 变体 | RFC 8017。验证既可来自 PEM 密钥,也可来自原始模数和指数,无需构建密钥对象。 |
| RSA 密钥生成 | sgcRSA_GenerateKey | 任意请求的位长,Miller-Rabin 素性测试。 |
| RSA-OAEP 加密 | sgcRSA_OAEP_Encrypt / sgcRSA_OAEP_Decrypt | RFC 8017 最优非对称加密填充。 |
| 带独立 MGF1 哈希的 RSA-OAEP | 五参数版本的 sgcRSA_OAEP_Encrypt / sgcRSA_OAEP_Decrypt 重载 | 分别锁定标签哈希和 MGF1 哈希。OAEPWithSHA256AndMGF1Padding 在 Bouncy Castle 中意味着两者都是 SHA-256,而在 SunJCE 中却是 SHA-256 配合 MGF1-SHA1,这一不一致正是 Java 互操作性失败的常见原因。 |
| RSA PKCS#1 v1.5 加密 | sgcRSA_PKCS1_Encrypt / sgcRSA_PKCS1_Decrypt | RFC 8017 第 7.2 节,Java 中称为 RSA/ECB/PKCS1Padding 的模式。解密对任何一种失败都走同一条路径,因此不会给填充预言攻击留下任何可乘之机。任何新场景都应优先选择 OAEP。 |
| RSA-PSS / PKCS#1 签名 | sgcRSA_PSS_Sign / Verify、sgcRSA_PKCS1_Sign / Verify | 直接从生成的 TsgcRSAPrivateKey 进行签名。 |
| RSA 密钥导出 | sgcRSA_ExportPrivateKeyPEM、sgcRSA_ExportPublicKeyPEM,以及对应的 DER 调用 | PKCS#1 和 SubjectPublicKeyInfo 编码。 |
| PKCS#8 与 SEC 1 密钥导出 | sgcRSA_ExportPrivateKeyPKCS8DER / PKCS8PEM、sgcEC_ExportPrivateKeyPKCS8DER / PKCS8PEM、sgcEC_ExportPrivateKeySEC1DER / SEC1PEM、sgcEC_ExportSubjectPublicKeyInfo、sgcEC_ExportPublicKeyPEM | Java、.NET 及大多数现代工具所期望的 BEGIN PRIVATE KEY 容器,以及 SEC 1 的 BEGIN EC PRIVATE KEY 形式,还有证书内嵌的 SubjectPublicKeyInfo。三者均未加密,因此返回的是裸密钥材料。 |
| RSA 与 EC 密钥导入 | sgcRSA_ImportPrivateKeyDER / PEM、sgcRSA_ImportPublicKeyDER / PEM、sgcEC_ImportPrivateKeyDER / PEM、sgcEC_ImportPublicKeyDER / PEM | 此前并不存在:生成的密钥只能写出,却无法再读回来。导入功能接受 PKCS#1、PKCS#8、SEC 1 和 SubjectPublicKeyInfo,DER 或 PEM 格式均可,文件缺省 CRT 参数或公钥点时会重新计算,遇到格式错误的输入会返回 False 而不是抛出异常,因此可以放心地用它处理不受信任的文件。 |
| ECIES 封装 / 解封 | sgcECIES_GenerateKeyPair、sgcECIES_Seal、sgcECIES_Open | 面向 X25519 公钥的混合加密:临时 ECDH 加上一个 AEAD,每个方向仅需一次调用。 |
读取他人签发的证书,或自己生成一份,两者底层都有同一套 DER 编码器和解码器。
| 能力 | 函数 | 说明 |
|---|---|---|
| DER 读取器 | sgcASN1_Read、sgcASN1_Next、sgcASN1_Content | 逐个节点遍历 DER 结构。 |
| 严格 DER | sgcASN1_Read、sgcASN1_IsMinimalUnsignedInteger | 该单元读取的每一种结构按规范都是 DER,因此长度受 DER 规则约束:不定长形式会被拒绝,本可以用短形式承载的长形式同样会被拒绝。INTEGER 没有采用最小编码的 ECDSA 签名也会被拒绝,因此同一个签名不可能有两种写法而被当作两个不同的值。 |
| PEM 编解码器 | sgcPEM_Decode / sgcPEM_Encode | RFC 7468,包裹 DER 的 -----BEGIN ... -----END 格式。 |
| RSA 密钥解析 | sgcASN1_ParseRSAPrivateKey / PublicKey | PKCS#1(RFC 8017)密钥结构。 |
| EC 密钥解析 | sgcASN1_ParseECPrivateKey / PublicKey | SEC 1 密钥结构。 |
| 结构性 DER 写入 | sgcDER_Sequence、sgcDER_Set、sgcDER_Tagged、sgcDER_ContextExplicit / Implicit | 每个证书字段所依赖的基础构件。 |
| 数值型 DER 写入 | sgcDER_Integer、sgcDER_OctetString、sgcDER_BitString、sgcDER_Boolean、sgcDER_Null | 基本值编码器。 |
| 字符串与标识符 DER 写入 | sgcDER_OID、sgcDER_UTF8String、sgcDER_PrintableString、sgcDER_IA5String、sgcDER_Time | 对象标识符、X.509 使用的三种字符串类型,以及 UTCTime/GeneralizedTime。 |
| 证书解析 | sgcX509_Parse | 完整的证书结构:主题、颁发者、有效期、公钥、扩展项。 |
| 签名 / 证书链验证 | sgcX509_VerifySignedBy、sgcX509_VerifyChain | 验证一张证书是否由某个颁发者签发,或者遍历并验证一组 DER 证书。 |
| CRL 解析与吊销检查 | sgcX509_CRL_Parse、sgcX509_IsRevoked、sgcX509_CRL_VerifySignedBy | 解析证书吊销列表,并对照它检查某个序列号。 |
| 名称格式化 | sgcX509_SubjectRFC2253、sgcX509_IssuerRFC2253、sgcX509_SubjectOneLine | RFC 2253 可分辨名称字符串,用于日志记录和显示。 |
| 扩展项与 SAN | sgcX509_GetExtension、sgcX509_GetCRLDistributionURIs | 读取任意扩展 OID 以及 CRL 分发点 URI。 |
| 自签名证书生成 | sgcX509_CreateSelfSigned | 完整的 TsgcX509Options:主题 DN、有效期、序列号、带路径长度限制的 CA 标志、密钥用途、扩展密钥用途、主题备用名称(包括 IPv4 SAN)。 |
| URI 主题备用名称 | TsgcX509Options.URIs | uniformResourceIdentifier 类型的 SAN,用于表示 SPIFFE 风格的服务身份,而非主机名。该值会按原样作为 IA5String 内容写入,因此请传入完整的 URI。 |
| PKCS#10 CSR 生成 | sgcX509_CreateCSR | 基于同一个选项记录生成 RFC 2986 证书签名请求。 |
| EC 签名的证书与 CSR | sgcX509_CreateSelfSignedEx、sgcX509_CreateCSREx、sgcX509_ECKey、sgcX509_RSAKey | 将 RSA 或 EC 密钥封装进一个 TsgcX509SignKey,即可同时支持这两种密钥进行签名。EC 证书体积大约只有 RSA 证书的三分之一,验证速度也快得多。TsgcX509Options.Hash 仍然只指定 SHA 算法,签名算法则由密钥类型决定,因此 rhSHA256 配合 EC 密钥意味着 ecdsa-with-SHA256。 |
| CA 签发 | sgcX509_CreateSigned、sgcX509_CreateSignedFromCSR | 用 CA 密钥签发证书,既可以从选项记录出发,也可以从解析后的 PKCS#10 请求出发。 |
| 后量子签名密钥 | sgcX509_MLDSAKey、sgcX509_SLHDSAKey | 把 ML-DSA 或 SLH-DSA 密钥包装进 TsgcX509SignKey,再交给 sgcX509_CreateSelfSignedEx、sgcX509_CreateCSREx 或上面的 CA 签发函数。ML-DSA 对应 RFC 9881,SLH-DSA 对应 RFC 9909。 |
| ML-KEM 证书 | 带 ML-KEM 主题密钥的 sgcX509_CreateSigned | RFC 9935。CA 可以为 ML-KEM 公钥签发证书,但 ML-KEM 无法签名,所以签发前必须用其他方式证明私钥持有。 |
| 读取时的后量子密钥类型 | TsgcX509PublicKeyType | 在 x509pkRSA、x509pkEC 和 x509pkEd25519 之外新增 x509pkMLDSA、x509pkSLHDSA 和 x509pkMLKEM。sgcX509_Parse、sgcX509_VerifySignedBy 和 sgcX509_CSR_Verify 都能处理它们。 |
| 证书链约束 | sgcX509_VerifyChain | 强制执行 basicConstraints 的 pathLenConstraint 以及 nameConstraints 扩展,覆盖 dNSName、iPAddress、rfc822Name、uniformResourceIdentifier 和 directoryName。 |
| 生成时写入 nameConstraints | TsgcX509Options.PermittedDNSNames、ExcludedDNSNames、PermittedIPRanges、ExcludedIPRanges | 把允许和排除的子树写入 CA 证书,上面的链验证才能强制执行它们。 |
| IPv6 地址 SAN | TsgcX509Options.IPAddresses | 接受任意 RFC 4291 文本形式的 IPv6,也接受 IPv4。 |
| PEM 输出 | sgcX509_ToPEM | 将生成的 DER 包装为可直接保存的 PEM 文件。 |
NIST 于 2024 年 8 月定稿为 FIPS 203、204 和 205 的三种算法,外加为过渡期提供的一个混合组合器。
| 能力 | 函数 | 说明 |
|---|---|---|
| ML-KEM 密钥生成 | sgcMLKEM_GenerateKeyPair、sgcMLKEM_GenerateKeyPairFromSeed | FIPS 203,原名 Kyber。三种参数集:mlkem512、mlkem768、mlkem1024。 |
| ML-KEM 封装 | sgcMLKEM_Encapsulate、sgcMLKEM_EncapsulateWithSeed | 生成一个新的 32 字节共享密钥,以及承载它的密文。公钥会先经过 FIPS 203 第 7.2 节的输入检查,因此长度不对或未通过模数检查的公钥会引发异常。 |
| ML-KEM 解封装 | sgcMLKEM_Decapsulate | 长度正确但无法解密的密文会得到一个伪随机密钥(隐式拒绝),而不是错误,因此时序和错误行为都不会泄露任何信息。长度不对的密文或私钥,或者未通过哈希检查的私钥,会依据 FIPS 203 第 7.3 节的输入检查首先引发异常。 |
| ML-KEM 尺寸 | sgcMLKEM_PublicKeySize、PrivateKeySize、CiphertextSize、SharedSecretSize | 每种参数集对应的字节长度,用于缓冲区分配。 |
| 混合 X25519 + ML-KEM | sgcHybrid_GenerateKeyPair、sgcHybrid_Encapsulate、sgcHybrid_Decapsulate | 通过一个 KDF 将经典和后量子共享密钥组合起来,因此结果的安全性永远不会弱于单独的 X25519。这是当前业界推荐的 ML-KEM 部署方式。 |
| ML-DSA 密钥生成 | sgcMLDSA_GenerateKeyPair、sgcMLDSA_GenerateKeyPairFromSeed | FIPS 204,原名 Dilithium。三种参数集:mldsa44、mldsa65、mldsa87。 |
| ML-DSA 签名 / 验证 | sgcMLDSA_Sign / sgcMLDSA_Verify | 按照 FIPS 204 接口进行确定性或随机化签名,并支持上下文字符串。 |
| ML-DSA 尺寸 | sgcMLDSA_PublicKeySize、PrivateKeySize、SignatureSize | 每种参数集对应的字节长度。 |
| SLH-DSA 密钥生成 | sgcSLHDSA_GenerateKeyPair、sgcSLHDSA_GenerateKeyPairFromSeed | FIPS 205,原名 SPHINCS+。无状态哈希签名:安全性完全依赖哈希函数本身,不依赖格或曲线假设。 |
| SLH-DSA 签名 / 验证 | sgcSLHDSA_Sign / sgcSLHDSA_Verify | 六种 SHAKE 参数集:slhShake128s、slhShake128f、slhShake192s、slhShake192f、slhShake256s、slhShake256f。s 系列偏向更小的签名,f 系列偏向更快的签名速度。 |
| SLH-DSA 尺寸与命名 | sgcSLHDSA_PublicKeySize、PrivateKeySize、SignatureSize、sgcSLHDSA_ParamsName | SLH-DSA 签名体积较大(根据参数集不同,从 7.8 KB 到 49 KB 不等);签名前请先确定缓冲区大小。 |
| 公钥导出与导入,DER | sgcMLDSA_ExportSubjectPublicKeyInfo / ImportSubjectPublicKeyInfo,以及完全相同的 sgcMLKEM_* 和 sgcSLHDSA_* 组合 | X.509 SubjectPublicKeyInfo,因此后量子公钥写入与 RSA 或 EC 公钥相同的结构。对应 RFC 9881、RFC 9909 和 RFC 9935。 |
| 私钥导出 & 导入,DER | sgcMLDSA_ExportPrivateKeyInfo / ImportPrivateKeyInfo,以及 sgcMLKEM_* 和 sgcSLHDSA_* 配对 | PKCS#8 OneAsymmetricKey,版本 0 和 1。导入时会检查密钥的一致性:内嵌的公钥若不匹配则被拒绝,同一密钥的种子形式和展开形式必须一致,ML-DSA 密钥必须能重现其存储的 t0 和 tr。SLH-DSA 会根据种子重新计算 PK.root,开销约相当于一次密钥生成,因此这些导入接受一个 aVerify 参数,默认为 True,对于由您自己的应用程序生成的密钥,可以传入 False。 |
| PEM 导出与导入 | sgcMLDSA_ExportPublicKeyPEM、ExportPrivateKeyPEM、ImportPublicKeyPEM、ImportPrivateKeyPEM,以及对应的 sgcMLKEM_* 和 sgcSLHDSA_* 函数组 | RFC 7468,即 -----BEGIN ... -----END 包装,因此这些密钥可以直接放进 PKI 其余部分所用的文件与工具链。 |
| 私钥形式 | TsgcPQCPrivateKeyFormat | ML-DSA 和 ML-KEM 私钥有三种形式。pqkfSeed 只写入种子(ML-DSA 为 32 字节,ML-KEM 为 64 字节的 d||z 种子),pqkfExpanded 写入展开后的密钥,pqkfBoth 两者都带。SLH-DSA 只有一种私钥形式。 |
| 返回种子的密钥生成 | sgcMLDSA_GenerateKeyPairAndSeed、sgcMLKEM_GenerateKeyPairAndSeed | 在返回密钥对的同时交回种子,因此生成之后就能直接写出种子形式的 PKCS#8 或 PEM 文件。 |
| X-Wing 混合 KEM | sgcXWing_GenerateKeyPair、sgcXWing_Encapsulate、sgcXWing_Decapsulate | draft-connolly-cfrg-xwing-kem-10:把 X25519 与 ML-KEM-768 合成为一个 KEM。公钥 1216 字节,私钥 32 字节(即种子),密文 1120 字节,共享密钥 32 字节。 |
| TLS 1.3 混合密钥共享 | sgcTLSHybrid_ClientKeyShare、sgcTLSHybrid_ServerKeyShare、sgcTLSHybrid_ClientSharedSecret、sgcTLSHybrid_GroupName、sgcTLSHybrid_Available | RFC 10024 的 X25519MLKEM768、SecP256r1MLKEM768 和 SecP384r1MLKEM1024 组(IANA 代码点 0x11EC、0x11EB、0x11ED)。它们不是独立的 KEM,只用于构建 TLS 密钥共享。 |
| 用于 JSON Web Token 的 ML-DSA | JWTOptions.Algorithms.MLDSA.PrivateKey、PublicKey、Enabled、sgcMLDSA_ExportPublicJWK、sgcMLDSA_ExportPrivateJWK、sgcMLDSA_ImportJWK、sgcMLDSA_ImportJWKAsPEM | RFC 9964,位于 sgcHTTP_JWT_MLDSA,而不是某个 sgcCrypto_* 单元。JWS 算法为 ML-DSA-44、ML-DSA-65 和 ML-DSA-87(jwtMLDSA44、jwtMLDSA65、jwtMLDSA87),客户端使用 PKCS#8 PEM,服务器使用 SubjectPublicKeyInfo PEM,支持 AKP JSON Web Key,整条路径都不涉及 OpenSSL。 |
| 已知答案验证 | NIST ACVP 向量 | ML-KEM 的密钥生成、封装和解封装,以及 ML-DSA 和 SLH-DSA 的密钥生成、签名生成和签名验证,都会对照 sgcWebSockets QA 套件中的 NIST ACVP 已知答案向量进行检查。 |
sgcCrypto 不声称支持 ed25519187 或 SPECK。ed25519187 没有公开发布的规范,而 SPECK 已于 2018 年从 ISO 标准化进程中撤回;本库均未实现这两者。
它用 Object Pascal 写在 sgcCrypto 原语之上,随同一个产品包提供。它位于 sgcSSL_NativeTLS* 单元,而不是 sgcCrypto_*,因此不计入上面的 43 个单元。
| 能力 | API | 说明 |
|---|---|---|
| 在客户端选用 | TLSOptions.IOHandler := iohNativeTLS | 用进程内的 Pascal 引擎取代 OpenSSL、SChannel 和各平台 TLS 后端。任何目标平台上都无需部署任何东西。 |
| 在服务器选用 | SSLOptions.IOHandler := iohNativeTLS | 可配合默认的 Indy 服务器引擎,也可配合 IOCP 和 EPOLL 引擎。 |
| 协议版本 | TLSOptions.Version | 允许的最低版本。tls1_2 或 tlsUndefined 会协商 TLS 1.3 或 TLS 1.2,tls1_3 只允许 TLS 1.3,而 tls1_0 或 tls1_1 会引发配置错误。服务器上的 SSLOptions.Version 作用相同。若只需要 TLS 1.2,请在 CipherSuites 中只列出 TLS 1.2 的密码套件。 |
| 密钥交换组 | TLSOptions.NativeTLS_Options.Groups | 以冒号分隔,采用 OpenSSL 风格。默认值为 X25519MLKEM768:X25519:secp256r1:secp384r1,因此只要对端同意,握手就是后量子混合握手。启用 SGC_CRYPTO_FIPS 的构建则默认使用 SecP256r1MLKEM768:SecP384r1MLKEM1024:secp256r1:secp384r1。这三个混合组仅用于 TLS 1.3,因此 TLS 1.2 连接使用 X25519、secp256r1 或 secp384r1。 |
| 密码套件 | TLSOptions.NativeTLS_Options.CipherSuites | 以冒号分隔,采用 OpenSSL 风格。TLS 1.3 的默认值为 TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256,此外 TLS 1.2 默认包含使用 AES-128-GCM、AES-256-GCM 和 ChaCha20-Poly1305 的 ECDHE_ECDSA 与 ECDHE_RSA 套件。带 AES-CBC 的 ECDHE 套件和 RSA 密钥交换只有在显式指定时才会使用,TLS 1.2 套件共 20 个。启用 SGC_CRYPTO_FIPS 的构建会去掉 ChaCha20-Poly1305 和 RSA 密钥交换。 |
| 信任根 | TLSOptions.RootCertFile、TLSOptions.NativeTLS_Options.UseSystemRoots | 根证书来自 RootCertFile。将 UseSystemRoots 设为 True,可加入操作系统已经信任的根证书:在 Windows 上是 ROOT 存储,在其他平台上则是在标准位置中找到的第一个 CA 证书包文件。它不会读取 macOS 或 iOS 的钥匙串,也不会读取 Android 的证书存储。它默认关闭,因此 RootCertFile 仍是来源。SSLOptions 上的同一属性适用于服务器所验证的客户端证书。 |
| 证书链构建 | 对端发送的证书链 | 会在证书链中搜索从叶证书到信任根的路径,因此额外的证书和任意顺序都可以接受,这正是 RFC 8446 第 4.4.2 节的要求。搜索会回溯,因此一个指明了正确颁发者但走不通的证书,不再会遮住其后面的有效路径。不检查吊销状态和证书策略。 |
| 协议范围 | RFC 8446、RFC 5246 | TLS 1.3 和 TLS 1.2。不支持 TLS 1.1、TLS 1.0 或 SSL。TLS 1.2 使用 RFC 7627 的扩展主密钥,双方都启用 RFC 8446 的降级保护,拒绝重新协商和 SHA-1 签名(RFC 9155),并以恒定时间校验 CBC 记录。 |
| 未实现 | n/a | 没有会话恢复,也没有 PSK,没有 0-RTT,没有 QUIC。 |
| 对端验证事件 | OnSSLVerifyPeer | 对该引擎不可用,它有自己的验证钩子。如果您的代码依赖这个事件,请继续使用 OpenSSL 或某个平台后端。 |
工具层:一次性验证码、其他分类共用的编码方式,以及 WinZip AES 加密。
| 能力 | 函数 | 说明 |
|---|---|---|
| HOTP | sgcHOTP | RFC 4226,基于计数器的一次性密码。 |
| TOTP | sgcTOTP、sgcTOTP_FromBase32 | RFC 6238,基于时间的一次性密码;Base32 变体可直接接受身份验证器应用显示的那种格式的密钥。 |
| TOTP 验证 | sgcTOTP_Verify | 在一个时间步长窗口内以恒定时间检查提交的验证码,因此结果及其所在的位置都不会通过时序泄露。它本身不阻止重放,由调用方跟踪已使用的验证码。 |
| 恒定时间比较 | sgcConstantTimeEquals | 贯穿整个库,用于标签和 MAC 比较。 |
| 安全清零 | sgcSecureZero | 覆写字节缓冲区,使密钥材料不会残留在内存中。 |
| 十六进制 | sgcHexEncode / sgcHexDecode | 小写十六进制,解码时不区分大小写。 |
| Base64url | sgcBase64UrlEncode / sgcBase64UrlDecode | RFC 4648 第 5 节,不带填充,JWT 和 JOSE 所用的编码方式。 |
| Base32 | sgcBase32Encode / sgcBase32Decode | RFC 4648 第 6 节,TOTP 密钥和身份验证器应用所用的编码方式。 |
| WinZip AES 密钥派生 | sgcZipAE2_DeriveKeys | 基于 PBKDF2,从密码和盐值派生密钥、认证密钥和密码验证器。 |
| WinZip AES 加密 / 解密 | sgcZipAE2_Encrypt / sgcZipAE2_Decrypt | AE-1 和 AE-2,AES-128/192/256,通过 TsgcZipAESStrength 指定每条目的盐值大小。 |
| WinZip 条目打包 | sgcZipAE2_PackEntry / sgcZipAE2_UnpackEntry | 将盐值、验证器、密文和认证码组合成磁盘上的存储布局。 |
| WinZip 附加字段 | sgcZipAE2_BuildExtraField / sgcZipAE2_ParseExtraField | 标记某个 ZIP 条目已被 AES 加密的 0x9901 附加字段。 |
| 传统哈希(仅供互操作) | sgcMD4、sgcMD5、sgcHMAC_MD5 | 为读取旧格式和协议而保留;请勿用于新设计。 |
| 传统密码(仅供互操作) | sgcDES_EncryptECB / sgcDES_DecryptECB、sgcDES_NTLM7to8 | DES-ECB 以及基于 DES 的 NTLM 密钥扩展步骤,两者均已被撤回(FIPS 46-3),仅为传统互操作而保留。 |
| 安全随机字节 | sgcRandomBytes / sgcRandomFill | MSWINDOWS 下使用 BCryptGenRandom(Windows CNG),其他平台使用 /dev/urandom,两种情况下都是同一次调用。 |
明确说明支持的范围。
| 方面 | 详情 |
|---|---|
| 操作系统 | 在 sgcVer.inc 中,没有任何 MSWINDOWS 防护,也没有任何其他平台防护包裹 SGC_CRYPTO。全部 43 个单元均可为 Win32、Win64、Linux64、macOS、iOS 和 Android 编译。 |
| 随机数来源 | 唯一一个感知平台的单元 sgcCrypto_Random,会为每个目标平台选择相应的 CSPRNG:MSWINDOWS 下使用 BCryptGenRandom(Windows CNG),POSIX 目标上使用 /dev/urandom,均隐藏在同一个 sgcRandomBytes 调用之后。这些字节直接来自操作系统的随机数生成器,上层没有任何自有生成器。在 Windows 上,只有当 BCryptGenRandom 不可用时才会依次使用 RtlGenRandom 和 CryptGenRandom;如果无法读取任何来源,将抛出异常,而不会返回弱随机字节。 |
| FIPS 模式 | 可选的条件编译符号 SGC_CRYPTO_FIPS,默认关闭,会在编译时从 43 个单元中移除所有未经批准的算法,并在运行时检查若干参数规则。它让库只保留 FIPS 批准的算法,但 sgcCrypto 并不是经过 FIPS 140-3 验证的模块,该符号也不代表任何验证声明。FIPS 模式 |
| Delphi | Delphi 7 至 RAD Studio 13 Florence。任何地方都不假设存在原生的 64 位整数类型:sgcCrypto_Int64 以及 sgcCrypto_BigInteger 中的 TsgcBigInt 类型模拟了哈希、曲线和后量子单元所需的运算。 |
| C++ Builder | 通过生成的头文件支持 C++ Builder,使用同一份源码树。 |
| 设计时占用 | 没有。没有 sgcCrypto_Reg.pas,没有任何东西被 RegisterComponents,也没有任何单元出现在组件面板页面上。 |
| 依赖项 | 没有 OpenSSL 绑定,没有外部 DLL。每个原语都直接在您所引用的单元中以 Object Pascal 实现。 |
| 源代码 | 每个付费版本都附带完整 Object Pascal 源代码,已包含 sgcCrypto 的版本包也是如此。 |
| 再分发 | 您构建的二进制文件可免版税再分发,没有按坐席或按服务器计费的运行时费用。 |