HarmonyOS鸿蒙Next中关于AES CBC模式分段加解密

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

HarmonyOS鸿蒙Next中关于AES CBC模式分段加解密 根据相关参考文档,如果是cbc模式的话,进行分段加解密是不是不需要执行await cipher.doFinal(null);

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-aes-sym-encrypt-decrypt-gcm-by-segment-V5


更多关于HarmonyOS鸿蒙Next中关于AES CBC模式分段加解密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS鸿蒙Next中关于AES CBC模式分段加解密的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


cbc模式加解密的代码请参考: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/crypto-aes-sym-encrypt-decrypt-cbc-V5

您可以参考一下demo,注意cbc模式进行分段加解密需要执行await cipher.doFinal(null);

// 分段加密消息

async function encryptMessageUpdateBySegment(symKey: Uint8Array, plainText: cryptoFramework.DataBlob, iv: Uint8Array) {

let cipher = cryptoFramework.createCipher('AES128|CBC|PKCS7');

let symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");

let keyPair = await symKeyGenerator.convertKey({ data: symKey })

//偏移量

let ivParamsSpec: cryptoFramework.IvParamsSpec = {

iv: { data: iv },

algName: "IvParamsSpec"

};

//初始化

await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyPair, ivParamsSpec);

let updateLength = 128; // 假设以20字节为单位进行分段update,实际并无要求

let cipherText = new Uint8Array();

for (let i = 0; i < plainText.data.length; i += updateLength) {

let updateMessage = plainText.data.subarray(i, i + updateLength);

let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };

// 分段update

let updateOutput = await cipher.update(updateMessageBlob);

// 把update的结果拼接起来,得到密文(有些情况下还需拼接doFinal的结果,这取决于分组模式

if (updateOutput) {

let mergeText = new Uint8Array(cipherText.length + updateOutput.data.length);

mergeText.set(cipherText);

mergeText.set(updateOutput.data, cipherText.length);

cipherText = mergeText;

}

}

let updateOutput = await cipher.doFinal(null);

if(updateOutput){

let mergeText = new Uint8Array(cipherText.length + updateOutput.data.length);

mergeText.set(cipherText);

mergeText.set(updateOutput.data, cipherText.length);

cipherText = mergeText;

}

let cipherBlob: cryptoFramework.DataBlob = { data: cipherText };

return cipherBlob;

}

// 分段解密消息

async function decryptMessageUpdateBySegment(symKey: Uint8Array, cipherText: cryptoFramework.DataBlob, iv: Uint8Array) {

let decoder = cryptoFramework.createCipher('AES128|CBC|PKCS7');

let symKeyGenerator = cryptoFramework.createSymKeyGenerator("AES128");

let keyPair = await symKeyGenerator.convertKey({ data: symKey })

let ivParamsSpec: cryptoFramework.IvParamsSpec = {

iv: { data: iv },

algName: "IvParamsSpec"

};

await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyPair, ivParamsSpec);

let updateLength = 128; // 假设以20字节为单位进行分段update,实际并无要求

let decryptText = new Uint8Array();

for (let i = 0; i < cipherText.data.length; i += updateLength) {

let updateMessage = cipherText.data.subarray(i, i + updateLength);

let updateMessageBlob: cryptoFramework.DataBlob = { data: updateMessage };

// 分段update

let updateOutput = await decoder.update(updateMessageBlob);

if (updateOutput) {

// 把update的结果拼接起来,得到明文

let mergeText = new Uint8Array(decryptText.length + updateOutput.data.length);

mergeText.set(decryptText);

mergeText.set(updateOutput.data, decryptText.length);

decryptText = mergeText;

}

}

let decryptData = await decoder.doFinal(null);

if (decryptData == null) {

console.info('GCM decrypt success, decryptData is null');

} else {

let mergeText = new Uint8Array(decryptText.length + decryptData.data.length);

mergeText.set(decryptText);

mergeText.set(decryptData.data, decryptText.length);

decryptText = mergeText;

}

let res = uint8ArrayToString(decryptText);

return res;

}

export function uint8ArrayToString(input: Uint8Array) {

let textDecoder = util.TextDecoder.create('utf-8');

return textDecoder.decodeWithStream(input);

}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!