Flutter加密签名插件secp256k1_ecdsa的使用

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

Flutter加密签名插件secp256k1_ecdsa的使用

在本文中,我们将介绍如何使用secp256k1_ecdsa插件在Flutter应用程序中进行加密签名。该插件支持使用ECDSA算法和SECP256k1曲线进行数字签名。

首先,确保您的pubspec.yaml文件中包含以下依赖项:

dependencies:
  secp256k1_ecdsa: ^0.1.0

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

接下来,我们将通过一个完整的示例演示如何使用secp256k1_ecdsa插件来生成私钥、公钥并进行签名验证。

完整示例代码

import 'package:flutter/material.dart';
import 'package:secp256k1_ecdsa/secp256k1_ecdsa.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text("SECP256K1 ECDSA 示例")),
        body: Center(
          child: SigningDemo(),
        ),
      ),
    );
  }
}

class SigningDemo extends StatefulWidget {
  @override
  _SigningDemoState createState() => _SigningDemoState();
}

class _SigningDemoState extends State<SigningDemo> {
  String _message = "Hello, this is a test message.";
  String _privateKey = "your private key hex";
  String _publicKey;
  String _signature;
  bool _verified;

  void _generateKeys() {
    final privateKey = PrivateKey.fromHex(_privateKey);
    setState(() {
      _publicKey = privateKey.getPublicKey().toString();
    });
  }

  void _signMessage() {
    final message = Utilities.hexToBytes(_message);
    final privateKey = PrivateKey.fromHex(_privateKey);
    final signature = privateKey.sign(message);
    setState(() {
      _signature = signature.toString();
    });
  }

  void _verifySignature() {
    final message = Utilities.hexToBytes(_message);
    final publicKey = PublicKey.fromHex(_publicKey);
    final signature = Signature.fromHex(_signature);
    final verified = publicKey.verify(signature, message);
    setState(() {
      _verified = verified;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: [
        TextField(
          decoration: InputDecoration(labelText: "消息"),
          onChanged: (value) => _message = value,
        ),
        TextField(
          decoration: InputDecoration(labelText: "私钥 (十六进制)"),
          onChanged: (value) => _privateKey = value,
        ),
        ElevatedButton(
          onPressed: _generateKeys,
          child: Text("生成公钥"),
        ),
        SizedBox(height: 20),
        Text("公钥: $_publicKey"),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _signMessage,
          child: Text("签名消息"),
        ),
        SizedBox(height: 20),
        Text("签名: $_signature"),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _verifySignature,
          child: Text("验证签名"),
        ),
        SizedBox(height: 20),
        Text("验证结果: ${_verified == null ? "" : (_verified ? "成功" : "失败")}"),
      ],
    );
  }
}

代码解释

  1. 导入库

    import 'package:flutter/material.dart';
    import 'package:secp256k1_ecdsa/secp256k1_ecdsa.dart';
    
  2. 主应用

    void main() {
      runApp(MyApp());
    }
    
  3. MyApp 类

    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(title: Text("SECP256K1 ECDSA 示例")),
            body: Center(
              child: SigningDemo(),
            ),
          ),
        );
      }
    }
    
  4. SigningDemo 类

    class SigningDemo extends StatefulWidget {
      @override
      _SigningDemoState createState() => _SigningDemoState();
    }
    
  5. _SigningDemoState 类

    class _SigningDemoState extends State<SigningDemo> {
      // 状态变量
      String _message = "Hello, this is a test message.";
      String _privateKey = "your private key hex";
      String _publicKey;
      String _signature;
      bool _verified;
    
      // 生成公钥的方法
      void _generateKeys() {
        final privateKey = PrivateKey.fromHex(_privateKey);
        setState(() {
          _publicKey = privateKey.getPublicKey().toString();
        });
      }
    
      // 签名消息的方法
      void _signMessage() {
        final message = Utilities.hexToBytes(_message);
        final privateKey = PrivateKey.fromHex(_privateKey);
        final signature = privateKey.sign(message);
        setState(() {
          _signature = signature.toString();
        });
      }
    
      // 验证签名的方法
      void _verifySignature() {
        final message = Utilities.hexToBytes(_message);
        final publicKey = PublicKey.fromHex(_publicKey);
        final signature = Signature.fromHex(_signature);
        final verified = publicKey.verify(signature, message);
        setState(() {
          _verified = verified;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            TextField(
              decoration: InputDecoration(labelText: "消息"),
              onChanged: (value) => _message = value,
            ),
            TextField(
              decoration: InputDecoration(labelText: "私钥 (十六进制)"),
              onChanged: (value) => _privateKey = value,
            ),
            ElevatedButton(
              onPressed: _generateKeys,
              child: Text("生成公钥"),
            ),
            SizedBox(height: 20),
            Text("公钥: $_publicKey"),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _signMessage,
              child: Text("签名消息"),
            ),
            SizedBox(height: 20),
            Text("签名: $_signature"),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: _verifySignature,
              child: Text("验证签名"),
            ),
            SizedBox(height: 20),
            Text("验证结果: ${_verified == null ? "" : (_verified ? "成功" : "失败")}"),
          ],
        );
      }
    }
    

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用secp256k1_ecdsa插件进行加密签名的示例代码。这个插件允许你使用SECP256K1曲线进行ECDSA(椭圆曲线数字签名算法)签名和验证。

首先,你需要在你的pubspec.yaml文件中添加这个插件:

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

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

接下来是一个完整的Flutter示例代码,展示如何生成密钥对、创建签名以及验证签名:

import 'package:flutter/material.dart';
import 'package:secp256k1_ecdsa/secp256k1_ecdsa.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 ECDSA Example'),
        ),
        body: Center(
          child: SignAndVerifyExample(),
        ),
      ),
    );
  }
}

class SignAndVerifyExample extends StatefulWidget {
  @override
  _SignAndVerifyExampleState createState() => _SignAndVerifyExampleState();
}

class _SignAndVerifyExampleState extends State<SignAndVerifyExample> {
  String privateKeyHex = '';
  String publicKeyHex = '';
  String message = 'Hello, Flutter!';
  String signatureHex = '';
  bool isVerified = false;

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

  void generateKeyPair() async {
    final privateKey = await Secp256k1Ecdsa.generatePrivateKey();
    setState(() {
      privateKeyHex = privateKey.toHexString();
      publicKeyHex = Secp256k1Ecdsa.publicKeyFromPrivate(privateKey).toHexString();
    });
  }

  void signMessage() async {
    final Uint8List privateKeyBytes = Uint8List.fromList(hexStringToByteArray(privateKeyHex));
    final Uint8List messageBytes = Uint8List.fromList(message.codeUnits);
    final signature = await Secp256k1Ecdsa.sign(privateKeyBytes, messageBytes);
    setState(() {
      signatureHex = signature.toHexString();
    });
  }

  void verifySignature() async {
    final Uint8List publicKeyBytes = Uint8List.fromList(hexStringToByteArray(publicKeyHex));
    final Uint8List messageBytes = Uint8List.fromList(message.codeUnits);
    final Uint8List signatureBytes = Uint8List.fromList(hexStringToByteArray(signatureHex));
    final isVerifiedResult = await Secp256k1Ecdsa.verify(publicKeyBytes, messageBytes, signatureBytes);
    setState(() {
      isVerified = isVerifiedResult;
    });
  }

  List<int> hexStringToByteArray(String s) {
    int len = s.length;
    List<int> data = List<int>(len / 2);
    for (int i = 0; i < len; i += 2) {
      data[i / 2] = int.parse(s.substring(i, i + 2), 16);
    }
    return data;
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        Text('Private Key: $privateKeyHex'),
        Text('Public Key: $publicKeyHex'),
        Text('Message: $message'),
        ElevatedButton(
          onPressed: signMessage,
          child: Text('Sign Message'),
        ),
        Text('Signature: $signatureHex'),
        ElevatedButton(
          onPressed: verifySignature,
          child: Text('Verify Signature'),
        ),
        Text('Is Signature Verified? $isVerified'),
      ],
    );
  }
}

注意事项

  1. 插件版本:请确保在pubspec.yaml文件中使用最新的secp256k1_ecdsa插件版本。
  2. Hex编码:代码中包含了一个简单的hexStringToByteArray函数,用于将十六进制字符串转换为字节数组,因为插件通常处理的是字节数组而不是十六进制字符串。
  3. 异步操作:生成密钥对、签名和验证签名都是异步操作,因此使用asyncawait关键字。

这个示例展示了如何在Flutter中使用secp256k1_ecdsa插件生成密钥对、创建签名并验证签名。你可以根据需要进行扩展和修改。

回到顶部