Flutter加密解密插件dilithium_crypto的使用

Flutter加密解密插件dilithium_crypto的使用

使用

密钥对生成

Uint8List randomSeed = Uint8List(Dilithium.SEEDBYTES);

DilithiumKeyPair keyPair = Dilithium.generateKeyPair(DilithiumParameterSpec.LEVEL3, randomSeed);

DilithiumPublicKey publicKey = keyPair.publicKey;
DilithiumPrivateKey privateKey = keyPair.privateKey;

注意,您必须提供一个表示所需安全级别的算法参数规范。上述示例使用了级别3,但您也可以选择级别2或5。DilithiumParameterSpec 类中有三个静态字段代表不同的安全级别。另外,DilithiumParameterSpec 类还提供了一个静态方法 getSpecForSecurityLevel(),可以在运行时轻松获取指定级别的参数规范。

签名

Uint8List message = utf8.encode("Valid Message");

Uint8List signature = Dilithium.sign(privateKey, message);

在生成密钥对后,使用私钥对消息进行签名。消息需要编码为 Uint8List

签名验证

bool isValid = Dilithium.verify(publicKey, signature, message);

isValid 变量指示消息和签名是否可以验证且未被修改。如果签名无效,可能会抛出 InvalidSignature 异常。

密钥序列化/反序列化

Uint8List encodedPublicKey = publicKey.serialize();
Uint8List encodedPrivateKey = privateKey.serialize();

final recreatedPublicKey = DilithiumPublicKey.deserialize(DilithiumParameterSpec.LEVEL3, encodedPublicKey);
final recreatedPrivateKey = DilithiumPrivateKey.deserialize(DilithiumParameterSpec.LEVEL3, encodedPrivateKey);

您可以使用公钥和私钥的 .serialize() 方法获得字节表示形式(在 Dart 中表示为 Uint8List)。要从字节表示形式重新实例化密钥,可以使用 .deserialize(spec, bytes) 工厂方法。请注意,生成密钥时使用的参数规范需要提供,并且不会编码在字节表示形式中,也不应该根据字节数推断出来。

消息编码为 Uint8List

字符串消息

String stringMsg = 'Hello World!';
Uint8List byteMsg = utf8.encode(stringMsg); // [72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33]

整数消息

int intMsg = 1234567890;

ByteData byteData = ByteData(8); // 8 bytes for int (int64)
byteData.setInt64(0, intMsg);

Uint8List byteMsg = byteData.buffer.asUint8List(); // [0, 0, 0, 0, 73, 150, 2, 210]

浮点数消息

double doubleMsg = 3.141592653589793;

ByteData byteData = ByteData(8); // 8 bytes for double
byteData.setFloat64(0, doubleMsg);

Uint8List byteMsg = byteData.buffer.asUint8List(); // [64, 9, 33, 251, 84, 68, 45, 24]

该包设置为签署和验证编码为 Uint8List 的消息(意味着实际上是指字节流)。Dart 提供了许多选项将不同类型的对象转换为 Uint8List

签名与哈希范式

为了使任意长度的消息的签名和验证更加高效,可以使用 “Hash-and-Sign-Paradigm”。此方法涉及将消息转换为哈希值,然后对哈希值而不是整个消息进行签名和验证。具体步骤如下:

发送方

  1. 对消息进行哈希:首先,需要签名的消息或文件通过一个密码学哈希函数处理。该函数从原始消息生成一个唯一的固定长度哈希值(或数字指纹)。无论原始消息的大小如何,哈希值始终具有相同的长度,使其易于处理。
  2. 对哈希值进行签名:生成的哈希值用于签名过程。使用 Dilithium 签名哈希值而不是原始消息:Dilithium.sign(privateKey, hash_value)。签名后的数字签名连同原始消息一起发送给接收方。

接收方

  1. 对收到的消息进行哈希:接收消息后,接收方应用相同的密码学哈希函数到收到的消息上。这一步会产生收到消息的哈希值。如果通信没有被篡改,这个哈希值将与发送方签名的哈希值匹配。
  2. 验证哈希:为了验证消息,接收方使用 Dilithium 来检查签名的有效性:Dilithium.verify(publicKey, hash_value)。使用发送方的公钥和新计算的哈希值来进行此验证过程。如果签名对于哈希值有效,则确认消息未被更改。任何对消息的修改都会产生不同的哈希值,这将不匹配原始签名,从而表明存在篡改。

这种方法确保了任意长度消息的完整性和真实性,同时优化了签名和验证过程的效率。

示例:使用 SHA-256 的签名与哈希

String msg = "This is a long test message, longer than 32 bytes.";

// 发送方:
Uint8List originalMsg = utf8.encode(msg);
Uint8List hashValue = Uint8List.fromList(sha256.convert(originalMsg).bytes);

final signature = Dilithium.sign(keyPair.privateKey, hashValue);

// 接收方
String receivedMsg = msg;
Uint8List receivedMsgBytes = utf8.encode(receivedMsg);
Uint8List generatedHashValue = Uint8List.fromList(sha256.convert(receivedMsgBytes).bytes);

bool isValid = Dilithium.verify(keyPair.publicKey, signature, generatedHashValue);
expect(isValid, isTrue); // --> 收到的消息未被修改

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

1 回复

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


dilithium_crypto 是一个用于在 Flutter 应用中实现加密和解密功能的插件,基于 Dilithium 后量子加密算法。Dilithium 是一种基于格密码学的签名方案,旨在抵御未来量子计算机的攻击。

以下是 dilithium_crypto 插件的基本使用步骤:

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  dilithium_crypto: ^0.1.0  # 请使用最新版本

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

2. 导入插件

在你的 Dart 文件中导入 dilithium_crypto 插件:

import 'package:dilithium_crypto/dilithium_crypto.dart';

3. 生成密钥对

使用 DilithiumCrypto 类生成密钥对:

void generateKeyPair() async {
  var keyPair = await DilithiumCrypto.generateKeyPair();
  print('Public Key: ${keyPair.publicKey}');
  print('Private Key: ${keyPair.privateKey}');
}

4. 签名数据

使用生成的私钥对数据进行签名:

void signData(String privateKey, String data) async {
  var signature = await DilithiumCrypto.sign(privateKey, data);
  print('Signature: $signature');
}

5. 验证签名

使用公钥验证签名的有效性:

void verifySignature(String publicKey, String data, String signature) async {
  var isValid = await DilithiumCrypto.verify(publicKey, data, signature);
  print('Signature is valid: $isValid');
}

6. 示例代码

以下是一个完整的示例,展示了如何生成密钥对、签名数据并验证签名:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomeScreen(),
    );
  }
}

class HomeScreen extends StatelessWidget {
  void generateKeyPair() async {
    var keyPair = await DilithiumCrypto.generateKeyPair();
    print('Public Key: ${keyPair.publicKey}');
    print('Private Key: ${keyPair.privateKey}');

    String data = 'Hello, Dilithium!';
    var signature = await DilithiumCrypto.sign(keyPair.privateKey, data);
    print('Signature: $signature');

    var isValid = await DilithiumCrypto.verify(keyPair.publicKey, data, signature);
    print('Signature is valid: $isValid');
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Dilithium Crypto Example'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: generateKeyPair,
          child: Text('Generate Key Pair and Sign Data'),
        ),
      ),
    );
  }
}
回到顶部