Flutter如何使用pointycastle实现SM4加密
我在Flutter项目中需要使用SM4加密算法,查资料发现pointycastle库支持SM4。请问具体应该如何实现?能否提供完整的代码示例,包括密钥生成、加密和解密的步骤?另外,在Flutter中集成pointycastle需要注意哪些问题?
2 回复
使用Pointycastle实现SM4加密:
- 添加依赖:
pointycastle: ^3.6.2 - 导入库:
import 'package:pointycastle/export.dart'; - 创建SM4引擎:
final engine = SM4Engine(); - 设置密钥:
engine.init(true, KeyParameter(key)); - 加密数据:
engine.processBlock(input, 0, output, 0);
注意密钥需为16字节,输入输出使用Uint8List。
更多关于Flutter如何使用pointycastle实现SM4加密的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
在Flutter中使用PointyCastle库实现SM4加密,需要以下步骤:
1. 添加依赖
在 pubspec.yaml 中添加:
dependencies:
pointycastle: ^3.6.2
2. 实现SM4加密
import 'dart:typed_data';
import 'package:pointycastle/export.dart';
Uint8List sm4Encrypt(Uint8List plaintext, Uint8List key) {
// 创建SM4引擎
final cipher = BlockCipher('SM4');
cipher.init(true, KeyParameter(key)); // true表示加密模式
// 处理数据(SM4分组长度为16字节)
final paddedText = _padData(plaintext, 16);
final cipherText = Uint8List(paddedText.length);
for (var i = 0; i < paddedText.length; i += 16) {
cipher.processBlock(paddedText, i, cipherText, i);
}
return cipherText;
}
Uint8List sm4Decrypt(Uint8List ciphertext, Uint8List key) {
final cipher = BlockCipher('SM4');
cipher.init(false, KeyParameter(key)); // false表示解密模式
final plainText = Uint8List(ciphertext.length);
for (var i = 0; i < ciphertext.length; i += 16) {
cipher.processBlock(ciphertext, i, plainText, i);
}
return _unpadData(plainText);
}
// PKCS7填充
Uint8List _padData(Uint8List data, int blockSize) {
final padLength = blockSize - (data.length % blockSize);
final padded = Uint8List(data.length + padLength);
padded.setRange(0, data.length, data);
padded.fillRange(data.length, padded.length, padLength);
return padded;
}
// PKCS7去填充
Uint8List _unpadData(Uint8List data) {
final padLength = data[data.length - 1];
return data.sublist(0, data.length - padLength);
}
3. 使用示例
void main() {
final plaintext = Uint8List.fromList('Hello SM4!'.codeUnits);
final key = Uint8List.fromList(List.generate(16, (i) => i)); // 16字节密钥
final encrypted = sm4Encrypt(plaintext, key);
final decrypted = sm4Decrypt(encrypted, key);
print('原文: ${String.fromCharCodes(plaintext)}');
print('密文: $encrypted');
print('解密: ${String.fromCharCodes(decrypted)}');
}
注意事项:
- SM4密钥必须为16字节(128位)
- 需要手动处理数据填充(示例使用PKCS7)
- 确保输入数据是Uint8List格式
- 如需其他模式(如CBC/ECB),需配合BlockCipherMode使用
此实现提供了基本的SM4加密解密功能,可根据实际需求添加错误处理和其他加密模式支持。

