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

1 回复

更多关于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()}');
  }
}

代码解释:

  1. 依赖添加:在pubspec.yaml文件中添加bip32_ed25519依赖。

  2. 主应用:创建一个简单的Flutter应用,包含一个FutureBuilder,用于处理异步操作(生成和派生密钥)。

  3. 生成主密钥:使用BIP32ED25519.fromSeed方法生成一个主密钥。这里我们用一个简单的32字节数组作为种子(实际应用中应使用安全的随机种子)。

  4. 打印主密钥:将主密钥的扩展私钥和公钥转换为Base58编码并打印出来。

  5. 派生子密钥:使用derivePath方法从主密钥派生出一个子密钥,BIP32路径为m/0'/0'

  6. 打印子密钥:将子密钥的扩展私钥和公钥转换为Base58编码并打印出来。

注意事项:

  • 安全性:实际应用中,应使用安全的随机数生成器来生成种子。
  • 错误处理:代码示例中简单处理了错误,实际应用中应增加更详细的错误处理逻辑。

这个示例代码展示了如何使用bip32_ed25519插件进行基本的BIP32 ED25519密钥管理操作。根据你的需求,你可以进一步扩展这个示例,例如处理更多的BIP32路径、存储密钥、或与其他加密操作集成。

回到顶部