CryptoLib4Pascal
Comprehensive cryptographic library for modern Object Pascal
**CryptoLib4Pascal** 为 Delphi 和 FreePascal 带来了生产级别的加密功能。从 AES-GCM 和 ChaCha20-Poly1305 到 ECDSA、EdDSA、RSA、Argon2、NIST 后量子算法(ML-KEM、ML-DSA、SLH-DSA)以及 X.509 证书 —— 满足您使用 Object Pascal 构建安全应用的一切需求,基于宽松的 [MIT License](LICENSE) 发布。
## 目录
- [特性](#features)
- [可用算法](#available-algorithms)
- [快速入门](#getting-started)
- [快速示例](#quick-examples)
- [支持的平台](#supported-platforms)
- [运行测试](#running-tests)
- [依赖项](#dependencies)
- [贡献](#contributing)
- [致谢](#acknowledgements)
- [捐赠](#tip-jar)
- [许可证](#license)
- [品牌标识](assets/branding/README.md)
## 特性
- **对称加密** -- AES、Rijndael、Blowfish、Speck、(X)ChaCha20、(X)Salsa20
- **认证加密 (AEAD)** -- GCM、GCM-SIV、CCM、EAX、OCB、(X)ChaCha20-Poly1305
- **非对称加密** -- RSA、DSA、ECDSA、EdDSA (Ed25519, Ed448)、ECNR、Schnorr (Bip340)、MuSig2 (Bip327)
- **后量子密码学 (PQC)** -- ML-KEM ([FIPS 203](https://csrc.nist.gov/pubs/fips/203/final))、ML-DSA ([FIPS 204](https://csrc.nist.gov/pubs/fips/204/final))、SLH-DSA ([FIPS 205](https://csrc.nist.gov/pubs/fips/205/final))
- **密钥交换** -- DH、ECDH、X25519、X448
- **哈希** -- SHA-2、SHA-3、Blake2、Keccak、RIPEMD 等
- **密码哈希** -- Argon2 (2i/2d/2id)、Scrypt、PBKDF2
- **MAC** -- HMAC、CMAC、KMAC、GMac、Poly1305、SipHash
- **X.509 证书** -- 生成与解析
- **PEM 编码** -- 兼容 OpenSSL 的导入/导出
- **跨平台** -- Windows、Linux、macOS、iOS、Android、Solaris 和 BSD
## 可用算法
对称加密
#### 分组密码
`AES (128, 192, 256)` | `Rijndael` | `Blowfish` | `Speck`
#### 流密码
`ChaCha` | `(X)Salsa20`
AEAD 密码
`AES-GCM` | `AES-GCM-SIV` | `AES-CCM` | `AES-EAX` | `AES-OCB` | `ChaCha20-Poly1305`
分组密码模式
`ECB` | `CBC` | `CFB` | `CTR` | `CTS` | `OFB` | `SIC`
分组密码填充方案
`PKCS#5` | `PKCS#7` | `ISO 10126-2` | `ISO 7816-4` | `ISO/IEC 9797-1 (Bit)` | `ANSI X9.23` | `TBC` | `Zero`
非对称加密
- **RSA** -- PKCS#1、OAEP、PSS、ISO 9796
- **DSA** / **Deterministic DSA**
- **ECDSA** -- NIST、X9.62、SEC2、Brainpool 曲线
- **ECNR**
- **EdDSA** -- Ed25519、Ed448
- **Schnorr** -- Bip340
- **MuSig2** -- Bip327
密钥协商 / 交换
`DH` | `ECDH` | `ECDHC` | `X25519` | `X448` | `ML-KEM`
后量子密码学 (PQC)
NIST 标准化的后量子算法,包含 NIST 分配的 OID、PKCS#8 / SubjectPublicKeyInfo 编码、可选的签名/KEM 上下文 ([FIPS 204](https://csrc.nist.gov/pubs/fips/204/final) / [FIPS 205](https://csrc.nist.gov/pubs/fips/205/final)),以及 NIST ACVP 测试向量覆盖。
#### ML-KEM — [FIPS 203](https://csrc.nist.gov/pubs/fips/203/final)
基于模块格的密钥封装机制 (CRYSTALS-Kyber)。
| 参数集 | NIST 安全类别 |
|---|---|
| `ML-KEM-512` | 1 |
| `ML-KEM-768` | 3 |
| `ML-KEM-1024` | 5 |
通过 `TGeneratorUtilities` / `TKemUtilities` 进行密钥生成、封装和解封装。
#### ML-DSA — [FIPS 204](https://csrc.nist.gov/pubs/fips/204/final)
基于模块格的数字签名算法 (CRYSTALS-Dilithium)。
| 参数集 | NIST 安全类别 |
|---|---|
| `ML-DSA-44` | 2 |
| `ML-DSA-65` | 3 |
| `ML-DSA-87` | 5 |
**HashML-DSA** 预哈希变体 (SHA-512):`ML-DSA-44-WITH-SHA512`、`ML-DSA-65-WITH-SHA512`、`ML-DSA-87-WITH-SHA512`
通过 `TSignerUtilities` (`TMlDsaSigner`、`THashMlDsaSigner`) 进行签名和验证。
#### SLH-DSA — [FIPS 205](https://csrc.nist.gov/pubs/fips/205/final)
无状态基于哈希的数字签名算法 (SPHINCS+)。
| 系列 | 参数集 |
|---|---|
| SHA-2 | `SLH-DSA-SHA2-128s`、`128f`、`192s`、`192f`、`256s`、`256f` |
| SHAKE | `SLH-DSA-SHAKE-128s`、`128f`、`192s`、`192f`、`256s`、`256f` |
每个参数集均提供 **HashSLH-DSA** 预哈希变体 —— SHA-2 系列使用 `WITH-SHA256` (128位) 或 `WITH-SHA512` (192/256位);SHAKE 系列使用 `WITH-SHAKE128` (128位) 或 `WITH-SHAKE256` (192/256位)。示例:`SLH-DSA-SHA2-128F-WITH-SHA256`、`SLH-DSA-SHAKE-256S-WITH-SHAKE256`。
通过 `TSignerUtilities` (`TSlhDsaSigner`、`THashSlhDsaSigner`) 进行签名和验证。
密钥派生函数
`HKDF` | `KDF1` | `KDF2`
#### 密码哈希
`Argon2 (2i, 2d, 2id)` | `Scrypt` | `PBKDF2`
MAC
`HMAC (所有支持的哈希)` | `CMAC` | `KMAC (128, 256)` | `GMac` | `Poly1305` | `SipHash`
哈希函数
| 系列 | 变体 |
|---|---|
| MD | MD2、MD4、MD5 |
| SHA-1 | SHA-1 |
| SHA-2 | 224、256、384、512、512-224、512-256 |
| SHA-3 | 224、256、384、512 |
| Keccak | 224、256、288、384、512 |
| Blake2B | 160、256、384、512 |
| Blake2S | 128、160、224、256 |
| RIPEMD | 128、160、256、320 |
| GOST | 3411、3411-2012 (256, 512) |
| 其他 | Tiger、WhirlPool |
XOF (可扩展输出函数)
`Shake-128` | `Shake-256`
实用工具
- 系统 RNG 包装器
- ASN.1 解析
- Base 编码/解码 (Hex、Base64 等)
- X.509 证书生成与解析
- 兼容 OpenSSL 的 PEM 读取器/写入器
## 快速入门
### 前置条件
| 编译器 | 最低版本 |
|---|---|
| Delphi | Sydney (10.4) 或更高版本 |
| FreePascal | 3.2.2 或更高版本 |
### 安装
**1. 克隆仓库:**
```
git clone https://github.com/Xor-el/CryptoLib4Pascal.git
```
**2a. Delphi**
- 打开并安装包:`CryptoLib/src/Packages/Delphi/CryptoLib4PascalPackage.dpk`
- 同时安装所需的依赖包:[HashLib4Pascal](https://github.com/Xor-el/HashLib4Pascal) 和 [SimpleBaseLib4Pascal](https://github.com/Xor-el/SimpleBaseLib4Pascal)
- 将 `CryptoLib/src` 子目录添加到您项目的搜索路径中
**2b. FreePascal / Lazarus**
- 打开并安装包:`CryptoLib/src/Packages/FPC/CryptoLib4PascalPackage.lpk`
- 同时安装所需的依赖包:[HashLib4Pascal](https://github.com/Xor-el/HashLib4Pascal) 和 [SimpleBaseLib4Pascal](https://github.com/Xor-el/SimpleBaseLib4Pascal)
## 快速示例
### AES-CBC 加密 / 解密
```
uses
ClpIBufferedCipher, ClpCipherUtilities, ClpParameterUtilities,
ClpParametersWithIV, ClpConverters, ClpSecureRandom, ClpISecureRandom,
ClpICipherParameters;
var
LCipher: IBufferedCipher;
LRandom: ISecureRandom;
LKey, LIV, LPlain, LCipherText, LDecrypted: TBytes;
LParams: ICipherParameters;
begin
LRandom := TSecureRandom.Create();
// Generate a random 256-bit key and 128-bit IV
SetLength(LKey, 32);
SetLength(LIV, 16);
LRandom.NextBytes(LKey);
LRandom.NextBytes(LIV);
LParams := TParametersWithIV.Create(
TParameterUtilities.CreateKeyParameter('AES', LKey), LIV);
LPlain := TConverters.ConvertStringToBytes('Secret message', TEncoding.UTF8);
// Encrypt
LCipher := TCipherUtilities.GetCipher('AES/CBC/PKCS7PADDING');
LCipher.Init(True, LParams);
LCipherText := LCipher.DoFinal(LPlain);
// Decrypt
LCipher.Init(False, LParams);
LDecrypted := LCipher.DoFinal(LCipherText);
end;
```
### SHA-256 哈希
```
uses
ClpIDigest, ClpDigestUtilities, ClpConverters, ClpEncoders;
var
LDigest: IDigest;
LInput, LHash: TBytes;
begin
LInput := TConverters.ConvertStringToBytes('Hello CryptoLib', TEncoding.UTF8);
LDigest := TDigestUtilities.GetDigest('SHA-256');
SetLength(LHash, LDigest.GetDigestSize);
LDigest.BlockUpdate(LInput, 0, Length(LInput));
LDigest.DoFinal(LHash, 0);
WriteLn('SHA-256: ', THexEncoder.Encode(LHash, False));
end;
```
### ECDSA 签名 / 验证
```
uses
ClpECUtilities, ClpIX9ECParametersHolder, ClpECParameters, ClpIECParameters,
ClpSignerUtilities, ClpISigner, ClpConverters, ClpGeneratorUtilities,
ClpSecureRandom, ClpISecureRandom, ClpECGenerators, ClpIECGenerators,
ClpIAsymmetricCipherKeyPair, ClpIAsymmetricCipherKeyPairGenerator;
var
LCurve: IX9ECParameters;
LDomain: IECDomainParameters;
LKpg: IAsymmetricCipherKeyPairGenerator;
LKp: IAsymmetricCipherKeyPair;
LSigner: ISigner;
LMsg, LSig: TBytes;
begin
// Set up the secp256k1 curve
LCurve := TECUtilities.FindECCurveByName('secp256k1');
LDomain := TECDomainParameters.Create(LCurve.Curve, LCurve.G,
LCurve.N, LCurve.H, LCurve.GetSeed);
// Generate a key pair
LKpg := TGeneratorUtilities.GetKeyPairGenerator('ECDSA');
LKpg.Init(TECKeyGenerationParameters.Create(LDomain,
TSecureRandom.Create() as ISecureRandom));
LKp := LKpg.GenerateKeyPair();
LMsg := TConverters.ConvertStringToBytes('Sign me', TEncoding.UTF8);
// Sign
LSigner := TSignerUtilities.GetSigner('SHA-256withECDSA');
LSigner.Init(True, LKp.Private);
LSigner.BlockUpdate(LMsg, 0, Length(LMsg));
LSig := LSigner.GenerateSignature();
// Verify
LSigner.Init(False, LKp.Public);
LSigner.BlockUpdate(LMsg, 0, Length(LMsg));
Assert(LSigner.VerifySignature(LSig));
end;
```
更多示例(RSA、EC、Ed25519、ML-KEM、ML-DSA、SLH-DSA、证书、密码哈希等)可在 [`CryptoLib.Examples`](CryptoLib.Examples/src/Examples/) 目录中找到。
## 支持的平台
| 操作系统 | Delphi | FreePascal |
|---|:---:|:---:|
| Windows (XP 及更高版本) | ✅ | ✅ |
| Linux | ❓ | ✅ |
| macOS | ❓ | ✅ |
| Oracle Solaris | ➖ | ✅ |
| BSD (FreeBSD) | ➖ | ✅ |
| Android | ✅ | ❓ |
| iOS 2.0+ | ❓ | ❓ |
**架构:** I386、X86_64、ARM32、AArch64
## 运行测试
测试使用 **DUnit** (Delphi) 和 **FPCUnit** (FreePascal)。
**Delphi:** 在 IDE 中打开 `CryptoLib.Tests/Delphi.Tests/CryptoLib.Tests.dpr` 并运行。
**FreePascal / Lazarus:** 在 IDE 中打开 `CryptoLib.Tests/FreePascal.Tests/CryptoLib.Tests.lpi` 并运行。
## 依赖项
CryptoLib4Pascal 需要两个配套库,必须单独安装:
| 依赖项 | 用途 |
|---|---|
| [HashLib4Pascal](https://github.com/Xor-el/HashLib4Pascal) | 哈希函数实现 |
| [SimpleBaseLib4Pascal](https://github.com/Xor-el/SimpleBaseLib4Pascal) | Base 编码/解码 |
## 捐赠
如果您觉得这个库有用并希望支持它的持续开发,我们非常感谢您的捐赠! 🙏
| 加密货币 | 钱包地址 |
|---|---|
|

**Bitcoin (BTC)** | `bc1quqhe342vw4ml909g334w9ygade64szqupqulmu` |
|

**Ethereum (ETH)** | `0x53651185b7467c27facab542da5868bfebe2bb69` |
|

**Solana (SOL)** | `BPZHjY1eYCdQjLumvrTJRi5TXj3Yz1vAWcmyEB9Miu` |
## 许可证
CryptoLib4Pascal 基于 [MIT License](LICENSE) 发布。