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
更多关于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');
}
}
}

