AesUtils.ets
3.71 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { util } from '@kit.ArkTS';
const TAG: string = '[AesUtils]'
/**
* ASE密钥 TODO 示例密钥,业务需要按实际密钥修改
*/
const AES_ENCRYPT_KEY: string = '5QXzAbJj0TJN9OQNvxFhhw==';
const AES128: string = 'AES128';
const AES128_ECB_PKCS5: string = 'AES128|ECB|PKCS5'; // 'AES128|PKCS5';
/**
* AES加密/解密
*/
export class AesUtils {
static stringToUint8Array(str: string) {
let arr: number[] = new Array();
for (let i = 0, j = str.length; i < j; ++i) {
arr.push(str.charCodeAt(i));
}
let tmpArray = new Uint8Array(arr);
return tmpArray;
}
static uint8ArrayToString(array: Uint8Array): string {
let arrayString = '';
for (let i = 0; i < array.length; i++) {
arrayString += String.fromCharCode(array[i]);
}
return arrayString;
}
/**
* aes加密
* @param message
* @param callback
*/
static async aesEncrypt(message: string, secretKey?: string): Promise<string> {
// Logger.debug(TAG, `aesEncrypt message: ${message}`);
// 组装convertKey所需的二进制密钥数据
let base64Helper = new util.Base64Helper();
let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
// 创建对称密钥生成器
let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
// 转换/生成对称密钥对象
let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
// 生成加解密生成器
let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
// 初始化加密
await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, null)
// 封装加密所需数据
let input: cryptoFramework.DataBlob = { data: AesUtils.stringToUint8Array(message) };
// 当数据量较小时,可以在init完成后直接调用doFinal
// 当数据量较大时,可以多次调用update,即分段加解密。
let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
// Logger.info(TAG, "aesEncrypt output.data is " + output.data);
let result = base64Helper.encodeToStringSync(output?.data)
// Logger.info(TAG, "aesEncrypt result is " + result);
return result;
}
/**
* aes解密
* @param message
* @param callback
*/
static async aesDecrypt(message: string, secretKey?: string): Promise<string> {
// Logger.debug(TAG, `aesDecrypt message: ${message}`);
// 组装convertKey所需的二进制密钥数据
let base64Helper = new util.Base64Helper();
let pubKey = base64Helper.decodeSync(secretKey ?? AES_ENCRYPT_KEY); // AES密钥
let pubKeyBlob: cryptoFramework.DataBlob = { data: pubKey };
// 创建对称密钥生成器
let aesGenerator = cryptoFramework.createSymKeyGenerator(AES128);
// 转换/生成对称密钥对象
let symKey: cryptoFramework.SymKey = await aesGenerator.convertKey(pubKeyBlob)
// 生成加解密生成器
let cipher = cryptoFramework.createCipher(AES128_ECB_PKCS5);
// 初始化加密
await cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, null)
// 封装加密所需数据
let newMessage = base64Helper.decodeSync(message);
let input: cryptoFramework.DataBlob = { data: newMessage };
// 当数据量较小时,可以在init完成后直接调用doFinal
// 当数据量较大时,可以多次调用update,即分段加解密。
let output: cryptoFramework.DataBlob = await cipher.doFinal(input)
// Logger.debug(TAG, "aesDecrypt is output.data " + output?.data);
let result = AesUtils.uint8ArrayToString(output?.data)
// Logger.debug(TAG, "aesDecrypt result is " + result);
return result
}
}