乐趣区

Flutter使用Cipher2插件实现AES加解密

Flutter 是当下最流行的新兴 APP 跨平台开发架构。学习需趁早。
因为我的项目需要使用 AES 加解密,而 flutter package 中并没有支持 Dart 2 的 AES 加密库,所以写了 Cipher2 插件并拿出来开源给大家用。本文介绍如何使用 Cipher2 插件在 Flutter app 中实现 AES 加密解密。本文不讲述如何安装配置 Flutter 开发环境。如有需要我会写关于安装配置 flutter 开环环境的文章。
Cipher2 插件地址:

https://pub.dartlang.org/pack…
https://github.com/shyandsy/c…

各位如果有其他加密算法需求,请在 github 发 issue,我会尽快跟进。PR is welcome!
创建项目
打开 cmd 命令行,cd 命令定位到你想要创建项目的目录。然后创建 flutter app 项目
flutter create cipher2_test

用 vscode 打开项目目录

安装 Cipher2 插件
打开上图中 pubspec.yaml 文件的 dependencies 中,添加如下内容。然后 ctrl + s 保存,vscode 会自动为你安装好插件。
dependencies:
flutter:
sdk: flutter
cipher2: any

Cipher2 的 API 解释
Cipher2 插件目前支持 AES 加密的 cbc(128 位 padding7)模式和 gcm 模式(128 位)。插件提供了 5 个方法来实现加密解密。本插件所有字符串均使用 UTF8 编码。在处理第三方密文的时候,请注意字符串编码,以免不必要的麻烦。
AES cbc 128 位 padding7 加密
/*
Cipher2.encryptAesCbc128Padding7
参数:
plainText: 被加密字符串
key:128 bit 字符串
iv: 128 bit 字符串
返回:
经过 base64 编码的密文字符串
*/
String encryptedString = await Cipher2.encryptAesCbc128Padding7(plainText, key, iv);
AES cbc 128 位 padding7 解密
/*
Cipher2.decryptAesCbc128Padding7
参数:
encryptedString: base64 编码的密文字符串
key:128 bit 字符串
iv: 128 bit 字符串
返回:
明文字符串
*/
String decryptedString = await Cipher2.decryptAesCbc128Padding7(encryptedString, key, iv);
生成 GCM 模式的 nonce
String nonce = Cipher2.generateNonce()
AES gcm 128 位加密
/*
Cipher2.encryptAesGcm128
参数:
plainText: 被加密字符串
key:128 bit 字符串
nonce: based4 编码的 92bit nonce,可以用 Cipher2.generateNonce() 生成
返回:
经过 base64 编码的密文字符串
*/
String encryptedString = await Cipher2.encryptAesGcm128(plaintext, key, nonce);
AES gcm 128 位解密
/*
Cipher2.decryptAesGcm128
参数:
encryptedString: base64 编码的密文字符串
key:128 bit 字符串
nonce: based4 编码的 92bit nonce,可以用 Cipher2.generateNonce() 生成
返回:
明文字符串
*/
result = await Cipher2.decryptAesGcm128(encryptedString, key, nonce);
使用 Cipher2 插件
官方提供了非常简单明了的测试用例,方便加密解密和异常捕获
https://github.com/shyandsy/c…
// Platform messages are asynchronous, so we initialize in an async method.
Future<void> initPlatformState() async {
String encryptedString;
String plainText = ‘ 我是 shyandsy,never give up man’;
String key = ‘xxxxxxxxxxxxxxxx’;
String iv = ‘yyyyyyyyyyyyyyyy’;
String decryptedString;

// 测试 AES 128bit cbc padding 7 加密
await testEncryptAesCbc128Padding7();

// 测试 AES 128bit cbc padding 7 解密
await testDecryptAesCbc128Padding7();

// 测试 AES 128bit gcm 加解密
await testEncryptAesGcm128(); // GenerateNonce();

// 加密,然后解密
try {
// 加密
encryptedString = await Cipher2.encryptAesCbc128Padding7(plainText, key, iv);

// 解密
decryptedString = await Cipher2.decryptAesCbc128Padding7(encryptedString, key, iv);

} on PlatformException catch(e) {

encryptedString = “”;
decryptedString = “”;
print(“exception code: ” + e.code);
print(“exception message: ” + e.message);

}

// If the widget was removed from the tree while the asynchronous platform
// message was in flight, we want to discard the reply rather than calling
// setState to update our non-existent appearance.
if (!mounted) return;

setState(() {
_plainText = plainText;
_encryptedString = encryptedString;
_decryptedString = decryptedString;
});
}
读一遍 test case 就会用了。这里不再重复

退出移动版