php 有个加密解密的 authcode 方法,在写 Flutter 的时候涉及到数据加密,就写了个 Flutter 版的 authcode
特点
1、可设置加密 key
2、可设置过期时间
加密原理
根据加密key,获取 ascii 码映射表 box(打乱)
前十位为时间戳,主要用来判断是否过期,中间16位为加密的值,后面就是原始数据,然后求出每个字符的 255 位 ascii 码值,并和 box 获取的值进行异或位运算,最后用base64加密一下
Flutter 坑点
其实也不算是坑,应该只是我不熟 dart 语言而已
convert 包中的 ascii.decode 方法只能转换 127 的 ascii ,所以要使用字符串的 codeUnits
base64Decode 解密的字符串必须是 4 的倍数,否则会报错,因为加密返回时,去掉了 = 号,所以在解密时要补全
对于加密中文
加密中文时,必须使用 urlencode(Uri.encodeComponent(url)) 转换一下,当然解出来后也要 urldecode(Uri.decodeComponent(encodedUrl)) 一下
源码如下import 'dart:convert' as convert;
import 'package:crypto/crypto.dart';
import 'dart:typed_data';
class AuthCode {
//加密key
static const String KEY = '123456';
//过期时间,秒
static const int EXPIRY = 0;
//加密
static String encode(String str ,{String key : KEY, int expiry : EXPIRY}){
return _authcode(str,operation:'ENCODE',key: key,expiry: expiry);
}
//解密
static String decode(String str ,{St