HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断
HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断 正确结果应为{“data=1,data1=2,data2=3”} 目前解密完只剩下{"data=1,data1=2
加密数据 let result = base64.decodeSync(data);
和解密完数据转字符串 let result = util.TextDecoder.create(“utf-8”).decodeWithStream(new Uint8Array(output.data));
怀疑这两个步骤出现了问题,但是试了其他方式也不对,大家有其他思路吗?
import cryptoFramework from "@ohos.security.cryptoFramework"
import util from '@ohos.util'
import { cipherUtils } from '../utils/HYCipherUtils';
const iv = "1234567890abcdef"
let base = new util.Base64Helper();
export class AES_CBC {
async aesCBCDecrypt(data,key) {
data= 'Yx63sA5TtrNJAD3cFRE7dPrfxpo54jhnZPmwy1mxTK0='
key = 'yagatqxj8t6vvuln'
let cipherUtil = new cipherUtils();
let cipherAlgName = 'AES128|CBC|PKCS7';
let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')
let ivParam: cryptoFramework.IvParamsSpec = {
algName: 'IvParamsSpec',
iv: {
data: cipherUtil.encode(iv)
}
}
var cipher;
return symKeyGenerator.convertKey({
data:cipherUtil.encode(key)
}).then(symKey => {
try {
cipher = cryptoFramework.createCipher(cipherAlgName);
console.info(`xx cipher algName: ${cipher.algName}`);
} catch (error) {
console.error(`xx createCipher failed, ${error.code}, ${error.message}`);
return null
}
return cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, symKey, ivParam)
.then(() => {
let base64 = new util.Base64Helper();
let result = base64.decodeSync(data);
return cipher.update({
data: result
})
})
.then(output => {
let result = util.TextDecoder.create("utf-8").decodeWithStream(new Uint8Array(output.data));
return new Promise(resolve => {
resolve(result)
})
}).catch(err => {
return new Promise((_, reject) => {
reject(err)
})
})
}).catch(err => {
return new Promise((_, reject) => {
reject(err)
})
})
}
}
export class cipherUtils {
// 编码
encode(str) {
const arr = [...str]
const buffer = new Uint8Array(arr.length * 4)
let index = 0
for (let i = 0; i < arr.length; i++) {
const codePoint = arr[i].codePointAt(0)
// 四字节字符
if (codePoint >= 0x10000) {
buffer[index++] = (codePoint >> 18) & 0x7 | 0xf0
buffer[index++] = (codePoint >> 12) & 0x3f | 0x80
buffer[index++] = (codePoint >> 6) & 0x3f | 0x80
buffer[index++] = codePoint & 0x3f | 0x80
} else if (codePoint >= 0x800) {
// 三字节字符
buffer[index++] = (codePoint >> 12) & 0xf | 0xe0
buffer[index++] = (codePoint >> 6) & 0x3f | 0x80
buffer[index++] = codePoint & 0x3f | 0x80
} else if (codePoint >= 0x80) {
// 两字节字符
buffer[index++] = (codePoint >> 6) & 0x1f | 0xc0
buffer[index++] = codePoint & 0x3f | 0x80
} else {
// 单字节字符
buffer[index++] = codePoint
}
}
return buffer.slice(0, index)
}
// 解码
decode(buffer) {
let str = ''
for (let i = 0; i < buffer.length; i++) {
switch (buffer[i] >> 4) {
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
str += String.fromCodePoint(buffer[i])
break
case 12: case 13:
str += String.fromCodePoint(
((buffer[i] & 0x1f) << 6) +
(buffer[i + 1] & 0x3f)
)
i++
break
case 14:
str += String.fromCodePoint(
((buffer[i] & 0xf) << 12) +
((buffer[i + 1] & 0x3f) << 6) +
(buffer[i + 2] & 0x3f)
)
i += 2
break
case 15:
str += String.fromCodePoint(
((buffer[i] & 0x7) << 18) +
((buffer[i + 1] & 0x3f) << 12) +
((buffer[i + 2] & 0x3f) << 6) +
(buffer[i + 3] & 0x3f)
)
i += 3
break
}
}
return str
}
}
更多关于HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断的实战教程也可以访问 https://www.itying.com/category-93-b0.html
找到问题了,是 key 的值不对,导致解密后数据被截取
更多关于HarmonyOS 鸿蒙Next cryptoFramework AES 解密结果内容截断的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用cryptoFramework
进行AES解密时,如果遇到解密结果内容截断的问题,可能是由于以下原因导致的:
-
填充模式不匹配:AES加密通常需要指定填充模式(如PKCS7)。如果加密时使用了填充模式,而解密时未正确设置相同的填充模式,可能导致解密结果不正确或截断。
-
数据长度问题:AES加密要求数据长度必须是块大小的整数倍(AES块大小为128位,即16字节)。如果加密数据长度不符合要求,可能会导致解密时数据截断。
-
解码问题:加密后的数据通常是二进制格式,如果在解密前对数据进行了编码(如Base64),解密时需要先进行相应的解码操作,否则可能导致解密失败或结果截断。
-
密钥或IV不匹配:AES加密需要密钥和初始化向量(IV),如果解密时使用的密钥或IV与加密时不一致,会导致解密失败或结果不正确。
-
API使用错误:在使用
cryptoFramework
进行解密时,可能未正确调用API或参数设置不当,导致解密结果截断。
检查以上几点,确保加密和解密时使用的参数和流程一致,以避免解密结果截断的问题。