Flutter如何实现AES-256-GCM加密
在Flutter中如何正确实现AES-256-GCM加密?我尝试使用pointycastle库进行加密,但生成的密文和IV在解密时总是失败。能否提供一个完整的示例代码,包括密钥生成、加密和解密的过程?特别需要注意GCM模式下的authTag处理和IV的生成方式。另外,这种加密方式在iOS和Android平台上是否会有兼容性问题?
2 回复
在Flutter中实现AES-256-GCM加密,可以使用pointycastle包。以下是核心步骤:
- 添加依赖:
dependencies:
pointycastle: ^3.6.2
- 加密示例:
import 'package:pointycastle/export.dart';
Uint8List aesGcmEncrypt(
Uint8List plaintext,
Uint8List key,
Uint8List nonce,
Uint8List aad,
) {
final cipher = GCMBlockCipher(AESEngine())
..init(true, AEADParameters(KeyParameter(key), 128, nonce, aad));
final cipherText = cipher.process(plaintext);
final mac = cipher.mac;
return Uint8List.fromList([...cipherText, ...mac]);
}
- 解密示例:
Uint8List aesGcmDecrypt(
Uint8List encrypted,
Uint8List key,
Uint8List nonce,
Uint8List aad,
) {
final cipher = GCMBlockCipher(AESEngine())
..init(false, AEADParameters(KeyParameter(key), 128, nonce, aad));
return cipher.process(encrypted);
}
注意事项:
- 密钥长度必须为32字节(256位)
- Nonce推荐12字节
- 每次加密必须使用不同的nonce
- 解密时需要验证MAC标签
记得处理异常,确保加解密参数正确!
更多关于Flutter如何实现AES-256-GCM加密的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中实现AES-256-GCM加密,可以使用pointycastle包。以下是完整实现:
- 添加依赖
dependencies:
pointycastle: ^3.6.2
- 加密实现
import 'dart:convert';
import 'dart:typed_data';
import 'package:pointycastle/export.dart';
// AES-256-GCM加密
Map<String, String> aes256GcmEncrypt(
Uint8List plaintext, Uint8List key, Uint8List nonce) {
final cipher = GCMBlockCipher(AESEngine());
final params = AEADParameters(
KeyParameter(key),
128, // MAC长度
nonce,
Uint8List(0), // 可选附加数据
);
cipher.init(true, params);
final cipherText = cipher.process(plaintext);
return {
'ciphertext': base64.encode(cipherText),
'nonce': base64.encode(nonce),
};
}
// AES-256-GCM解密
Uint8List aes256GcmDecrypt(
String encrypted, String nonceStr, Uint8List key) {
final cipher = GCMBlockCipher(AESEngine());
final params = AEADParameters(
KeyParameter(key),
128,
base64.decode(nonceStr),
Uint8List(0),
);
cipher.init(false, params);
return cipher.process(base64.decode(encrypted));
}
- 使用示例
void main() {
final key = Uint8List.fromList(List.generate(32, (i) => i)); // 32字节=256位
final nonce = Uint8List.fromList(List.generate(12, (i) => i)); // 12字节nonce
final plaintext = utf8.encode('Hello AES-256-GCM!');
// 加密
final encrypted = aes256GcmEncrypt(plaintext, key, nonce);
print('加密结果: ${encrypted['ciphertext']}');
// 解密
final decrypted = aes256GcmDecrypt(encrypted['ciphertext']!, encrypted['nonce']!, key);
print('解密结果: ${utf8.decode(decrypted)}');
}
关键点说明:
- 密钥长度:32字节(256位)
- Nonce长度:12字节(推荐)
- 自动处理认证标签(GCM特性)
- 返回base64编码便于传输
注意:实际使用时请使用安全的随机数生成器生成密钥和nonce。

