Flutter加密解密插件pointycastle的使用

发布于 1周前 作者 phonegap100 来自 Flutter

Flutter加密解密插件pointycastle的使用

简介

Pointy Castle 是一个用于加密和解密的 Dart 库。大多数类是从 Java 的 Bouncy Castle 移植到 Dart 的,移植几乎是直接的,除了添加了一些简化低级数据使用的类。

为了确保一切正常运行,每个算法都提供了测试和基准测试。预期的结果来自于 Bouncy Castle Java 版本和标准,并与 Pointy Castle 的结果进行匹配。

该库现在已被移植为非空安全默认值,这是 Dart 团队发布的一个破坏性语言特性!有关更多详情,请参见 Dart 官方文档迁移指南。请注意,既提供空安全版本(v3.x.x-nullsafety),也提供非空安全版本(v2.x.x)。但是,只有空安全版本的库是积极维护的。

算法实现

Pointycastle 实现了大量算法。这些算法必须先实例化,然后用它们的参数初始化。不同的算法有不同的参数类,代表传递给该算法的参数。要初始化一个算法,请调用 init 方法:

var algorithmVar = /* instantiate algorithm using registry here */;
var parameter = /* instantiate relevant parameter class here */;
algorithmVar.init(parameter);

示例代码

使用注册表实例化对象

使用注册表,可以将算法名称提供给高级类工厂。这在涉及多个算法实现类时特别方便。所有必要的类都可以通过单个名称(例如 “SHA-256/HMAC” 或 “SHA-1/HMAC/PBKDF2” 或 “AES/CBC/PKCS7”)实例化,并且它们会自动组合在一起并带有正确的值。

例如:

import 'package:pointycastle/export.dart';

void main() {
  final sha256 = Digest("SHA-256");
  final sha1 = Digest("SHA-1");
  final md5 = Digest("MD5");

  final hmacSha256 = Mac("SHA-256/HMAC");
  final hmacSha1 = Mac("SHA-1/HMAC");
  final hmacMd5 = Mac("MD5/HMAC");

  final derivator = KeyDerivator("SHA-1/HMAC/PBKDF2");

  final signer = Signer("SHA-256/RSA");

  // Example usage of SHA-256 digest
  final input = "Hello, world!";
  final output = sha256.process(Uint8List.fromList(input.codeUnits));
  print("SHA-256 Digest: ${Uint8List.view(output.buffer).toList()}");
}

不使用注册表实例化对象

不使用注册表时,每个实现类都必须使用其构造函数实例化。如果一个算法涉及多个算法实现类,则必须单独实例化并将它们组合在一起,并赋予正确的值。

例如:

import 'package:pointycastle/api.dart';
import 'package:pointycastle/digests/sha256.dart';
import 'package:pointycastle/mac/hmac.dart';
import 'package:pointycastle/key_derivators/pbkdf2.dart';
import 'package:pointycastle/signers/rsa_signer.dart';
import 'package:pointycastle/asymmetric/api.dart';

void main() {
  final sha256 = SHA256Digest();
  final sha1 = SHA1Digest();
  final md5 = MD5Digest();

  final hmacSha256 = HMac(SHA256Digest(), 64);
  final hmacSha512 = HMac(SHA512Digest(), 128);
  final hmacMd5 = HMac(MD5Digest(), 64);

  final derivator = PBKDF2KeyDerivator(HMac(SHA256Digest(), 64));

  final signer = RSASigner(SHA256Digest(), '0609608648016503040201');

  // Example usage of SHA-256 digest
  final input = "Hello, world!";
  final output = sha256.process(Uint8List.fromList(input.codeUnits));
  print("SHA-256 Digest: ${Uint8List.view(output.buffer).toList()}");
}

导入库的方式

程序可以采用以下三种方式导入 Point Castle 库:

  1. 仅导入 pointycastle.dart

    • 导出高级 API 和接口实现。
    • 不导出任何算法实现类。
  2. 仅导入 exports.dart

    • 导出高级 API、接口实现以及所有算法实现类。
  3. 导入 api.dart 并根据需要导入各个库

    • 只导出高级 API。
    • 需要显式导入其他库以使用其实现类。

示例:仅导入 pointycastle.dart

import 'package:pointycastle/pointycastle.dart';

void main() {
  final sha256 = Digest("SHA-256");
  final p = Padding("PKCS7");

  // Example usage of SHA-256 digest
  final input = "Hello, world!";
  final output = sha256.process(Uint8List.fromList(input.codeUnits));
  print("SHA-256 Digest: ${Uint8List.view(output.buffer).toList()}");
}

示例:仅导入 exports.dart

import 'package:pointycastle/export.dart';

void main() {
  final sha256 = Digest("SHA-256");
  final md5 = MD5Digest();
  final p = Padding("PKCS7");
  final s = FortunaRandom();

  // Example usage of SHA-256 digest
  final input = "Hello, world!";
  final output = sha256.process(Uint8List.fromList(input.codeUnits));
  print("SHA-256 Digest: ${Uint8List.view(output.buffer).toList()}");
}

示例:导入 api.dart 和各个库

import 'package:pointycastle/api.dart';
import 'package:pointycastle/digests/sha256.dart';
import 'package:pointycastle/digests/md5.dart';
import 'package:pointycastle/paddings/pkcs7.dart';

void main() {
  final sha256 = Digest("SHA-256");
  final md5 = MD5Digest();
  final p = Padding("PKCS7");

  // Example usage of SHA-256 digest
  final input = "Hello, world!";
  final output = sha256.process(Uint8List.fromList(input.codeUnits));
  print("SHA-256 Digest: ${Uint8List.view(output.buffer).toList()}");
}

总结

Pointy Castle 提供了丰富的加密和解密功能,支持多种算法和模式。无论是通过注册表还是直接使用构造函数,开发者都可以轻松地在项目中集成这些功能。希望上述示例代码和说明能帮助您更好地理解和使用 Pointy Castle 插件。


更多关于Flutter加密解密插件pointycastle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密解密插件pointycastle的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在Flutter项目中,pointycastle 是一个广泛使用的加密解密库,它提供了多种加密算法和功能。以下是如何在Flutter项目中使用 pointycastle 进行基本的加密和解密操作的示例代码。

1. 添加依赖

首先,在你的 pubspec.yaml 文件中添加 pointycastle 依赖:

dependencies:
  flutter:
    sdk: flutter
  pointycastle: ^3.0.1  # 确保使用最新版本

然后运行 flutter pub get 来获取依赖。

2. 导入库

在你的 Dart 文件中导入 pointycastle

import 'package:pointycastle/export.dart';

3. AES加密解密示例

以下是一个使用 AES (高级加密标准) 进行加密和解密的示例:

void main() {
  // 待加密的明文
  String plaintext = 'Hello, Flutter!';
  
  // 密钥和初始化向量 (IV)
  Uint8List key = Uint8List.fromList(List.generate(32, (index) => index % 256)); // 256位密钥
  Uint8List iv = Uint8List.fromList(List.generate(16, (index) => index % 256)); // 128位IV

  // 加密
  Uint8List encrypted = aesEncrypt(plaintext, key, iv);
  print('Encrypted: ${base64Encode(encrypted)}');

  // 解密
  String decrypted = aesDecrypt(encrypted, key, iv);
  print('Decrypted: $decrypted');
}

Uint8List aesEncrypt(String plaintext, Uint8List key, Uint8List iv) {
  final plainTextBytes = Uint8List.fromList(plaintext.codeUnits);
  final blockCipher = AESFastEngine();
  final keyParameter = KeyParameter(key);
  final paddedBlockCipher = PaddedBlockCipherImpl(blockCipher);
  final parametersWithIV = ParametersWithIV(keyParameter, iv);

  paddedBlockCipher.init(true, parametersWithIV);
  return paddedBlockCipher.process(plainTextBytes);
}

String aesDecrypt(Uint8List ciphertext, Uint8List key, Uint8List iv) {
  final blockCipher = AESFastEngine();
  final keyParameter = KeyParameter(key);
  final paddedBlockCipher = PaddedBlockCipherImpl(blockCipher);
  final parametersWithIV = ParametersWithIV(keyParameter, iv);

  paddedBlockCipher.init(false, parametersWithIV);
  final decryptedBytes = paddedBlockCipher.process(ciphertext);
  return String.fromCharCodes(decryptedBytes);
}

4. 注意事项

  • 密钥管理:在实际应用中,密钥的管理和保护至关重要。不要硬编码密钥在代码中。
  • IV:初始化向量 (IV) 通常需要与密钥一起存储,但不需要保密。确保每次加密时使用不同的IV。
  • 填充:AES块加密需要数据块大小为128位(16字节),因此通常使用填充方案。上面的代码使用了PaddedBlockCipherImpl来处理填充。
  • 异常处理:在实际应用中,添加适当的异常处理以捕获和处理可能的加密/解密错误。

这个示例展示了如何使用 pointycastle 库在Flutter应用中进行基本的AES加密和解密操作。根据你的需求,你可能需要调整密钥长度、使用不同的加密模式(如CBC、GCM等)或添加其他安全特性。

回到顶部