# 鸿蒙ArkTS Api9 AES ECB 加密

鸿蒙ArkTS Api9 AES ECB 加密

由于鸿蒙ArkTS是javascript编写的,因此总是感觉会被抓包破解了,不过这个问题通过提了个工单问了一下,目前鸿蒙编译完成之后的包是无法获取到其内部代码的。因此就能够放心的把加密的密钥给扔在里边了。
所以研究了一下目前的鸿蒙加密算法怎么实现。
以下以 AES 128位 ECB 模式 加密为例。
密钥不足的时候以 0x00 填充。

加解密算法库框架

加解密算法库框架开发指导

参考文档

加密部分

结合当前鸿蒙的编码方式,代码流程如下:

  1. 转换可用密钥
  2. 根据密钥生成加密器
  3. 加密

整体代码如下:

import cryptoFramework from '@ohos.security.cryptoFramework';
import util from '@ohos.util';// 把密钥、明文等转换成输入数据需要的格式
function stringToUint8Array(str, len=null) {let arr = [];if (len == null) {len = str.length}for (let i = 0; i < len; i++) {if (str.length > i) {arr.push(str.charCodeAt(i))} else {arr.push(0)}}return new Uint8Array(arr);
}// promise形式调用
function aesECBEncrypt(plaintext, key) {let cipherAlgName = 'AES128|ECB|PKCS7';let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')var cipher;// 生成密钥return symKeyGenerator.convertKey({data: stringToUint8Array(key, 16)}).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.ENCRYPT_MODE, symKey, null).then(() => {// 开始加密return cipher.doFinal({data: stringToUint8Array(plaintext)})}).then(output => {let base64 = new util.Base64Helper();let result = base64.encodeToStringSync(output.data);return new Promise((resolve) => {resolve(result)})}).catch(err => {return new Promise((_, reject) => {reject(err)})})}).catch(err => {return new Promise((_, reject) => {reject(err)})})
}

调用方式:

aesECBEncrypt('000','1111').then(res=>{console.log('aesECBEncrypt is ' + res)
}).catch(err => {console.log('aesECBEncrypt catch ' + err)
})// ===> v0ADs4+sKsM2FOdqz9rCQw==

解密部分

结合当前鸿蒙的编码方式,代码流程如下:

  1. 转换可用密钥
  2. 根据密钥生成加密器
  3. 解密

整体代码如下:

import cryptoFramework from '@ohos.security.cryptoFramework';
import util from '@ohos.util';// 解密内容转换成字符串
function uint8ArrayToString(array) {let arrayString = '';for (let i = 0; i < array.length; i++) {arrayString += String.fromCharCode(array[i]);}return arrayString;
}function aesECBDecrypt(encrypttext, key) {let cipherAlgName = 'AES128|ECB|PKCS7';let symKeyGenerator = cryptoFramework.createSymKeyGenerator('AES128')var cipher;return symKeyGenerator.convertKey({data: stringToUint8Array(key, 16)}).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, null).then(() => {let base64 = new util.Base64Helper();let result = base64.decodeSync(encrypttext);return cipher.doFinal({data: result})}).then(output => {let result = uint8ArrayToString(output.data)return new Promise((resolve) => {resolve(result)})}).catch(err => {return new Promise((_, reject) => {reject(err)})})}).catch(err => {return new Promise((_, reject) => {reject(err)})})
}

调用方式如下:

aesECBDecrypt('v0ADs4+sKsM2FOdqz9rCQw==','1111').then(res=>{console.log('aesECBDecrypt is ' + res)
}).catch(err => {console.log('aesECBDecrypt catch ' + err)
})

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DAY 1 QT 创建QQ界面

#include "mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent) {//创建一个窗口&#xff0c;改变窗口标签名和窗口标签图标this -> resize(640,500);//设置窗口界面大小this -> setWindowTitle("QQ登录");//设置窗口标题this -> s…

文件传输软件的挑战与发展趋势

无论是在教育、医疗、金融、媒体、政府等行业&#xff0c;还是在个人生活和工作中&#xff0c;文件传输软件都有着广泛的应用价值和意义。然而&#xff0c;随着信息技术的发展和数据量的增长&#xff0c;文件传输软件也面临着一些挑战和问题&#xff0c;同时也有着一些发展趋势…

weapp-tailwindcss for uni-app 样式条件编译语法插件

weapp-tailwindcss for uni-app 样式条件编译语法插件 版本需求 2.10.0 weapp-tailwindcss for uni-app 样式条件编译语法插件 这是什么玩意?如何使用 tailwind.config.js 注册postcss 插件注册 uni-app vite vue3uni-app vue2 配置完成 配置项 这是什么玩意? 在 uni-app …

如何在小程序中设置页面显示的文字

不同商家&#xff0c;对于小程序有不同的要求。所以&#xff0c;小程序应该支持商家在后台灵活配置小程序各个页面的文字显示。下面具体介绍如何显示各个页面的文字。 朋友圈分享图文字&#xff1a;会显示在朋友圈海报顶部 升级会员提示&#xff1a;对于普通会员&#xff0c;在…

Ansible定义命令行、主机/主机组、playbook等变量,注册变量和vars_prompt的用法示例

目录 一.Ansible定义变量 1.用途 2.定义规则 3.变量优先级 二.命令行定义变量 三.定义主机和主机组变量 1.主机变量 &#xff08;1&#xff09;内置主机变量 &#xff08;2&#xff09;简单示例 2.主机组变量 四.定义playbook变量 1.通过vars表示定义变量&#xff…

redis问题汇总

文章目录 一.redis的优点二.redis的数据结构三.redis分布式锁是怎么回事&#xff1f;四.redis里面有1亿个key&#xff0c;其中有10w个key是以某个固定前缀开头的&#xff0c;如何将他们全部找出来&#xff1f;五.如何使用redis作异步队列六.如果有大量的key需要设置同一过期时间…

C++ —— Tinyxml2在Vs2017下相关使用2(较文1更复杂,附源码)

相关链接 C —— Tinyxml2在Vs2017下相关使用1&#xff08;附源码&#xff09; tinyxml2简介 TinyXML2是一个简单&#xff0c;小巧&#xff0c;高效&#xff0c;CXML解析器&#xff0c;可以很容易地集成到其他程序中。TinyXML-2解析一个XML文档&#xff0c;并从中构建一个 可以…

基于Scrapyd与Gerapy部署scrapy爬虫方案【可用于分布式爬虫部署】

scrapyd部署爬虫 Scrapyd 是一个基于 Scrapy 的开源项目&#xff0c;它提供了一个简单的方式来部署、运行和监控 Scrapy 爬虫。它是一个用于集成 Scrapy 爬虫到分布式架构中的工具&#xff0c;允许您在分布式环境中运行爬虫&#xff0c;并提供了一组 Web API&#xff0c;用于管…

大模型LLM相关面试题整理-训练集-训练经验-微调

3 大模型&#xff08;LLMs&#xff09;微调 3.1 如果想要在某个模型基础上做全参数微调&#xff0c;究竟需要多少显存&#xff1f; 要确定全参数微调所需的显存量&#xff0c;需要考虑以下几个因素&#xff1a; 模型的大小&#xff1a;模型的大小是指模型参数的数量。通常&…

Spring()

一、导学 二、 1.入门程序 spring快照版本是最新的版本&#xff0c;未发布。需要用到<repository></> 下面这个不需要配置仓库&#xff0c;直接写在依赖中就行 引入spring相关依赖 <?xml version"1.0" encoding"UTF-8"?> <proje…

(Python) Python中三种时间格式的转换方法

1. 时间元组 1.1. 时间元组和时间戳的互相转化 import time,datetime # 获取当前时间的时间元组 t time.localtime() print(t) # 时间元组转时间戳 timestamp time.mktime(t) print(timestamp) # time.struct_time(tm_year2019, tm_mon10, tm_mday23, tm_hour23, tm_min15,…

中国移动集采120万部,助推国产5G赶超iPhone15

近期媒体纷纷传出消息指中国移动将大规模集采&#xff0c;预计将采购国产5G手机120万台&#xff0c;加上另外两家运营商的集采数量&#xff0c;估计集采数量可能达到300万部&#xff0c;如此将有助于它在国内高端手机市场赶超苹果。 国产5G手机在8月底突然上市&#xff0c;获益…

python+pytest接口自动化 —— 参数关联

什么是参数关联&#xff1f; 参数关联&#xff0c;也叫接口关联&#xff0c;即接口之间存在参数的联系或依赖。在完成某一功能业务时&#xff0c;有时需要按顺序请求多个接口&#xff0c;此时在某些接口之间可能会存在关联关系。 比如&#xff1a;B接口的某个或某些请求参数是…

攻防演练蓝队|Windows应急响应入侵排查

文章目录 日志分析web日志windows系统日志 文件排查进程排查新增、隐藏账号排查启动项/服务/计划任务排查工具 日志分析 web日志 dirpro扫描目录&#xff0c;sqlmap扫描dvwa Python dirpro -u http://192.168.52.129 -b sqlmap -u "http://192.168.52.129/dvwa/vulnera…

了解容器运行时安全:保护你的容器应用

前言 容器是一种虚拟化技术&#xff0c;用于封装和运行应用程序及其依赖项&#xff0c;以便在不同的计算环境中保持一致性和可移植性。自2013年容器诞生至今&#xff0c;容器Docker镜像的下载量超20亿&#xff0c;虽然容器行业发展如火如荼&#xff0c;但是其安全风险却不容乐…

input的一些输入限制

1、input输入框只能输入正整数和0 <el-input v-model"value"onkeyup"value(value.replace(/\D/g,)?:parseInt(value))"placeholder"请输入设备数量" /> 1-1、只能输入大于0的正整数 valuevalue.replace(/^0|[^0-9]/g, ) 2、input输入…

Tips linux如何获取当前连接的ssh用户信息

linux ubuntu debian如何获取当前连接的ssh用户信息 这里需要用到一个常用的网络工具netstat&#xff0c;如果没有这个软件可以通过下边的命令安装&#xff1a; sudo apt-get install net-tools安装完成后通过下边的指令获取ssh所有连接用户&#xff1a; netstat -al|grep s…

EKP接口开发Webservice服务和Restservice服务以及定时任务Demo

继承com.landray.kmss.sys.webservice2.interfaces.ISysWebservice&#xff0c;同时在接口上使用WebService注解将其标识为WebService接口 package com.landray.kmss.third.notify.webservice;import com.alibaba.fastjson.JSONObject; import com.landray.kmss.sys.webservic…

杭电oj--计算两点间的距离

Problem Description 输入两点坐标&#xff08;X1,Y1&#xff09;,&#xff08;X2,Y2&#xff09;,计算并输出两点间的距离。 Input 输入数据有多组&#xff0c;每组占一行&#xff0c;由4个实数组成&#xff0c;分别表示x1,y1,x2,y2,数据之间用空格隔开。 Output 对于每组输…

自动存储、静态存储和动态存储

目录 1.自动存储 2.静态存储 3.动态存储&#xff08;自由存储空间free store或堆heap&#xff09; 4.线程存储&#xff08;C11新增&#xff09; 根据用于分配内存的方法&#xff0c;C有3种管理数据内存的方式&#xff1a; 1.自动存储 在函数内部定义的常规变量使用自动存…