djx-y-z/liboqs_dart
GitHub: djx-y-z/liboqs_dart
为 Dart 和 Flutter 应用提供后量子密码学算法的跨平台 FFI 绑定库,支持 NIST 标准化的密钥封装与数字签名。
Stars: 4 | Forks: 1
# liboqs - Dart 的后量子密码学
[](https://pub.dev/packages/liboqs)
[](https://github.com/djx-y-z/liboqs_dart/actions/workflows/test.yml)
[](https://gist.github.com/djx-y-z/d9cb3b92acef835005863e96294d984e)
[](LICENSE)
[](https://dart.dev)
[](https://flutter.dev)
[](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, 后量子密码学, 密码学库