Flutter Ed25519 HD密钥管理插件ed25519_hd_key的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter Ed25519 HD密钥管理插件ed25519_hd_key的使用

ed25519_hd_key是一个Flutter插件,用于Ed25519算法的HD(分层确定性)密钥生成和管理。它基于JavaScript库ed25519-hd-key实现,并遵循SLIP-0010规范。

Key Derivation for ed25519

该插件支持根据给定的种子生成主密钥以及从路径中派生子密钥。

使用方法

安装依赖

首先,在你的pubspec.yaml文件中添加以下依赖:

dependencies:
  ed25519_hd_key: ^版本号
  convert: ^3.0.1 # 用于十六进制编码/解码

然后运行flutter pub get来安装这些包。

示例代码

下面是一个完整的示例,展示了如何使用ed25519_hd_key插件生成主密钥、从路径派生密钥以及获取公钥。

import 'package:ed25519_hd_key/ed25519_hd_key.dart';
import 'package:convert/convert.dart';

void main() async {
  // 十六进制字符串形式的种子
  String hexSeed = 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542';
  
  // 将十六进制字符串转换为字节数组
  List<int> seedBytes = hex.decode(hexSeed);

  // 从种子生成主密钥
  KeyData master = await ED25519_HD_KEY.getMasterKeyFromSeed(seedBytes);
  print('Master Key: ${hex.encode(master.key)}');
  print('Chain Code: ${hex.encode(master.chainCode)}');

  // 根据指定路径派生密钥
  KeyData derivedKey = await ED25519_HD_KEY.derivePath("m/0'/2147483647'", seedBytes);
  print('Derived Key: ${hex.encode(derivedKey.key)}');
  print('Derived Chain Code: ${hex.encode(derivedKey.chainCode)}');

  // 获取公钥
  var publicKey = await ED25519_HD_KEY.getPublicKey(derivedKey.key);
  print('Public Key: ${hex.encode(publicKey)}');
}

更多关于Flutter Ed25519 HD密钥管理插件ed25519_hd_key的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Ed25519 HD密钥管理插件ed25519_hd_key的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中集成并使用ed25519_hd_key插件来管理Ed25519 HD密钥的示例代码。这个插件允许你生成基于BIP-32/BIP-44的Ed25519 HD密钥。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加ed25519_hd_key插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  ed25519_hd_key: ^最新版本号  # 请替换为实际的最新版本号

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Flutter项目中,导入ed25519_hd_key插件:

import 'package:ed25519_hd_key/ed25519_hd_key.dart';

3. 生成主密钥(Master Key)

使用HDKey.fromSeed方法从随机种子生成主密钥:

import 'dart:typed_data';
import 'package:ed25519_hd_key/ed25519_hd_key.dart';
import 'package:pointycastle/export.dart';

void main() async {
  // 生成随机种子
  Uint8List seed = Uint8List(32);
  Random.secure().nextBytes(seed);

  // 从种子生成主密钥
  HDKey masterKey = HDKey.fromSeed(seed);

  print("Master Key: ${masterKey.privateKey.toHex()}");
  print("Master Public Key: ${masterKey.publicKey.toHex()}");
}

4. 派生子密钥

使用derivePath方法根据BIP-32路径派生子密钥:

void deriveKeys() {
  // 假设你已经有了主密钥
  HDKey masterKey = ...; // 从上面的步骤中获取

  // BIP-32路径,例如 "m/44'/60'/0'/0/0"
  String path = "m/44'/60'/0'/0/0";

  // 派生子密钥
  HDKey childKey = masterKey.derivePath(path);

  print("Child Key Private: ${childKey.privateKey.toHex()}");
  print("Child Key Public: ${childKey.publicKey.toHex()}");
}

5. 签名和验证

虽然ed25519_hd_key插件本身不提供签名和验证功能,但你可以结合dart-ed25519库来完成这些操作。首先,添加dart-ed25519依赖:

dependencies:
  ed25519: ^最新版本号  # 请替换为实际的最新版本号

然后,你可以使用派生出的公钥和私钥进行签名和验证:

import 'package:ed25519/ed25519.dart';

void signAndVerify() {
  // 假设你已经有了派生出的子密钥
  HDKey childKey = ...; // 从上面的步骤中获取

  // 要签名的消息
  Uint8List message = Uint8List.fromList('Hello, Ed25519!'.codeUnits);

  // 签名
  Uint8List signature = Ed25519.sign(message, childKey.privateKey);

  // 验证签名
  bool isValid = Ed25519.verify(message, signature, childKey.publicKey);

  print("Signature: ${signature.toHex()}");
  print("Signature Valid: $isValid");
}

完整示例

将上述代码片段整合到一个完整的Flutter应用中:

import 'dart:typed_data';
import 'package:flutter/material.dart';
import 'package:ed25519_hd_key/ed25519_hd_key.dart';
import 'package:pointycastle/export.dart';
import 'package:ed25519/ed25519.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Ed25519 HD Key Management'),
        ),
        body: Center(
          child: KeyManagementScreen(),
        ),
      ),
    );
  }
}

class KeyManagementScreen extends StatefulWidget {
  @override
  _KeyManagementScreenState createState() => _KeyManagementScreenState();
}

class _KeyManagementScreenState extends State<KeyManagementScreen> {
  String? masterPrivateKey;
  String? masterPublicKey;
  String? childPrivateKey;
  String? childPublicKey;
  String? signature;
  bool? isValid;

  @override
  void initState() {
    super.initState();
    generateKeys();
  }

  void generateKeys() async {
    Uint8List seed = Uint8List(32);
    Random.secure().nextBytes(seed);

    HDKey masterKey = HDKey.fromSeed(seed);
    HDKey childKey = masterKey.derivePath("m/44'/60'/0'/0/0");

    setState(() {
      masterPrivateKey = masterKey.privateKey.toHex();
      masterPublicKey = masterKey.publicKey.toHex();
      childPrivateKey = childKey.privateKey.toHex();
      childPublicKey = childKey.publicKey.toHex();
    });

    Uint8List message = Uint8List.fromList('Hello, Ed25519!'.codeUnits);
    Uint8List sig = Ed25519.sign(message, childKey.privateKey);
    bool valid = Ed25519.verify(message, sig, childKey.publicKey);

    setState(() {
      signature = sig.toHex();
      isValid = valid;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        Text("Master Private Key: $masterPrivateKey"),
        Text("Master Public Key: $masterPublicKey"),
        Text("Child Private Key: $childPrivateKey"),
        Text("Child Public Key: $childPublicKey"),
        Text("Signature: $signature"),
        Text("Signature Valid: $isValid"),
      ],
    );
  }
}

请注意,以上代码仅供示例,并未包含完整的错误处理和UI设计。在实际应用中,请确保添加适当的错误处理和用户体验设计。

回到顶部