Flutter Ed25519算法支持插件ed25519_edwards的使用

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

Flutter Ed25519算法支持插件ed25519_edwards的使用

Ed25519是一种高效的数字签名算法,基于椭圆曲线密码学。ed25519_edwards是Dart的一个实现,它移植自Golang的ed25519

你可以通过以下链接访问其在pub.dev上的包:Pub package

使用方法

下面是一个简单的示例,展示了如何生成密钥对、签名和验证消息:

import 'dart:convert';
import 'dart:typed_data';

import 'package:ed25519_edwards/ed25519_edwards.dart' as ed;

void main() {
  signAndVerify();
}

void signAndVerify() {
  // 生成密钥对
  var keyPair = ed.generateKey();
  var privateKey = keyPair.privateKey;
  var publicKey = keyPair.publicKey;

  // 准备要签名的消息
  var message = utf8.encode('test message') as Uint8List;
  
  // 使用私钥签名
  var sig = ed.sign(privateKey, message);
  
  // 验证签名
  var result = ed.verify(publicKey, message, sig);
  assert(result == true);

  // 尝试用错误的消息来验证签名
  var wrongMessage = utf8.encode('wrong message') as Uint8List;
  var wrongResult = ed.verify(publicKey, wrongMessage, sig);
  assert(wrongResult == false);
}

主要API

Ed25519 API

  • generateKey() - 生成新的密钥对。
  • sign(privateKey, message) - 使用私钥对消息进行签名。
  • verify(publicKey, message, signature) - 验证给定公钥下的消息签名是否有效。

Edwards25519 API

这个库还提供了一些底层操作,如有限域运算(Fe*)和群元素操作(Ge*)等,但通常情况下,你只需要使用上述提到的高级API即可。

性能基准测试

该库提供了不同环境下的性能测试结果,包括JIT模式下的Dart VM、AOT编译后的原生二进制文件以及JS环境下(通过dart2js)。具体的测试数据可以参考提供的链接或直接查看项目的README文件。

例如,在MacBook Pro (16-inch, 2019),macOS Big Sur,配备2.4GHz i9 32GB内存的情况下,Dart VM JIT模式下签名速度为约50.54 MB/s,而验证速度则达到了约97.38 MB/s。

这表明ed25519_edwards不仅易于使用,而且具有良好的性能表现,适用于需要高效加密操作的应用场景中。


更多关于Flutter Ed25519算法支持插件ed25519_edwards的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Ed25519算法支持插件ed25519_edwards的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,关于在Flutter中使用ed25519_edwards插件来实现Ed25519算法支持,以下是一个简单的代码案例来展示如何使用该插件进行密钥对生成和签名验证。

首先,确保你的Flutter项目中已经添加了ed25519_edwards依赖。在你的pubspec.yaml文件中添加以下依赖:

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

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

以下是一个完整的Flutter应用示例,展示了如何使用ed25519_edwards插件:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  late Uint8List privateKey;
  late Uint8List publicKey;
  late Uint8List message;
  late Uint8List signature;
  bool isVerified = false;

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

  void generateKeyPair() async {
    KeyPair keyPair = await Ed25519.generateKeyPair();
    setState(() {
      privateKey = keyPair.privateKey;
      publicKey = keyPair.publicKey;
      message = Uint8List.fromList(utf8.encode('Hello, Ed25519!'));
      signature = Ed25519.sign(message, privateKey);
      isVerified = Ed25519.verify(message, signature, publicKey);
    });
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Ed25519 Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Private Key: ${base64Encode(privateKey)}'),
              Text('Public Key: ${base64Encode(publicKey)}'),
              Text('Message: ${utf8.decode(message)}'),
              Text('Signature: ${base64Encode(signature)}'),
              Text('Signature Verified: $isVerified'),
            ],
          ),
        ),
        floatingActionButton: FloatingActionButton(
          onPressed: generateKeyPair,
          tooltip: 'Generate Key Pair',
          child: Icon(Icons.refresh),
        ),
      ),
    );
  }
}

解释

  1. 依赖导入:首先,确保ed25519_edwards插件已经被添加到你的项目中。

  2. 状态管理:在_MyAppState类中,定义了用于存储私钥、公钥、消息、签名和验证结果的变量。

  3. 生成密钥对generateKeyPair方法使用Ed25519.generateKeyPair()异步生成一个新的密钥对,并更新UI状态。

  4. 签名和验证:使用生成的私钥对消息进行签名,并使用公钥验证签名的有效性。

  5. UI展示:在UI中展示了私钥、公钥、消息、签名以及签名验证结果。

  6. 刷新按钮:提供了一个FloatingActionButton来重新生成密钥对、签名和验证,以便你可以看到结果的变化。

请注意,这个示例仅用于演示目的,实际应用中应谨慎处理私钥和公钥的管理,避免泄露敏感信息。同时,ed25519_edwards插件的具体API可能会根据版本有所变化,请参考官方文档获取最新信息。

回到顶部