Xor-el/CryptoLib4Pascal

GitHub: Xor-el/CryptoLib4Pascal

面向现代 Object Pascal 的全功能密码学库,提供从经典加密到后量子算法的广泛支持。

Stars: 252 | Forks: 74

CryptoLib4Pascal logo

CryptoLib4Pascal

Comprehensive cryptographic library for modern Object Pascal

Build Status License: MIT Delphi Syndey+ FreePascal 3.2.2+

**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 **Bitcoin (BTC)** | `bc1quqhe342vw4ml909g334w9ygade64szqupqulmu` | | Ethereum **Ethereum (ETH)** | `0x53651185b7467c27facab542da5868bfebe2bb69` | | Solana **Solana (SOL)** | `BPZHjY1eYCdQjLumvrTJRi5TXj3Yz1vAWcmyEB9Miu` | ## 许可证 CryptoLib4Pascal 基于 [MIT License](LICENSE) 发布。
标签:Delphi, FreePascal, Object Pascal, 加密解密, 后量子密码学, 密码学库