HarmonyOS 鸿蒙Next native 侧进行加解密异常
HarmonyOS 鸿蒙Next native 侧进行加解密异常
#include "napi/native_api.h"
#include "CryptoArchitectureKit/crypto_common.h"
#include "CryptoArchitectureKit/crypto_sym_key.h"
#include <CryptoArchitectureKit/crypto_sym_cipher.h>
#include <vector>
#include <string>
/**
* Crypto_DataBlob 转为 string
*
* @param env
* @param dataBlob
* @return
*/
static napi_value dataBlobToString(napi_env env, Crypto_DataBlob dataBlob) {
napi_status status;
napi_value str;
char *data = reinterpret_cast<char *>(dataBlob.data);
status = napi_create_string_utf8(env, data, strlen(data), &str);
if (status != napi_ok) {
return nullptr;
}
return str;
}
/**
* 加密
*
* @param env
* @param info
* @return
*/
static napi_value encrypt(napi_env env, napi_callback_info info) {
// 期望从ArkTS侧获取的参数的数量,napi_value可理解为ArkTS value在native方法中的表现形式。
size_t argc = 1;
napi_value args[1] = {nullptr};
// 从info中,拿到从ArkTS侧传递过来的参数。
napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
char buffer[256];
size_t buffer_length;
napi_get_value_string_utf8(env, args[0], buffer, buffer_length, &buffer_length);
napi_value encryptStr;
OH_CryptoSymKeyGenerator *ctx = nullptr;
OH_CryptoSymKey *keyCtx = nullptr;
OH_CryptoSymCipher *encCtx = nullptr;
OH_CryptoSymCipherParams *params = nullptr;
Crypto_DataBlob outUpdate = {.data = nullptr, .len = 0};
char *keyText = const_cast<char *>("7O0NAf60YFskefcajosoESb9d8fZse9B");
Crypto_DataBlob keyBlob = {.data = (uint8_t *)(keyText), .len = strlen(keyText)};
char *contentText = const_cast<char *>(buffer);
Crypto_DataBlob contentBlob = {.data = (uint8_t *)(contentText), .len = strlen(contentText)};
uint8_t iv[16] = {1, 2, 4, 12, 3, 4, 2, 3, 3, 2, 0, 4, 3, 1, 0, 10}; // iv使用安全随机数生成
Crypto_DataBlob ivBlob = {.data = iv, .len = sizeof(iv)};
OH_Crypto_ErrCode ret;
// 二进制数据转换AES密钥
ret = OH_CryptoSymKeyGenerator_Create("AES128", &ctx);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
ret = OH_CryptoSymKeyGenerator_Convert(ctx, &keyBlob, &keyCtx);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
// 设置参数
ret = OH_CryptoSymCipherParams_Create(¶ms);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
ret = OH_CryptoSymCipherParams_SetParam(params, CRYPTO_IV_DATABLOB, &ivBlob);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
// 加密
ret = OH_CryptoSymCipher_Create("AES128|CBC|PKCS7", &encCtx);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
ret = OH_CryptoSymCipher_Init(encCtx, CRYPTO_ENCRYPT_MODE, keyCtx, params);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
ret = OH_CryptoSymCipher_Final(encCtx, &contentBlob, &outUpdate);
if (ret != CRYPTO_SUCCESS) {
goto end;
}
encryptStr = dataBlobToString(env, outUpdate);
end:
OH_CryptoSymKeyGenerator_Destroy(ctx);
OH_CryptoSymKey_Destroy(keyCtx);
OH_CryptoSymCipherParams_Destroy(params);
OH_CryptoSymCipher_Destroy(encCtx);
OH_CryptoSymKey_Destroy(keyCtx);
OH_Crypto_FreeDataBlob(&keyBlob);
OH_Crypto_FreeDataBlob(&contentBlob);
OH_Crypto_FreeDataBlob(&outUpdate);
return encryptStr;
}
arkTs 侧调用上面 encrypt() 方法一直报错
更多关于HarmonyOS 鸿蒙Next native 侧进行加解密异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
打印出现乱码,是加密后的字符不是可读的字节,可使用BASE64编码一下
使用base64将加密后的数据编码下再打印试下呢?
参考这个:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-buffer
更多关于HarmonyOS 鸿蒙Next native 侧进行加解密异常的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next native侧进行加解密异常时,可能的原因及处理方式如下:
-
算法实现错误:
- 检查加密算法及其参数是否按标准实现,确保无逻辑错误。
-
密钥管理不当:
- 验证密钥的生成、存储、读取过程是否安全且无误。
- 确保密钥未被篡改或损坏。
-
内存操作问题:
- 检查加解密过程中涉及的内存分配与释放,避免内存泄漏或野指针。
-
硬件加速支持:
- 若使用硬件加速,确认硬件模块正常工作,驱动及接口调用无误。
-
API使用不当:
- 核对使用的加解密API是否正确,参数是否符合要求。
-
系统环境差异:
- 确认不同设备或系统版本间是否存在差异,导致加解密行为不一致。
-
调试与日志:
- 开启详细的调试信息,捕获异常时的调用栈及日志,以便精确定位问题。
若上述检查均无误,但问题依旧存在,可能是由于系统或框架层面的bug。此时,建议直接联系HarmonyOS官方客服以获取进一步的技术支持。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html