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