HarmonyOS 鸿蒙Next Aes解密Hex输出问题
HarmonyOS 鸿蒙Next Aes解密Hex输出问题
使用AES解密时,一直在报解密异常,然后我这边排查了下我们的解密要用Hex方式输出解密,其他方式都是解密失败
代码:
import { cryptoFramework } from '@kit.CryptoArchitectureKit';
import { buffer, util } from '@kit.ArkTS';
const key: string = '';
const AES128: string = 'AES128';
const AES128_PKCS7: string = 'AES128|CBC|PKCS7';
const iv: string = '';
/**
AES加解密工具实现类
*/
let base = new util.Base64Helper();
export class AESUtils{
// 解密
async aesDecrypt(message: string, callback:(result: string) => void) {
let globalResult = ""
try {
let globalCipher = cryptoFramework.createCipher(AES128_PKCS7);
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES128);
let dataUint8Array =HexStrTouint8Array(key)
let keyBlob: cryptoFramework.DataBlob = { data: dataUint8Array }
let promiseSymKey = await symKeyGenerator.convertKey(keyBlob)
// /*设置偏移量 */
let globalCbcParams = genCBCParamsSpec();
await globalCipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, promiseSymKey, globalCbcParams);
let plainText: cryptoFramework.DataBlob = { data: base.decodeSync(message) }
let result = await globalCipher.doFinal(plainText)
globalResult = uint8ArrayToString(result.data);
callback(globalResult)
console.log("test---解密==》"+globalResult)
}catch (err){
console.log(err.message)
}
}
}
function genCBCParamsSpec() {
// let arr =
let dataIv = new Uint8Array(HexStrTouint8Array(iv));
let ivBlob: cryptoFramework.DataBlob = {
data: dataIv
};
let cbcParamsSpec: cryptoFramework.IvParamsSpec = {
iv: ivBlob,
algName: 'IvParamsSpec'
};
return cbcParamsSpec;
}
//十六进制转Uint8Array
function HexStrTouint8Array(data: string): Uint8Array {
return new Uint8Array(buffer.from(data, 'hex').buffer);;
}
// 字符串转成字节流
function stringToUint8Array(str: string) {
return new Uint8Array(buffer.from(str,'utf-8').buffer);
}
// 字节流转成可理解的字符串
function uint8ArrayToString(array:Uint8Array) {
// 将UTF-8编码转换成Unicode编码
let out: string = "";
let index: number = 0;
let len: number = array.length;
while (index < len) {
let character = array[index++];
switch(character >> 4) {
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
out += String.fromCharCode(character);
break;
case 12:
case 13:
out += String.fromCharCode(((character & 0x1F) << 6) | (array[index++] & 0x3F));
break;
case 14:
out += String.fromCharCode(((character & 0x0F) << 12) | ((array[index++] & 0x3F) << 6) | ((array[index++] & 0x3F) << 0));
break;
default:
break;
}
}
return out;
}
function uint8ArrayToHexStr(data: Uint8Array): string {
let hexString = "";
let i: number;
for (i = 0; i < data.length; i++) {
let char = ('00' + data[i].toString(16)).slice(-2);
hexString += char;
}
return hexString;
}
解密后报错信息: 错误描述:Error: convert sym key failed.[@605fbf34](/user/605fbf34)
更多关于HarmonyOS 鸿蒙Next Aes解密Hex输出问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
针对HarmonyOS 鸿蒙Next Aes解密Hex输出问题,这里提供直接的操作说明:
在HarmonyOS环境下进行Aes解密并输出Hex格式的结果,通常涉及以下几个步骤:
-
初始化Aes解密上下文: 使用系统提供的Aes解密API,根据密钥和模式(如CBC、ECB等)初始化解密上下文。
-
设置输入数据: 确保输入数据为正确的加密Hex字符串,需先将其转换为字节数组。可以使用系统内置的Hex解码函数完成此转换。
-
执行解密操作: 将解码后的字节数组作为输入,调用Aes解密函数进行解密。确保传入正确的初始化向量(IV,如适用)。
-
获取并转换解密结果: 解密完成后,获取解密后的字节数组,并使用系统提供的Hex编码函数将其转换为Hex字符串输出。
-
错误处理: 检查解密过程中可能出现的错误码,如解密失败,需根据错误码进行相应处理。
以上步骤为HarmonyOS环境下Aes解密并输出Hex格式结果的直接操作路径。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html