Flutter如何实现AES-256-GCM加密

在Flutter中如何正确实现AES-256-GCM加密?我尝试使用pointycastle库进行加密,但生成的密文和IV在解密时总是失败。能否提供一个完整的示例代码,包括密钥生成、加密和解密的过程?特别需要注意GCM模式下的authTag处理和IV的生成方式。另外,这种加密方式在iOS和Android平台上是否会有兼容性问题?

2 回复

在Flutter中实现AES-256-GCM加密,可以使用pointycastle包。以下是核心步骤:

  1. 添加依赖
dependencies:
  pointycastle: ^3.6.2
  1. 加密示例
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]);
}
  1. 解密示例
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包。以下是完整实现:

  1. 添加依赖
dependencies:
  pointycastle: ^3.6.2
  1. 加密实现
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));
}
  1. 使用示例
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。

回到顶部