HarmonyOS 鸿蒙Next AES cbc 加解密直接运行api中的demo报解密失败

发布于 1周前 作者 phonegap100 来自 鸿蒙OS

HarmonyOS 鸿蒙Next AES cbc 加解密直接运行api中的demo报解密失败

function generateRandom(len: number) {
let rand = cryptoFramework.createRandom();
let generateRandSync = rand.generateRandomSync(len);
return generateRandSync;
}

function genIvParamsSpec() {
let ivBlob = generateRandom(16);
let ivParamsSpec: cryptoFramework.IvParamsSpec = {
algName: “IvParamsSpec”,
iv: ivBlob
};
return ivParamsSpec;
}
let iv = genIvParamsSpec();
// 加密消息
function encryptMessage(symKey: cryptoFramework.SymKey, plainText: cryptoFramework.DataBlob) {
let cipher = cryptoFramework.createCipher(‘AES128|CBC|PKCS7’);
cipher.initSync(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, iv);
let cipherData = cipher.doFinalSync(plainText);
return cipherData;
}
// 解密消息
function decryptMessage(symKey: cryptoFramework.SymKey, cipherText: cryptoFramework.DataBlob) {
let decoder = cryptoFramework.createCipher(‘AES128|CBC|PKCS7’);
decoder.initSync(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, iv);
let decryptData = decoder.doFinalSync(cipherText);
decryptData = decoder.updateSync(cipherText);
return decryptData;
}

function genSymKeyByData(symKeyData: Uint8Array) {
let symKeyBlob: cryptoFramework.DataBlob = { data: symKeyData };
let aesGenerator = cryptoFramework.createSymKeyGenerator(‘AES128’);
let symKey = aesGenerator.convertKeySync(symKeyBlob);
console.info(‘convertKeySync success’);
return symKey;
}

export function main() {
try {
let keyData = new Uint8Array([83, 217, 231, 76, 28, 113, 23, 219, 250, 71, 209, 210, 205, 97, 32, 159]);
let symKey = genSymKeyByData(keyData);
let message = “This is a test”;
let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, ‘utf-8’).buffer) };
let encryptText = encryptMessage(symKey, plainText);
let decryptText = decryptMessage(symKey, encryptText);
if (plainText.data.toString() === decryptText.data.toString()) {
console.info(‘decrypt ok’);
console.info('decrypt plainText: ’ + buffer.from(decryptText.data).toString(‘utf-8’));
} else {
console.error(‘decrypt failed’);
}
} catch (error) {
console.error(AES CBC “${error}“, error code: ${error.code});
}
}

一直输出   decrypt failed  。请问是哪里的问题

5 回复
有具体的报错截图吗,看问题中的描述,
if (plainText.data.toString() === decryptText.data.toString()) {
      console.info('decrypt ok');
      console.info('decrypt plainText: ' + buffer.from(decryptText.data).toString('utf-8'));
    } else {
      console.error('decrypt failed');
    } 

在这里报错,可以debug下代码具体看下

这里没报错,就是单纯的不相等。 我后面观察到加密后encryptText.data 为【0,0,0】 。明显这里来了已经不对了,你可以直接复制那段代码运行下看看。地址:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-aes-sym-encrypt-decrypt-cbc-V5

补充下:使用真机测,运行成功。 之前使用的是 单元测试功能

真机可以测试成功就好

针对您提到的HarmonyOS鸿蒙Next AES CBC加解密直接运行API中的Demo报解密失败的问题,这通常可能由以下几个原因引起:

  1. 密钥或初始向量(IV)不匹配:请确保加密和解密时使用的密钥和IV完全一致。任何微小的差异都会导致解密失败。

  2. 填充模式不一致:AES加密通常使用某种填充模式来处理数据块大小不匹配的问题。如果加密时使用了某种填充模式(如PKCS7),解密时也必须使用相同的填充模式。

  3. 数据损坏:在传输或存储过程中,加密数据可能被意外修改或损坏,导致解密失败。

  4. API使用错误:检查Demo代码,确保API的使用符合文档要求,包括参数传递、调用顺序等。

  5. 环境差异:不同设备或开发环境可能影响加密库的行为。确保测试环境与生产环境一致。

建议逐一排查上述可能原因,并对照官方文档仔细核对代码。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部