HarmonyOS NEXT Developer Preview2模拟器:使用cryptoFramework加解密的时候,经常崩溃,同样的加解密代码,同样的数据,运行效果不同:大概率会失败、小概率会成功、经常会崩溃
同样的代码同样的数据,为什么会执行出不同的结果呢?
奔溃信息如下:
Device info:emulator
Build info:emulator 4.1.0.67(DEVC00E67R4P11log)
Fingerprint:40e9623ff2f651ca929a11ebf2b304f66d9ac967411f0e43c3f8563ce3ce89ae
Module name:com.example.hbcanner_hm
Version:1.0.0
VersionCode:1000000
PreInstalled:No
Foreground:Yes
Timestamp:2024-04-17 09:58:30.093
Pid:2986
Uid:20020033
Process name:com.example.hbcanner_hm
Reason:Signal:SIGSEGV(SEGV_MAPERR)@0x0000000000000010 probably caused by NULL pointer dereference
Fault thread Info:
Tid:3008, Name:ple.hbcanner_hm
#00 pc 000000000030f820 /system/lib64/chipset-pub-sdk/libcrypto_openssl.z.so(EVP_CipherUpdate+0)(7291138c2fde3e6d1c79c8b516f1e13b)
#01 pc 000000000003649d /system/lib64/platformsdk/libcrypto_openssl_plugin_lib.z.so(7fe31d85dd1d9486203b84ec12ca038f)
#02 pc 0000000000019392 /system/lib64/module/security/libcryptoframework_napi.z.so(df78b46e2eac852554011d94aa429577)
#03 pc 0000000000050305 /system/lib64/platformsdk/libace_napi.z.so(NativeAsyncWork::AsyncWorkCallback(uv_work_s*)+197)(19e93c5b5dd3c64c2d49e1787c064b5f)
#04 pc 00000000000159fc /system/lib64/platformsdk/libuv.so(97aa20cec7cddf74b13f681315cff7eb)
#05 pc 0000000000114ab7 /system/lib/ld-musl-x86_64.so.1(70f5e1a4df8aa3510e8ec8132b8f901f)
#06 pc 000000000008728e /system/lib/ld-musl-x86_64.so.1(70f5e1a4df8aa3510e8ec8132b8f901f)
Registers:
rax:00007f2796399560 rdx:00007f26f89aa8dc rcx:00007f2796399380 rbx:00007f2796517b58
rsi:00007f2796399560 rdi:0000000000000000 rbp:00000000000001e0 rsp:00007f26f89aa8c8
r8:00000000000001d0 r9:000056232d2a5a68 r10:00007f2792202878 r11:0000000000000206
r12:00007f27986a1758 r13:0000000000000001 r14:00007f2796517b68 r15:00007f27962fb4f0 rip:00007f279370f820
正常加解密
以下是我编写的AES加解密代码
import {
base64SafeStringToString,
stringToBase64SafeString,
stringToUint8Array,
uint8ArrayToString
} from '../StringUtil';
import util from '@ohos.util';
import logger from '../LoggerUtil';
import cryptoFramework from '@ohos.security.cryptoFramework';
import { Event } from '@kit.ArkTS';
const AES_CBC_PKCS5 = 'AES128|CBC|PKCS5'
const AES = 'AES128'
namespace AesUtil {
export function decryptAES(strCipherText: string, key: string, ivPara?: string): Promise {
return new Promise(async (resolve: Function, _: Function) => {
try {
strCipherText = stringToBase64SafeString(strCipherText)
let base64Helper = new util.Base64Helper()
while (strCipherText.length % 4 != 0) {
strCipherText += '='
}
let dataArrayBase64: Uint8Array = base64Helper.decodeSync(strCipherText)
let keyArray = stringToUint8Array(key)
let pkBlob: cryptoFramework.DataBlob = { data: keyArray }
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES);
symKeyGenerator.convertKey(pkBlob).then(keyInfo => {
try {
let cipher: cryptoFramework.Cipher
if (ivPara === undefined) {
cipher = cryptoFramework.createCipher(AES)
cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyInfo, null)
} else {
cipher = cryptoFramework.createCipher(AES_CBC_PKCS5)
let ivParamsSpec: cryptoFramework.IvParamsSpec = {
iv: { data: stringToUint8Array(ivPara) },
algName: 'IvParamsSpec'
}
cipher.init(cryptoFramework.CryptoMode.DECRYPT_MODE, keyInfo, ivParamsSpec)
}
cipher.doFinal({ data: dataArrayBase64 }).then(result => {
resolve(uint8ArrayToString(result.data))
}).catch((error: Error | ErrorConstructor | Event | RegExp | RegExpConstructor) => {
logger.debug(`CodeUtil - AES decryptAES doFinal: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
})
} catch (error) {
logger.debug(`CodeUtil - AES decryptAES convertKey-catch: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
}
}).catch((error: string) => {
logger.debug(`CodeUtil - AES decryptAES convertKey: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
})
} catch (error) {
logger.debug(`CodeUtil - AES decryptAES catch: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
}
});
}
export function encryptAES(strCipherText: string, key: string): Promise {
return new Promise(async (resolve: Function, _: Function) => {
try {
let keyArray = stringToUint8Array(key)
let dataArray = stringToUint8Array(strCipherText)
let pkBlob: cryptoFramework.DataBlob = { data: keyArray }
let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES);
symKeyGenerator.convertKey(pkBlob).then(keyInfo => {
let cipher = cryptoFramework.createCipher(AES)
cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, keyInfo, null)
cipher.doFinal({ data: dataArray }).then(result => {
let base64Helper = new util.Base64Helper
resolve(base64SafeStringToString(base64Helper.encodeToStringSync(result.data)))
}).catch((error: string) => {
logger.debug(`CodeUtil - AES encryptAES doFinal: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
})
}).catch((error: string) => {
logger.debug(`CodeUtil - AES encryptAES convertKey: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
})
} catch (error) {
logger.debug(`CodeUtil - AES encryptAES catch: ${error} text: ${strCipherText} key: ${key}`)
resolve('')
}
});
}
}
export default AesUtil
感谢提交Issue!关于Issue的交互操作,请访问OpenHarmony社区支持命令清单。如果有问题,请联系 @NEEN @zengyawen @时睿 @Peter_1988 。如果需要调整订阅PR、Issue的变更状态,请访问链接。
Thanks for submitting the issue. For more commands, please visit OpenHarmony Command List. If you have any questions, please refer to committer @NEEN @zengyawen @时睿 @Peter_1988 for help. If you need to change the subscription of a Pull Request or Issue, please visit the link.
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
登录 后才可以发表评论