如何在flutter中生成或创建私钥/公钥?

问题描述 投票:0回答:2

我需要在我的 Flutter 应用程序中生成密钥对,有一个名为 RSA 的库,它可以解析一对公钥/私钥,并能够使用它们加密和解密字符串,但它无法生成密钥对新的密钥对(最好来自给定的字符串)。

首先如何生成密钥?我是不是错过了什么?

//Future to hold our KeyPair
Future<crypto.AsymmetricKeyPair> futureKeyPair;

//to store the KeyPair once we get data from our future
crypto.AsymmetricKeyPair keyPair;

Future<crypto.AsymmetricKeyPair<crypto.PublicKey, crypto.PrivateKey>> getKeyPair()
{
  var helper = RsaKeyHelper();
  return helper.computeRSAKeyPair(helper.getSecureRandom());
}
dart rsa private-key public-key key-generator
2个回答
0
投票

使用 fast_rsa 包很简单:

import 'package:fast_rsa/fast_rsa.dart';
   
KeyPair keyPair1 = await RSA.generate(2048);
print(keyPair1.privateKey);
print(keyPair1.publicKey);

https://pub.dev/packages/fast_rsa


0
投票

为了改进和集成您在 Flutter 中生成以太坊私钥和公钥的代码,我将进行以下增强:

  1. 代码组织:提高代码的可读性和组织性。
  2. 错误处理:添加错误处理以确保鲁棒性。
  3. 文档:包括注释来解释代码的每个部分。

这是代码的修订版本,包含注释和改进:

改进的代码

import 'package:bip39/bip39.dart' as bip39;
import 'package:ed25519_hd_key/ed25519_hd_key.dart';
import 'package:ethereum_address/ethereum_address.dart';
import 'package:convert/convert.dart';  // For HEX encoding
import 'package:flutter/material.dart';
import 'app_locals.dart';  // Ensure you have this file to handle storage

class KeyService extends ChangeNotifier {
  String? mnemonic;
  String? ethereumPrivateKey;

  // Generate a new mnemonic phrase and store it
  @override
  Future<String> generateMnemonic() async {
    try {
      // Generate a new mnemonic phrase
      mnemonic = bip39.generateMnemonic();
      // Store the mnemonic in persistent storage
      await AppLocals.instance.storeData(key: AppLocals.instance.menemonic, value: mnemonic!);
      // Split the mnemonic into words for further use
      return mnemonic!;
    } catch (e) {
      // Handle errors, for example, by logging or showing an error message
      print('Error generating mnemonic: $e');
      throw Exception('Failed to generate mnemonic');
    }
  }

  // Generate the private key from the mnemonic and store it
  @override
  Future<String> getPrivateAndPublicKeys({String? givenMnemonic}) async {
    try {
      // Indicate that the key generation process is loading
      isSecretKeyPageLoading = true;
      notifyListeners();

      // Use the provided mnemonic or the generated one
      final seed = bip39.mnemonicToSeed(givenMnemonic ?? mnemonic!);
      // Generate the master key from the seed
      final master = await ED25519_HD_KEY.getMasterKeyFromSeed(seed);
      // Encode the private key in hexadecimal format
      final privateKey = hex.encode(master.key);

      // Store the private key in persistent storage
      await AppLocals.instance.storeData(key: AppLocals.instance.etherscanPrivateKey, value: privateKey);
      ethereumPrivateKey = privateKey;

      // Return the private key
      return privateKey;
    } catch (e) {
      // Handle errors
      print('Error generating private key: $e');
      throw Exception('Failed to generate private key');
    } finally {
      // Reset the loading state
      isSecretKeyPageLoading = false;
      notifyListeners();
    }
  }

  // Generate the public key from the stored private key
  Future<EthereumAddress> getPublicKey() async {
    try {
      // Ensure the private key is available
      if (ethereumPrivateKey == null) {
        throw Exception('Private key is not set');
      }

      // Create an Ethereum private key object
      final private = EthPrivateKey.fromHex(ethereumPrivateKey!);
      // Generate the corresponding Ethereum address
      final address = private.address;

      // Store the public key in persistent storage
      await AppLocals.instance.storeData(key: AppLocals.instance.etherscanPublicKey, value: address.toString());

      // Return the Ethereum address
      return address;
    } catch (e) {
      // Handle errors
      print('Error generating public key: $e');
      throw Exception('Failed to generate public key');
    }
  }

  // Loading state indicator
  bool isSecretKeyPageLoading = false;
}

说明

  1. generateMnemonic()
    方法

    • 生成新的助记词。
    • 使用
      AppLocals
      存储助记词短语。
    • 处理错误并返回助记词。
  2. getPrivateAndPublicKeys()
    方法

    • 采用可选的
      givenMnemonic
      。如果未提供,则使用存储的助记词。
    • 将助记词转换为种子并导出主密钥。
    • 以十六进制格式对私钥进行编码并存储。
    • 更新加载状态并处理错误。
  3. getPublicKey()
    方法

    • 检索存储的私钥。
    • 从私钥生成以太坊地址。
    • 存储公钥并返回地址。
    • 处理错误并检查私钥是否存在。
  4. 错误处理

    • 添加了
      try-catch
      块以有效管理错误。
  5. 加载状态:

    • 添加了
      bool
      标志
      isSecretKeyPageLoading
      以指示密钥生成期间的加载状态。

此更新的代码应该提供一个强大的解决方案,用于在 Flutter 应用程序中生成和管理以太坊密钥。根据您的应用程序的具体要求和库,根据需要调整导入和存储方法。

© www.soinside.com 2019 - 2024. All rights reserved.