FlutterBIP32ED25519密钥管理插件bip32_ed25519的使用
FlutterBIP32ED25519密钥管理插件bip32_ed25519的使用
简介
bip32_ed25519
是一个用于在 Dart 中实现 BIP32-Ed25519 密钥生成方案的库。该库允许开发人员生成基于 Edwards 曲线(如 Ed25519)的确定性密钥。
API 接口
目前,该库的具体 API 接口还在完善中。
密钥类型
ED25519 (RFC 8032) 密钥
- 生成的 Ed25519 签名密钥长度为 64 字节,由 ED25519 种子(私钥)和生成的公钥拼接而成。
- 私钥,也称为种子,是一个长度为 32 字节的加密安全随机数据。
import 'package:bip32_ed25519/bip32_ed25519.dart';
void main() {
// 生成一个新的 ED25519 密钥对
final ed25519 = ExtendedPrivateKey.generate();
}
ED25519 扩展密钥
- 私钥是一个长度为 64 字节的加密安全随机数据,可以解释为 ED25519 种子或第一个 32 字节(种子部分)的 SHA512 哈希值。
- 扩展密钥的左 32 字节等同于 X25519(用于 ECDH)的私钥。
void main() {
// 从种子生成扩展密钥
final ed25519 = ExtendedPrivateKey.fromSeed(List<int>.generate(32, (index) => index));
}
BIP32-ED25519 密钥
- BIP32-ED25519 衍生要求 ED25519 扩展密钥的第 31 字节的第 3 位必须清除。
- 这意味着每个 BIP32-ED2559 签名密钥都是有效的 Extended ED25519 密钥,
- 但半数的 ED25519 扩展密钥和因此半数的 ED25519 密钥与 BIP32-ED25519 密钥不兼容。
void main() {
// 生成一个新的 BIP32-ED25519 密钥对
final bip32Ed25519 = ExtendedBip32PrivateKey.generate();
}
密钥标准化
KeyPair | key | verifyKey | encryptionKey | publicKey | rawKey | Comment |
---|---|---|---|---|---|---|
ed25519 | ed25519_sk | ed25519_pk | N/A | verifyKey | ed25519_sk | 这是 32 字节长的种子 |
… | … | … | … | … | … | … |
ED25519 密钥
Ed25519 是一个使用曲线25519 的椭圆曲线数字签名算法(ECDSA),由 Dan Bernstein, Niels Duif, Tanja Lange, Peter Schwabe 和 Bo-Yin Yang 设计。
void main() {
// 创建一个新的 ED25519 密钥对
final ed25519 = ExtendedPrivateKey.generate();
// 获取公钥
final publicKey = ed25519.public;
}
ED25519 扩展密钥
64 字节长的扩展密钥包含:
- 只有 64 字节长的秘密密钥。
- 或者 64 字节长的扩展私钥和 32 字节公钥,类似于普通的 ED25519 密钥,包含 32 字节私钥(种子)和 32 字节长的私钥。
void main() {
// 创建一个新的 ED25519 扩展密钥
final ed25519Ext = ExtendedPrivateKey.fromSeed(List<int>.generate(32, (index) => index));
// 获取公钥
final publicKey = ed25519Ext.public;
}
BIP32-ED25519 密钥
96 字节长的 BIP32-ED25519 密钥包含一个 ed25519e_sk 和链码。
void main() {
// 创建一个新的 BIP32-ED25519 密钥对
final bip32Ed25519 = ExtendedBip32PrivateKey.generate();
// 获取公钥
final publicKey = bip32Ed25519.public;
}
参考文献
限制
在 Cardano 区块链中,密钥通过 BIP32-ED25519 规范生成。 BIP32-ED25519 除了遵循 ED25519 (RFC 8032) 之外,还需要清除第 31 字节的第 3 位。 因此,一半的 ED25519 扩展密钥和因此一半的 ED25519 私钥与 BIP32-ED25519 不兼容。
解决方法
不同的钱包实现通过不同的方式来生成主节点/根密钥以克服此限制。 例如,Yoroi 只需要清除额外的第 3 位,而旧版 Daedalus 则会哈希对应的主密钥,直到找到兼容的密钥。
void main() {
// 创建一个新的 BIP32-ED25519 密钥对
final bip32Ed25519 = ExtendedBip32PrivateKey.generate();
// 签名消息
final signature = bip32Ed25519.sign("Hello, world!");
// 验证签名
final isValid = bip32Ed25519.verify("Hello, world!", signature);
}
更多关于FlutterBIP32ED25519密钥管理插件bip32_ed25519的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于FlutterBIP32ED25519密钥管理插件bip32_ed25519的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是一个关于如何在Flutter项目中使用bip32_ed25519
插件进行BIP32 ED25519密钥管理的代码示例。这个插件允许你生成、派生和管理BIP32 ED25519密钥。
首先,确保你的Flutter项目已经添加了bip32_ed25519
依赖。在pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
bip32_ed25519: ^latest_version # 请替换为最新版本号
然后,运行flutter pub get
来获取依赖。
接下来是一个简单的示例代码,展示如何使用bip32_ed25519
插件生成主密钥(master key),并从主密钥派生出一个子密钥(child key)。
import 'package:flutter/material.dart';
import 'package:bip32_ed25519/bip32_ed25519.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('BIP32 ED25519 Key Management'),
),
body: Center(
child: FutureBuilder<void>(
future: _generateAndDeriveKeys(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return CircularProgressIndicator();
} else if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('Keys generated and derived successfully!');
}
},
),
),
),
);
}
Future<void> _generateAndDeriveKeys() async {
// 生成主密钥(Master Key)
final masterKey = BIP32ED25519.fromSeed(Uint8List.fromList(List.generate(32, (index) => index % 256)));
// 打印主密钥的扩展私钥和公钥
print('Master Extended Private Key: ${masterKey.toBase58()}');
print('Master Extended Public Key: ${masterKey.neutralized().toBase58()}');
// 从主密钥派生出一个子密钥(使用BIP32路径m/0'/0')
final childKey = masterKey.derivePath("m/0'/0'");
// 打印子密钥的扩展私钥和公钥
print('Child Extended Private Key: ${childKey.toBase58()}');
print('Child Extended Public Key: ${childKey.neutralized().toBase58()}');
}
}
代码解释:
-
依赖添加:在
pubspec.yaml
文件中添加bip32_ed25519
依赖。 -
主应用:创建一个简单的Flutter应用,包含一个
FutureBuilder
,用于处理异步操作(生成和派生密钥)。 -
生成主密钥:使用
BIP32ED25519.fromSeed
方法生成一个主密钥。这里我们用一个简单的32字节数组作为种子(实际应用中应使用安全的随机种子)。 -
打印主密钥:将主密钥的扩展私钥和公钥转换为Base58编码并打印出来。
-
派生子密钥:使用
derivePath
方法从主密钥派生出一个子密钥,BIP32路径为m/0'/0'
。 -
打印子密钥:将子密钥的扩展私钥和公钥转换为Base58编码并打印出来。
注意事项:
- 安全性:实际应用中,应使用安全的随机数生成器来生成种子。
- 错误处理:代码示例中简单处理了错误,实际应用中应增加更详细的错误处理逻辑。
这个示例代码展示了如何使用bip32_ed25519
插件进行基本的BIP32 ED25519密钥管理操作。根据你的需求,你可以进一步扩展这个示例,例如处理更多的BIP32路径、存储密钥、或与其他加密操作集成。