Flutter椭圆曲线加密插件secp256k1的使用

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

Flutter椭圆曲线加密插件secp256k1的使用

dart-secp256k1简介

dart-secp256k1 是一个纯Dart语言实现的secp256k1算法库。secp256k1指的是比特币公钥密码学中使用的椭圆曲线参数,定义在高效密码标准(SEC)中(Certicom Research, http://www.secg.org/sec2-v2.pdf)。目前比特币使用secp256k1与ECDSA算法,尽管相同的曲线和相同的公私钥可以用于其他一些算法如Schnorr。

使用方法

下面是一个简单的使用示例:

import 'package:secp256k1/secp256k1.dart';

void main() {
  // 创建私钥对象
  var pk = PrivateKey.fromHex('c37c299bb7f5ffd8d9329d052983342a8c3234ff3b3fa32a292187341f7146d7');
  
  // 获取对应的公钥
  var pub = pk.publicKey;
  print('Public Key (Hex): ${pub.toHex()}');
  print('Compressed Public Key (Hex): ${pub.toCompressedHex()}');

  // 消息哈希值(这里以"hello world"的SHA-256哈希为例)
  var messageHash = 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9';
  
  // 对消息进行签名
  var sig = pk.signature(messageHash);
  print('Signature verification result: ${sig.verify(pub, messageHash)}'); // true
}

此代码段展示了如何从十六进制字符串创建一个私钥,获取其对应的公钥,并打印出公钥的未压缩和压缩形式。然后对给定的消息哈希值进行签名,并验证签名是否有效。

注意事项

  • 警告:该库不提供确定性的ECDSA签名。
  • 如果您发现了任何问题或有功能需求,请在issue tracker上提交。

示例代码详解

为了更深入地理解dart-secp256k1的功能,我们可以查看官方提供的完整测试用例中的部分代码片段,这些代码不仅测试了基本功能,还确保了正确性。

import 'package:secp256k1/secp256k1.dart';
import 'package:test/test.dart';

void main() {
  // 测试私钥到公钥转换
  var pk1 = PrivateKey.fromHex('c37c299bb7f5ffd8d9329d052983342a8c3234ff3b3fa32a292187341f7146d7');
  var pub1 = pk1.publicKey;
  var hexPub = pub1.toCompressedHex();
  expect(hexPub, '03a12b6218425127f186011ff4c203b8d6ea651877c46f12484b2eda492596484f');
  expect(PublicKey.fromHex('03a12b6218425127f186011ff4c203b8d6ea651877c46f12484b2eda492596484f'), pub1);

  // 测试另一个私钥及其公钥
  var pk2 = PrivateKey.fromHex('52d62cfcf7062af53f7bec124fe9285eaa8a8963411ba613b7432be73565b6b3');
  var pub2 = pk2.publicKey;
  hexPub = pub2.toHex();
  expect(hexPub, '0449aedf74e8f87811761cf3d5fa8f8eaa42b4c657efc986939229a898b3ee27a000f9a247290fb5716c2db17dc193fd4e3f7b36a9947b477c6f0769c15fb8bf79');
  expect(PublicKey.fromHex('0449aedf74e8f87811761cf3d5fa8f8eaa42b4c657efc986939229a898b3ee27a000f9a247290fb5716c2db17dc193fd4e3f7b36a9947b477c6f0769c15fb8bf79'), pub2);

  // 测试签名和验证
  var msg = 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9'; // "hello world"的SHA-256哈希
  var sig = pk2.signature(msg);
  expect(sig.verify(pub2, msg), true);
  expect(sig.verify(pub1, msg), false); // 不同的私钥生成的签名不能通过另一个公钥验证
  expect(sig.verify(pub2, 'b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde8'), false); // 修改后的消息哈希无法通过验证
  expect(Signature(BigInt.zero, BigInt.zero).verify(pub1, msg), false); // 无效的签名对象无法通过验证
}

这段代码通过多个测试用例来验证dart-secp256k1库的基本功能,包括私钥到公钥的转换、不同私钥生成的不同签名以及签名验证等操作。每个测试都确保了预期的结果,从而保证了库的可靠性和准确性。

希望上述内容能帮助你更好地理解和使用dart-secp256k1插件!如果有更多疑问或者需要进一步的帮助,请随时提问。


更多关于Flutter椭圆曲线加密插件secp256k1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter椭圆曲线加密插件secp256k1的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter中使用椭圆曲线加密(ECC)插件 secp256k1 可以帮助你实现基于SECP256K1曲线的加密和解密操作。下面是一个如何在Flutter项目中使用该插件的示例代码。

首先,确保你已经在你的 pubspec.yaml 文件中添加了 secp256k1 依赖:

dependencies:
  flutter:
    sdk: flutter
  secp256k1: ^x.y.z  # 替换为最新版本号

然后运行 flutter pub get 来获取依赖。

接下来,创建一个 Dart 文件(例如 main.dart),并在其中使用 secp256k1 插件进行加密和解密操作。以下是一个简单的示例,展示如何生成密钥对、签名数据以及验证签名。

import 'package:flutter/material.dart';
import 'package:secp256k1/secp256k1.dart';
import 'dart:typed_data';
import 'dart:convert';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('SECP256K1 Example'),
        ),
        body: Center(
          child: Text('Generating keys and signing data...'),
        ),
      ),
    );
  }

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

  Future<void> _generateKeysAndSignData() async {
    // Generate a new key pair
    final keyPair = await Secp256k1.generateKeyPair();
    final privateKey = keyPair.privateKey;
    final publicKey = keyPair.publicKey;

    print('Private Key: ${base64Encode(privateKey)}');
    print('Public Key: ${base64Encode(publicKey)}');

    // Data to sign
    final data = Uint8List.fromList(utf8.encode('Hello, Flutter!'));

    // Sign the data
    final signature = await Secp256k1.sign(data, privateKey);
    print('Signature: ${base64Encode(signature)}');

    // Verify the signature
    final isVerified = await Secp256k1.verify(data, signature, publicKey);
    print('Signature Verified: $isVerified');
  }
}

解释

  1. 依赖导入

    import 'package:secp256k1/secp256k1.dart';
    
  2. 生成密钥对

    final keyPair = await Secp256k1.generateKeyPair();
    final privateKey = keyPair.privateKey;
    final publicKey = keyPair.publicKey;
    
  3. 数据签名

    final data = Uint8List.fromList(utf8.encode('Hello, Flutter!'));
    final signature = await Secp256k1.sign(data, privateKey);
    
  4. 验证签名

    final isVerified = await Secp256k1.verify(data, signature, publicKey);
    
  5. 输出: 为了便于查看,将私钥、公钥和签名转换为Base64编码格式并打印出来。

注意

  • 确保 secp256k1 插件的最新版本支持上述方法。如果API有变化,请参考官方文档或插件的README文件。
  • 本示例仅用于演示如何在Flutter中使用SECP256K1进行基本的加密操作。在实际应用中,请确保对私钥和敏感数据进行适当的保护。

希望这个示例代码对你有所帮助!

回到顶部