Flutter数据加密插件prefix_encrypt的使用

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

Flutter数据加密插件prefix_encrypt的使用

简介

prefix_encrypt 是一个 Dart 包,允许使用 AEAD XChaCha20 Poly1305 和 XChaCha20 对文本进行加密,并在加密文本中添加前缀以处理 ASCII 表中超过255的符号。这确保这些符号在解密时能被正确处理。

示例:

import 'package:flutter/cupertino.dart';
import 'package:prefix_encrypt/prefix_encrypt.dart';

void main() async {
  // 所有值必须为十六进制

  String key = "0000000000000000000000000000000000000000000000000000000000000000"; // 必须为64个字符
  String nonce = "000000000000000000000000000000000000000000000000"; // 必须为48个字符
  String plaintext = "Hello World!😄";
  String encrypt = await XChaCha20withPrefix.encrypt(key: key, nonce: nonce, plaintext: plaintext);

  debugPrint(encrypt);
  // 输出 "49aaacbbdd0ebb45e2a996a9d95b3f1f806acd5a60886ea9"
  // 解密后的文本: "Hello World!😄"
  // 解密后的文本带前缀: 14:28.6:;Hello World!😄
}

由于解密总是在两个对一组进行处理,因此具有超过两个十六进制位的符号也会被分成两组。例如,💚(01F49A)会变成 01 F4 9A。为了避免这种情况,会在文本的开头添加前缀,以指示符号的位置及其长度。例如:“28.6:”。第一个数字表示位数,第二个数字表示符号在十六进制中的长度。如果没有更多符号或没有符号,则前缀以分号结束。

AEAD XChaCha20 Poly1305 和 XChaCha 的算法来自以下资源:

完整示例代码

import 'package:flutter/cupertino.dart';
import 'package:prefix_encrypt/prefix_encrypt.dart';

void main() {
  // 所有值必须为十六进制

  String aad = "000000000000000000000000"; // 必须至少为1个字符
  String key = 
      "0000000000000000000000000000000000000000000000000000000000000000"; // 密钥必须为64个字符
  String iv = "0000000000000000"; // 必须至少为16个字符
  String constant = "00000000"; // 必须为8个字符
  String hNonce = 
      "000000000000000000000000000000000000000000000000"; // 必须为48个字符
  String plaintextPrefix = "Hello World!😄";
  String plaintextWithoutPrefix = "Hello World!";

  Future<void> aeadXchacha20poly1305prefix() async {
    List encrypt = await AEADxChaCha20poly1305withPrefix.encrypt(
        aad: aad,
        iv: iv,
        key: key,
        constant: constant,
        hNonce: hNonce,
        plaintext: plaintextPrefix);
    String decrypt = await AEADxChaCha20poly1305withPrefix.decrypt(
        aad: aad,
        iv: iv,
        key: key,
        constant: constant,
        hNonce: hNonce,
        ciphertext: encrypt[0],
        savedTag: encrypt[1]);

    debugPrint("$encrypt\n$decrypt");
  }

  Future<void> xChaChaPrefix() async {
    String encrypt = await XChaCha20withPrefix.encrypt(
        key: key, nonce: hNonce, plaintext: plaintextPrefix);
    String decrypt = await XChaCha20withPrefix.decrypt(
        key: key, nonce: hNonce, ciphertext: encrypt);

    debugPrint("$encrypt\n$decrypt");
  }

  Future<void> aeadXchacha20poly1305() async {
    List encrypt = await AEADxChaCha20poly1305.encrypt(
        aad: aad,
        iv: iv,
        key: key,
        constant: constant,
        hNonce: hNonce,
        plaintext: plaintextWithoutPrefix);
    String decrypt = await AEADxChaCha20poly1305.decrypt(
        aad: aad,
        iv: iv,
        key: key,
        constant: constant,
        hNonce: hNonce,
        ciphertext: encrypt[0],
        savedTag: encrypt[1]);

    debugPrint("$encrypt\n$decrypt");
  }

  Future<void> xChaCha20() async {
    String encrypt = await XChaCha20.encrypt(
        key: key, nonce: hNonce, plaintext: plaintextWithoutPrefix);
    String decrypt = 
        await XChaCha20.decrypt(key: key, nonce: hNonce, ciphertext: encrypt);

    debugPrint("$encrypt\n$decrypt");
  }

  aeadXchacha20poly1305prefix();
  xChaChaPrefix();
  aeadXchacha20poly1305();
  xChaCha20();
}

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

1 回复

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


当然,以下是一个关于如何在Flutter项目中使用prefix_encrypt插件进行数据加密的示例代码。prefix_encrypt是一个用于在Flutter应用中进行数据加密的插件,它允许你使用前缀加密技术来保护你的敏感数据。

首先,你需要在你的pubspec.yaml文件中添加prefix_encrypt依赖:

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

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

接下来,是一个简单的示例代码,展示了如何使用prefix_encrypt插件来加密和解密数据:

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

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

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

class _MyAppState extends State<MyApp> {
  final _controller = TextEditingController();
  final _key = 'your-encryption-key';  // 请使用你自己的加密密钥
  String _encryptedData = '';
  String _decryptedData = '';

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Prefix Encrypt Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            children: <Widget>[
              TextField(
                controller: _controller,
                decoration: InputDecoration(labelText: 'Enter data to encrypt'),
                maxLines: 4,
              ),
              SizedBox(height: 16),
              ElevatedButton(
                onPressed: () {
                  setState(() {
                    // 加密数据
                    final encryptor = PrefixEncrypt(_key);
                    _encryptedData = encryptor.encrypt(_controller.text);

                    // 解密数据
                    _decryptedData = encryptor.decrypt(_encryptedData);
                  });
                },
                child: Text('Encrypt/Decrypt'),
              ),
              SizedBox(height: 16),
              Text('Encrypted Data: $_encryptedData'),
              SizedBox(height: 8),
              Text('Decrypted Data: $_decryptedData'),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _controller.dispose();
    super.dispose();
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,用户可以在文本框中输入要加密的数据。点击“Encrypt/Decrypt”按钮后,应用会使用PrefixEncrypt类对数据进行加密和解密,并显示加密和解密后的数据。

请注意,PrefixEncrypt类的构造函数接受一个密钥参数,这个密钥用于加密和解密过程。在实际应用中,你应该妥善保管这个密钥,避免泄露。

此外,prefix_encrypt插件的具体实现和API可能会有所不同,具体请参考该插件的官方文档和源代码,以确保代码的正确性和安全性。如果你遇到任何问题,也可以查阅相关文档或在GitHub等平台上寻求帮助。

回到顶部