轉(zhuǎn)自:
Dart AES CBC PKCS5Padding
作者:aYan124
鏈接:http://www.reibang.com/p/688cfe3f07b0
由于Android項目使用的加密方式參數(shù)為 AES/CBC/PKCS5Padding苏研,所以在pub.com上一直沒有找到相匹配的插件舷嗡,今天看到一篇文章說缎谷,其實Java的PKCS5Padding就是PKCS7Padding慨菱,所以就抱著試一試的心態(tài)(坑啊月弛。弦叶。)用了一下encrypt插件加密,果然跟Java的加密結(jié)果一致威沫,特此記錄一下贤惯。
import 'package:encrypt/encrypt.dart' as encrypt;
final plainText = 'asddf';//加密文案
final key = encrypt.Key.fromUtf8('dsafsdafas');//加密key
final iv = encrypt.IV.fromUtf8('fsdafasdf');//偏移量
//設(shè)置cbc模式
final encrypter = encrypt.Encrypter(encrypt.AES(key,mode: encrypt.AESMode.cbc));
final encrypted = encrypter.encrypt(plainText, iv: iv);
final decrypted = encrypter.decrypt(encrypted, iv: iv);
print(decrypted);
print(encrypted.base64);
<meta charset="utf-8">
因Key文件名沖突,所以設(shè)置別名encrypt
參考文章:
http://zhuqiaochu.truestudio.tech/dart-java-swift-aes-cbc-pkcs7padding/
插件地址:
https://pub.dev/packages/encrypt#-readme-tab-
但是 對于沒有初始向量(IV)的情況, 比如, 我的原始java代碼加密,是如下的:
private static final String ALGORITHMSTR_STRING = "AES/ECB/PKCS5Padding";
private static byte[] aesToBytes(String content, String encryptKey) throws Exception {
KeyGenerator aes = KeyGenerator.getInstance("AES");
aes.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR_STRING);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
return cipher.doFinal(content.getBytes(StandardCharsets.UTF_8));
}
那么,用dart 實現(xiàn)的時候, 只需要給初始向量 長度為0即可.
String aesEncode(String content, String aesKey) {
//加密key
final key = Encrypt.Key.fromUtf8(aesKey);
//偏移量 - 注意這里
final iv = Encrypt.IV.fromSecureRandom(0);
//設(shè)置cbc模式
final encrypter = Encrypt.Encrypter(
Encrypt.AES(key, mode: Encrypt.AESMode.ecb, padding: 'PKCS7'));
//加密
final encrypted = encrypter.encrypt(content, iv: iv);
return encrypted.base64;
}
此外, 還需要注意和解密一方,約定好加解密的模式是 cbc
還是ecb
好了, 以上就是flutter中進行AES加密的一些內(nèi)容.