Flutter数据加密插件aes_crypt的使用

Flutter数据加密插件aes_crypt的使用

简介

aes_crypt 是一个为 Dart 和 Flutter 开发者设计的库,它使用 256 位 AES 算法来加密/解密文件、纯文本和二进制数据。它完全兼容 AES Crypt 文件格式。可以用于将 AES Crypt 功能集成到您的 Dart 或 Flutter 应用程序中。所有算法都是用纯 Dart 实现,并且可以在所有平台上运行。

aes_crypt 编写和读取 AES Crypt 文件规范的版本 2(最新版)。虽然实现了对版本 1 的向后兼容性,但尚未经过测试。生成的 .aes 文件与任何使用 AES Crypt 标准文件格式的软件完全兼容。该库还附带了适用于不同操作系统的客户端和库。 如需了解有关 AES Crypt 及其在其他平台上的兼容应用程序的更多信息,请访问 AESCrypt 官方网站

特性

  • 256 位 AES 加密格式。
  • 文件到文件的加密和解密。
  • 内存到文件的加密,文件到内存的解密。
  • 密码可以是 Unicode(例如 “密码 パスワード пароль كلمة السر”)。
  • 支持异步文件系统读写。
  • 加密文件具有 .aes 扩展名,其他操作系统上的客户端可以识别。
  • 兼容的软件可用于 Windows、Linux、Mac OS、Android 和 iOS (https://www.aescrypt.com/download/)。

使用方法

在项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  ...
  aes_crypt: ^0.1.1

在 Dart 代码中添加以下导入:

import 'dart:typed_data';
import 'package:aes_crypt/aes_crypt.dart';

初始化

var crypt = AesCrypt('my cool password');

或者

var crypt = AesCrypt();
crypt.setPassword('my cool password');

您可以选择设置文件写入操作的覆盖模式:

// 如果文件存在,则覆盖文件。
crypt.setOverwriteMode(AesCryptOwMode.on);

// 如果文件存在,则停止操作并抛出带有 'AesCryptExceptionType.destFileExists' 类型的 'AesCryptException' 异常(请参阅示例文件 example1.dart)。
// 默认情况下设置此模式。
crypt.setOverwriteMode(AesCryptOwMode.warn);

// 如果文件存在,则为其名称添加 '(1)' 并尝试保存。如果这样的文件也存在,则添加 '(2)',然后 '(3)' 等等。
crypt.setOverwriteMode(AesCryptOwMode.rename);

注意: 所有以 Sync 结尾的函数是同步的。如果您需要异步版本,请只需从函数名称末尾删除 Sync

文件加密/解密

// 加密 srcfile.txt 文件并在原始名称后附加 .aes 扩展名(srcfile.txt.aes)。您可以指定相对路径或直接路径。要保存到当前目录,请指定路径为 './srcfile.txt' 或 'srcfile.txt'。
crypt.encryptFileSync('srcfile.txt');

// 加密 srcfile.txt 文件并将其保存为 enc_file.txt.aes。
crypt.encryptFileSync('srcfile.txt', 'enc_file.txt.aes');

// 解密 srcfile.txt.aes 文件并保存为 srcfile.txt。
crypt.decryptFileSync('srcfile.txt.aes');

// 解密 srcfile.txt.aes 文件并保存为 dec_file.txt。
crypt.decryptFileSync('srcfile.txt.aes', 'dec_file.txt');

文本 <=> 文件加密/解密

String decryptedText;

// 要加密的纯文本
String srcText = 'some text';

// 将文本加密为 UTF8 字符串并保存到 mytext.txt.aes 文件中。
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes');
// 将文本加密为 UTF16 大端字节序字符串并保存到 mytext.txt.aes 文件中。
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true);
// 将文本加密为 UTF16 小端字节序字符串并保存到 mytext.txt.aes 文件中。
crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', utf16: true, endian: Endian.little);
// 如果您希望在加密前在文本字符串开头添加字节顺序标记,请添加 'bom: true' 参数。例如:
// crypt.encryptTextToFileSync(srcText, 'mytext.txt.aes', bom: true);

// 解密文件并根据是否有字节顺序标记进行解释。如果没有,则将其解释为 UTF8 文本。
decryptedString = crypt.decryptTextFromFileSync('mytext.txt.aes');
// 解密文件并根据是否有字节顺序标记进行解释。如果没有,则将其解释为 UTF16 大端字节序文本。
decryptedString = crypt.decryptTextFromFileSync('mytext.txt.aes', utf16: true);
// 解密文件并根据是否有字节顺序标记进行解释。如果没有,则将其解释为 UTF16 小端字节序文本。
decryptedString = crypt.decryptTextFromFileSync('mytext.txt.aes', utf16: true, endian: Endian.little);

二进制数据 <=> 文件加密/解密

// 要加密的二进制数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5]);

// 加密数据并保存到 mydata.bin.aes 文件中。
crypt.encryptDataToFileSync(srcData, 'mydata.bin.aes');

// 从 mydata.bin.aes 文件解密数据
Uint8List decryptedData = crypt.decryptDataFromFileSync('mydata.bin.aes');

二进制数据 AES 加密/解密

// 加密密钥。长度应为 128、192 或 256 位。
Uint8List key = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);

// 初始化向量,用于高级加密模式。必须是 128 位长。
Uint8List iv = Uint8List.fromList([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]);

// AES 操作模式。可以是以下值之一:
//    AesMode.ecb - ECB(电子密码簿)
//    AesMode.cbc - CBC(密码块链)
//    AesMode.cfb - CFB(密码反馈)
//    AesMode.ofb - OFB(输出反馈)
// 默认模式为 AesMode.cbc
AesMode mode = AesMode.cbc; // 好吧,我知道在这里没意义。

// 设置加密密钥和初始化向量。
crypt.aesSetKeys(key, iv);
// 设置加密模式
crypt.aesSetMode(mode);

// 如果您愿意,可以通过一个函数设置密钥、初始化向量和加密模式。
// crypt.aesSetParams(key, iv, mode);

// 要加密的二进制数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5]);

// 使用空字节填充方案加密数据。
Uint8List encryptedData = crypt.aesEncrypt(srcData);
// 解密数据
Uint8List decryptedData = crypt.aesDecrypt(encryptedData);

SHA256 和 HMAC-SHA256 计算

// 源数据
Uint8List srcData = Uint8List.fromList([1,2,3,4,5,6,7,8,9]);

// 计算 SHA256 哈希
Uint8List hash = crypt.sha256(srcData);

// HMAC 的秘密加密密钥
Uint8List key = Uint8List.fromList([1,2,3]);

// 计算 HMAC-SHA256 代码
Uint8List hmac = crypt.hmacSha256(key, srcData);

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

1 回复

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


aes_crypt 是一个用于在 Flutter 中进行 AES 加密和解密的插件。它支持对文件和字符串进行加密和解密操作。以下是如何在 Flutter 项目中使用 aes_crypt 插件的详细步骤。

1. 添加依赖

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

dependencies:
  flutter:
    sdk: flutter
  aes_crypt: ^2.0.0

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

2. 导入包

在需要使用 aes_crypt 的 Dart 文件中导入包:

import 'package:aes_crypt/aes_crypt.dart';

3. 创建 AesCrypt 实例

创建一个 AesCrypt 实例,并设置加密密钥:

AesCrypt crypt = AesCrypt();
crypt.setPassword('my_secret_password');

4. 加密字符串

使用 encrypt 方法对字符串进行加密:

String plainText = 'Hello, World!';
String encryptedText = crypt.encrypt(plainText);
print('Encrypted Text: $encryptedText');

5. 解密字符串

使用 decrypt 方法对加密后的字符串进行解密:

String decryptedText = crypt.decrypt(encryptedText);
print('Decrypted Text: $decryptedText');

6. 加密文件

使用 encryptFile 方法对文件进行加密:

String inputFilePath = '/path/to/input/file.txt';
String outputFilePath = '/path/to/output/file.txt.aes';
crypt.encryptFile(inputFilePath, outputFilePath);

7. 解密文件

使用 decryptFile 方法对加密后的文件进行解密:

String inputFilePath = '/path/to/encrypted/file.txt.aes';
String outputFilePath = '/path/to/decrypted/file.txt';
crypt.decryptFile(inputFilePath, outputFilePath);

8. 处理异常

在进行加密和解密操作时,可能会抛出异常。建议使用 try-catch 块来捕获并处理这些异常:

try {
  String encryptedText = crypt.encrypt(plainText);
  print('Encrypted Text: $encryptedText');
} catch (e) {
  print('Encryption failed: $e');
}

try {
  String decryptedText = crypt.decrypt(encryptedText);
  print('Decrypted Text: $decryptedText');
} catch (e) {
  print('Decryption failed: $e');
}

9. 完整示例

以下是一个完整的示例,展示了如何使用 aes_crypt 插件对字符串和文件进行加密和解密:

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

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AES Crypt Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _encryptAndDecrypt();
            },
            child: Text('Encrypt & Decrypt'),
          ),
        ),
      ),
    );
  }

  void _encryptAndDecrypt() {
    AesCrypt crypt = AesCrypt();
    crypt.setPassword('my_secret_password');

    // Encrypt and decrypt a string
    String plainText = 'Hello, World!';
    try {
      String encryptedText = crypt.encrypt(plainText);
      print('Encrypted Text: $encryptedText');

      String decryptedText = crypt.decrypt(encryptedText);
      print('Decrypted Text: $decryptedText');
    } catch (e) {
      print('Error: $e');
    }

    // Encrypt and decrypt a file
    String inputFilePath = '/path/to/input/file.txt';
    String encryptedFilePath = '/path/to/output/file.txt.aes';
    String decryptedFilePath = '/path/to/decrypted/file.txt';

    try {
      crypt.encryptFile(inputFilePath, encryptedFilePath);
      print('File encrypted successfully.');

      crypt.decryptFile(encryptedFilePath, decryptedFilePath);
      print('File decrypted successfully.');
    } catch (e) {
      print('File operation failed: $e');
    }
  }
}
回到顶部