当前位置: 首页 > news >正文

基于最新版的flutter pointycastle: ^3.9.1的AES加密

基于最新版的flutter pointycastle: ^3.9.1的AES加密

  • 自己添加pointycastle: ^3.9.1库
  • config.dart
  • aes_encrypt.dart

自己添加pointycastle: ^3.9.1库

config.dart

import 'dart:convert';
import 'dart:typed_data';class Config {static String password = '成都推理计算科技'; // 16字节(128位)的AES密钥static Uint8List iv = Uint8List.fromList([0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]); // 初始化向量(IV),对于AES/CBC/PKCS7Padding是必需的。自己按照ASCII表填点对自己有用的static int aesSize = 128;//可以填128,192,256static String aesSalt=latin1.decode([10, 120, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);//salt可以用库里面的函数生成
}

aes_encrypt.dart

import 'dart:convert';
import 'dart:typed_data';import 'package:pointycastle/pointycastle.dart';
import 'package:pointycastle/src/platform_check/platform_check.dart';
import 'config.dart';class AesEncrypt {final iv = Config.iv;final password = Config.password;final aesSize = Config.aesSize;final aesSalt = Config.aesSalt;AesEncrypt();Uint8List aesCbcEncrypt(Uint8List key, Uint8List iv, Uint8List paddedPlaintext) {if (![128, 192, 256].contains(key.length * 8)) {throw ArgumentError.value(key, 'key', 'invalid key length for AES');}if (iv.length * 8 != 128) {throw ArgumentError.value(iv, 'iv', 'invalid IV length for AES');}if (paddedPlaintext.length * 8 % 128 != 0) {throw ArgumentError.value(paddedPlaintext, 'paddedPlaintext', 'invalid length for AES');}final cbc = BlockCipher('AES/CBC')..init(true, ParametersWithIV(KeyParameter(key), iv)); // true=encryptfinal cipherText = Uint8List(paddedPlaintext.length); // allocate spacevar offset = 0;while (offset < paddedPlaintext.length) {offset += cbc.processBlock(paddedPlaintext, offset, cipherText, offset);}assert(offset == paddedPlaintext.length);return cipherText;}Uint8List aesCbcDecrypt(Uint8List key, Uint8List iv, Uint8List cipherText) {if (![128, 192, 256].contains(key.length * 8)) {throw ArgumentError.value(key, 'key', 'invalid key length for AES');}if (iv.length * 8 != 128) {throw ArgumentError.value(iv, 'iv', 'invalid IV length for AES');}if (cipherText.length * 8 % 128 != 0) {throw ArgumentError.value(cipherText, 'cipherText', 'invalid length for AES');}final cbc = BlockCipher('AES/CBC')..init(false, ParametersWithIV(KeyParameter(key), iv)); // false=decryptfinal paddedPlainText = Uint8List(cipherText.length); // allocate spacevar offset = 0;while (offset < cipherText.length) {offset += cbc.processBlock(cipherText, offset, paddedPlainText, offset);}assert(offset == cipherText.length);return paddedPlainText;}String bin2hex(Uint8List bytes, {String? separator, int? wrap}) {var len = 0;final buf = StringBuffer();for (final b in bytes) {final s = b.toRadixString(16);if (buf.isNotEmpty && separator != null) {buf.write(separator);len += separator.length;}if (wrap != null && wrap < len + 2) {buf.write('\n');len = 0;}buf.write('${(s.length == 1) ? '0' : ''}$s');len += 2;}return buf.toString();}Uint8List hex2bin(String hexStr) {if (hexStr.length % 2 != 0) {throw const FormatException('not an even number of hexadecimal characters');}final result = Uint8List(hexStr.length ~/ 2);for (var i = 0; i < result.length; i++) {result[i] = int.parse(hexStr.substring(2 * i, 2 * (i + 1)), radix: 16);}return result;}Uint8List pad(Uint8List bytes, int blockSizeBytes) {final padLength = blockSizeBytes - (bytes.length % blockSizeBytes);final padded = Uint8List(bytes.length + padLength)..setAll(0, bytes);Padding('PKCS7').addPadding(padded, bytes.length);return padded;}Uint8List unpad(Uint8List padded) => padded.sublist(0, padded.length - Padding('PKCS7').padCount(padded));Uint8List passphraseToKey(String passPhrase, {String salt = '', int iterations = 30000, required int bitLength}) {if (![128, 192, 256].contains(bitLength)) {throw ArgumentError.value(bitLength, 'bitLength', 'invalid for AES');}final numBytes = bitLength ~/ 8;final kd = KeyDerivator('SHA-256/HMAC/PBKDF2')..init(Pbkdf2Parameters(utf8.encode(salt), iterations, numBytes));return kd.process(utf8.encode(passPhrase));}Uint8List? generateRandomBytes(int numBytes) {if (_secureRandom == null) {// First invocation: create _secureRandom and seed it_secureRandom = SecureRandom('Fortuna');_secureRandom!.seed(KeyParameter(Platform.instance.platformEntropySource().getBytes(32)));}// Use it to generate the random bytesfinal iv = _secureRandom!.nextBytes(numBytes);return iv;}SecureRandom? _secureRandom;Uint8List encrypt(String textToEncrypt) {final cipherText = aesCbcEncrypt(passphraseToKey(password, salt: aesSalt, bitLength: aesSize), iv, pad(utf8.encode(textToEncrypt), 16));return cipherText;}String decrypt(List<int> cipherListInt) {Uint8List cipherText = Uint8List.fromList(cipherListInt);final paddedDecryptedBytes =aesCbcDecrypt(passphraseToKey(password, salt: aesSalt, bitLength: aesSize), iv, cipherText);final decryptedBytes = unpad(paddedDecryptedBytes);final decryptedText = utf8.decode(decryptedBytes);return decryptedText;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 一、C#概述
  • cordova使用vue进行开发
  • 题解:T480718 eating
  • 【思科】链路聚合实验配置和背景
  • 自动化产线 搭配数据采集监控平台 创新与突破
  • mysql 安装配置 next 按钮为什么置灰点击不了
  • 3D 渲染一个房屋需要多长时间?
  • chatglm2-6b-prompt尝试
  • SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼
  • 路网双线合并单线——ArcGIS 解决方法
  • 全国区块链职业技能大赛国赛考题区块链产品需求分析与方案设计
  • CSS 计数器:WebKit 的样式增强术
  • Java8-21新特性
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号3
  • modbus slave 设备通过 网关thingsboard-gateway 将数据上传到thingsboard云平台
  • 收藏网友的 源程序下载网
  • 自己简单写的 事件订阅机制
  • iOS小技巧之UIImagePickerController实现头像选择
  • Java多线程(4):使用线程池执行定时任务
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • Magento 1.x 中文订单打印乱码
  • Promise初体验
  • Rancher如何对接Ceph-RBD块存储
  • React-Native - 收藏集 - 掘金
  • use Google search engine
  • 从零搭建Koa2 Server
  • 对象引论
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 诡异!React stopPropagation失灵
  • 机器学习学习笔记一
  • 模型微调
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • postgresql行列转换函数
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​​​【收录 Hello 算法】9.4 小结
  • #include<初见C语言之指针(5)>
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • $.proxy和$.extend
  • (+4)2.2UML建模图
  • (android 地图实战开发)3 在地图上显示当前位置和自定义银行位置
  • (echarts)echarts使用时重新加载数据之前的数据存留在图上的问题
  • (k8s)Kubernetes本地存储接入
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)计算机毕业设计SSM保险客户管理系统
  • (五)c52学习之旅-静态数码管
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .net dataexcel 脚本公式 函数源码
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .vue文件怎么使用_我在项目中是这样配置Vue的
  • [ C++ ] STL_vector -- 迭代器失效问题
  • [ C++ ] template 模板进阶 (特化,分离编译)