Flutter如何使用pointycastle实现SM4加密

我在Flutter项目中需要使用SM4加密算法,查资料发现pointycastle库支持SM4。请问具体应该如何实现?能否提供完整的代码示例,包括密钥生成、加密和解密的步骤?另外,在Flutter中集成pointycastle需要注意哪些问题?

2 回复

使用Pointycastle实现SM4加密:

  1. 添加依赖:pointycastle: ^3.6.2
  2. 导入库:import 'package:pointycastle/export.dart';
  3. 创建SM4引擎:final engine = SM4Engine();
  4. 设置密钥:engine.init(true, KeyParameter(key));
  5. 加密数据: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)}');
}

注意事项:

  1. SM4密钥必须为16字节(128位)
  2. 需要手动处理数据填充(示例使用PKCS7)
  3. 确保输入数据是Uint8List格式
  4. 如需其他模式(如CBC/ECB),需配合BlockCipherMode使用

此实现提供了基本的SM4加密解密功能,可根据实际需求添加错误处理和其他加密模式支持。

回到顶部