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