djx-y-z/liboqs_dart

GitHub: djx-y-z/liboqs_dart

为 Dart 和 Flutter 应用提供后量子密码学算法的跨平台 FFI 绑定库,支持 NIST 标准化的密钥封装与数字签名。

Stars: 4 | Forks: 1

# liboqs - Dart 的后量子密码学 [![pub package](https://img.shields.io/pub/v/liboqs.svg)](https://pub.dev/packages/liboqs) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/cas/09/097271ca091990be630ef6043309cc48240faa054413384202036fa2efedb2d2.svg)](https://github.com/djx-y-z/liboqs_dart/actions/workflows/test.yml) [![Coverage](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/djx-y-z/d9cb3b92acef835005863e96294d984e/raw/coverage.json)](https://gist.github.com/djx-y-z/d9cb3b92acef835005863e96294d984e) [![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE) [![Dart](https://img.shields.io/badge/dart-%3E%3D3.10.0-brightgreen.svg)](https://dart.dev) [![Flutter](https://img.shields.io/badge/flutter-%3E%3D3.38.0-blue.svg)](https://flutter.dev) [![liboqs](https://img.shields.io/badge/liboqs-0.16.0-orange.svg)](https://github.com/open-quantum-safe/liboqs) 一个 [liboqs](https://github.com/open-quantum-safe/liboqs) 的 Dart FFI wrapper,提供对后量子密码算法的访问,包括密钥封装机制 (KEM)、数字签名和密码学安全的随机数生成。 ## 平台支持 | | Android | iOS | macOS | Linux | Windows | |-------------|---------|-------|--------|------------|---------| | **支持** | SDK 21+ | 13.0+ | 10.15+ | arm64, x64 | x64 | | **架构** | arm64, armv7, x64 | arm64 | arm64, x64 | arm64, x64 | x64 | ## 功能 - **支持 Flutter 与 CLI**:适用于 Flutter 应用程序和独立的 Dart CLI 应用程序 - **密钥封装 (ML-KEM)**:NIST 标准化 (FIPS 203),外加 Classic McEliece、FrodoKEM、HQC - **数字签名 (ML-DSA, SLH-DSA)**:NIST 标准化 (FIPS 204, 205),外加 Falcon、MAYO - **密码学安全随机数**:系统支持的随机数生成 - **零配置**:通过 Build Hooks 包含预构建的原生库 - **高性能**:具有最小开销的直接 FFI 绑定 - **自动更新**:每日自动执行的机器人会为新的 liboqs 版本提交更新 PR;原生库通过经过维护者签名的特定发布标签进行重新构建 ## 安装 添加到您的 `pubspec.yaml`: ``` dependencies: liboqs: ^x.x.x ``` ## 快速开始 ``` import 'package:liboqs/liboqs.dart'; void main() { // Initialize the library (optional but recommended for performance) LibOQS.init(); // Key Encapsulation (ML-KEM) final kem = KEM.create('ML-KEM-768'); final keyPair = kem.generateKeyPair(); final encResult = kem.encapsulate(keyPair.publicKey); final sharedSecret = kem.decapsulate(encResult.ciphertext, keyPair.secretKey); kem.dispose(); // Digital Signatures (ML-DSA) final sig = Signature.create('ML-DSA-65'); final sigKeyPair = sig.generateKeyPair(); final signature = sig.sign(message, sigKeyPair.secretKey); final isValid = sig.verify(message, signature, sigKeyPair.publicKey); sig.dispose(); // Random Generation final randomBytes = OQSRandom.generateBytes(32); final randomInt = OQSRandom.generateInt(1, 100); } ``` ## 支持的算法 ### 密钥封装机制 (KEM) | 算法 | 安全等级 | 状态 | |-----------|----------------|--------| | ML-KEM-512, ML-KEM-768, ML-KEM-1024 | NIST 级别 1/3/5 | FIPS 203 标准 | | Kyber512, Kyber768, Kyber1024 | NIST 级别 1/3/5 | 遗留 (请使用 ML-KEM) | | HQC-1, HQC-3, HQC-5 | NIST 级别 1/3/5 | NIST 入选 | | BIKE-L1, BIKE-L3, BIKE-L5 | NIST 级别 1/3/5 | 第四轮候选 (在 Windows 或 32 位 ARM 上不可用) | | Classic McEliece 变体 | 各种 | ISO 审议中 | | FrodoKEM-* (加盐), eFrodoKEM-* (临时) | 各种 | ISO 审议中 | | NTRU, NTRU-Prime | 各种 | 未入选 NIST | ### 数字签名 | 算法 | 安全等级 | 状态 | |-----------|----------------|--------| | ML-DSA-44, ML-DSA-65, ML-DSA-87 | NIST 级别 2/3/5 | FIPS 204 标准 | | SLH-DSA 变体 | 各种 | FIPS 205 标准 | | Falcon-512, Falcon-1024 (+ `Falcon-padded-*`) | NIST 级别 1/5 | NIST 入选 | | MAYO, CROSS, SNOVA, UOV, MQOM | 各种 | NIST 审议中 | ### 列出可用算法 ``` // Get all supported algorithms at runtime final kemAlgorithms = LibOQS.getSupportedKEMAlgorithms(); final sigAlgorithms = LibOQS.getSupportedSignatureAlgorithms(); // Check if specific algorithm is supported print('ML-KEM-768 supported: ${LibOQS.isKEMSupported('ML-KEM-768')}'); print('ML-DSA-65 supported: ${LibOQS.isSignatureSupported('ML-DSA-65')}'); ``` ## API 参考 ### 密钥封装 (KEM) ``` import 'package:liboqs/liboqs.dart'; final kem = KEM.create('ML-KEM-768'); // Algorithm properties print('Public key length: ${kem.publicKeyLength}'); print('Secret key length: ${kem.secretKeyLength}'); print('Ciphertext length: ${kem.ciphertextLength}'); print('Shared secret length: ${kem.sharedSecretLength}'); // Key generation final keyPair = kem.generateKeyPair(); // Encapsulation (sender side) final encResult = kem.encapsulate(keyPair.publicKey); // encResult.ciphertext - send to recipient // encResult.sharedSecret - use for encryption // Decapsulation (recipient side) final sharedSecret = kem.decapsulate(encResult.ciphertext, keyPair.secretKey); // Clean up kem.dispose(); ``` ### 数字签名 ``` import 'package:liboqs/liboqs.dart'; import 'dart:convert'; final sig = Signature.create('ML-DSA-65'); // Algorithm properties print('Public key length: ${sig.publicKeyLength}'); print('Secret key length: ${sig.secretKeyLength}'); print('Max signature length: ${sig.maxSignatureLength}'); // Key generation final keyPair = sig.generateKeyPair(); // Sign message final message = utf8.encode('Hello, post-quantum world!'); final signature = sig.sign(message, keyPair.secretKey); // Verify signature final isValid = sig.verify(message, signature, keyPair.publicKey); // Clean up sig.dispose(); ``` ### 随机数生成 ``` import 'package:liboqs/liboqs.dart'; // Generate random bytes final randomBytes = OQSRandom.generateBytes(32); // Generate cryptographic seed (32 bytes) final seed = OQSRandom.generateSeed(); // Generate random integer in range [min, max) final randomInt = OQSRandom.generateInt(1, 100); // Generate random boolean final randomBool = OQSRandom.generateBool(); // Generate random double in range [0, 1) final randomDouble = OQSRandom.generateDouble(); // Cryptographically secure shuffle final list = ['a', 'b', 'c', 'd', 'e']; OQSRandom.shuffleList(list); ``` ## 资源管理 ### 基本用法 ``` final kem = KEM.create('ML-KEM-768'); // Use KEM... kem.dispose(); // Clean up when done ``` ### 性能优化 为了获得更好的性能,请在应用程序启动时初始化一次: ``` void main() { LibOQS.init(); // Recommended at app startup runApp(MyApp()); } ``` ## 安全说明 **推荐算法:** - **ML-KEM** (FIPS 203) - NIST 标准化的密钥封装 - **ML-DSA** (FIPS 204) - NIST 标准化的数字签名 - **SLH-DSA** (FIPS 205) - NIST 标准化的基于哈希的签名 - 其他算法可能是实验性的 - 请根据当前的安全建议进行验证 **最佳实践:** - 务必在 KEM/Signature 实例上调用 `dispose()` 以释放原生资源 - 密钥对使用完毕后,请调用 `clearSecrets()` 立即将内存清零 - 密钥也会在 GC 时通过 Finalizers 自动清零(纵深防御),但不要仅依赖于此 - 使用 `LibOQSUtils.constantTimeEquals()` 比较密钥(防止时序攻击) - 使用 `OQSRandom.generateSeed()` 进行密码学密钥派生 - 保持库更新到最新版本 - 切勿记录 `toStrings()` 或 `toHexStrings()` 的输出 - 它们包含私钥 ``` // Secure usage example final kem = KEM.create('ML-KEM-768'); final keyPair = kem.generateKeyPair(); final encResult = kem.encapsulate(keyPair.publicKey); final sharedSecret = kem.decapsulate(encResult.ciphertext, keyPair.secretKey); // Verify secrets match using constant-time comparison final match = LibOQSUtils.constantTimeEquals(encResult.sharedSecret, sharedSecret); // Clean up sensitive data keyPair.clearSecrets(); encResult.clearSecrets(); kem.dispose(); ``` ## 许可证 本项目基于 MIT 许可证授权 - 详情请参阅 [LICENSE](LICENSE) 文件。 内置的 liboqs 库同样基于 MIT 许可证授权 - 关于 Open Quantum Safe 项目的许可证,请参阅 [LICENSE.liboqs](LICENSE.liboqs)。 ## 相关项目 - [liboqs](https://github.com/open-quantum-safe/liboqs) - 底层的 C 语言库 - [Open Quantum Safe](https://openquantumsafe.org/) - OQS 项目 - [NIST 后量子密码学](https://csrc.nist.gov/projects/post-quantum-cryptography) - NIST PQC 标准化 ## 贡献 欢迎贡献代码!在提交 issue 或 pull request 之前,请阅读我们的[贡献指南](CONTRIBUTING.md)。 对于重大更改,请先开启一个 issue 进行讨论,说明您希望更改的内容。
标签:Dart, FFI, Flutter, liboqs, 后量子密码学, 密码学库