# 鸿蒙ArkTS Api9 AES ECB 加密

news2024/12/23 11:20:18

鸿蒙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.coloradmin.cn/o/1101035.html

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

相关文章

思维训练1

题目描述2 Problem - A - Codeforces ​ 题目分析 思路一&#xff1a; 由于是连续的数&#xff0c;我们可以使用f1, f2, f3来记录连续数的开头数字&#xff0c;只可能有三种情况 ①开头数为第一个数-1 ②开头数为第一个数 ③开头数为第一个数1 分别观察这三个情况&…

osWorkflow-1——osWorkflow官网例子部署启动简单使用(版本:OSWorkflow-2.8.0)

osWorkflow-1——osWorkflow官网例子部署启动简单使用&#xff08;版本&#xff1a;OSWorkflow-2.8.0&#xff09; 1. 前言——准备工作1.1 下载相关资料1.2 安装翻译插件 2. 开始搞项目2.1 解压 .zip文件2.2 简单小测&#xff08;war包放入tomcat&#xff09;2.3 导入项目到 I…

2023年信息科学与工程学院学生科协第一次软件培训

2023年信息科学与工程学院学生科协第一次软件培训 文章目录 2023年信息科学与工程学院学生科协第一次软件培训运行第一个代码&#xff08;“Hello World&#xff01;”&#xff09;初识C语言代码的具体结构头文件(主)函数 输入与输出scanf函数printf函数转义字符 变量的定义进一…

如何选择全面型企业备份软件以提高数据可用性?

通常&#xff0c;备份数据是指服务器正在运行的工作负载所需的所有数据。这可以包括文档、媒体文件、配置文件、机器映像、操作系统和注册表文件。本质上&#xff0c;您想要保留的任何数据都可以存储为备份数据。 在日益数字化的商业环境中&#xff0c;数据备份对于组织的生存…

C语言复杂表达式与指针高级

一、指针数组与数组指针 1.指针数组VS数组指针 &#xff08;1&#xff09;指针数组&#xff1a;实质是一个数组&#xff0c;因为这个数组中传参的内容全部是指针变量。 &#xff08;2&#xff09;数组指针&#xff1a;实质是一个指针&#xff0c;这个指针指向一个数组 2.分析指…

C语言,打印指定大小的X

要打印一个X&#xff0c;无非是在一个二维数组一个矩形中操作&#xff0c;将不是X的部分赋值为空格字符&#xff0c;将是X部分打印为*字符。 矩形的边长就是输入的n&#xff0c;由于矩形的边长是不固定的&#xff0c;所以要找到应该被赋值为*的坐标之间有什么数学关系。 以矩…

宏电股份AI BOX新产品首次亮相2023中国移动全球合作伙伴大会,以创新性AI、5G技术推动数实共生

10月11-13日&#xff0c;2023中国移动全球合作伙伴大会在广州开幕&#xff0c;本次大会以“算启新程&#xff0c;智享未来”为主题&#xff0c;作为中国移动多年来的重要合作伙伴&#xff0c;宏电股份AI BOX新产品在大会上首次精彩亮相&#xff0c;并重点展示了5G Redcap工业智…

格雷码加相移三维重建

之前所做的三维重建系统基本上都是基于多频率外差 的方法 &#xff08;交流方式可以点这个链接&#xff09;&#xff0c;最近整理了一下格雷码加相移的算法&#xff0c;与多频外差相比格雷码在对反光物体的重建效果稍微好一点&#xff0c;也可以投诉更少的图像 。采用6介互补格…

Python使用Selenium库如何绕过Cloudflare验证,网页请确认你是不是机器人

大家好&#xff0c;我是淘小白~ 前段时间使用selenium库写chatGPT的脚本&#xff0c;遇到过一个问题&#xff0c;那就是cloudflare的机器验证&#xff0c;让你点击确认不是机器人&#xff0c;这个问题最后找人解决掉了&#xff0c;我也是百度了很久没找到答案&#xff0c;B站找…

053:mapboxGL中sources的6种类型及各类型的示例代码

第053个 点击查看专栏目录 本篇文章是mapbox的source的归纳总结。 mapbox中 sources 是什么 sources:数据源集合(必填,用于包含一系列数据源 source,这些数据源提供了在地图上显示的数据) sources 是对象 {} 的形式,其属性名就是 数据源的名称(或者说 数据源的 id),…

网络基础初谈

0.一些无关紧要的心里话 ​ 一转眼学习计算机知识已经一年多了&#xff0c;中间起起伏伏&#xff0c;断断续续&#xff0c;但还算好也是坚持到了今天&#xff0c;之所以把这些基础知识写成一个系列&#xff0c;一方面方便知识巩固&#xff0c;另一方面至少还有三三两两的几个朋…

Linux命令之chpasswd命令

一、chpasswd命令简介 chpasswd命令用于同时更改多个用户的密码。它可以从标准输入或指定的文件中读取用户名和密码的组合&#xff0c;并将其应用于系统中的用户。chpasswd命令通常用于批量更改用户密码&#xff0c;特别是在自动化脚本或批处理任务中&#xff0c;该命令需要roo…

ERP系统供应商协同:优化企业供应链管理

一、ERP系统供应商协同的概念和功能 供应商协同是指在供应链中&#xff0c;企业与供应商之间通过ERP系统进行紧密合作和信息共享&#xff0c;实现供应链各个环节的协调和优化。ERP系统供应商协同功能涉及以下方面&#xff1a; 1. 供应商管理&#xff1a;ERP系统提供完善的供应…

华为云云耀云服务器L实例评测|windows系统3389防爆破之安全加固教程

为什么要选择华为云云耀云服务器L实例&#xff1a; 华为云在全国范围内建立了多个数据中心&#xff0c;这些数据中心之间相互冗余&#xff0c;以确保高可靠性和可用性&#xff0c;用户可以选择最适合的区域来部署应用程序&#xff0c;以实现更好的性能和延迟。 相对于传统的物…

选择什么电容笔比较好?平板手写笔推荐

由于苹果Pencil的热销&#xff0c;让华国内市场上&#xff0c;也出现了不少的平替式电容笔&#xff0c;这些产品&#xff0c;有好有坏&#xff0c;价格也很公道。不过&#xff0c;也有很多产品的价格都很平价。我是一个拥有多年经验的数码发烧友&#xff0c;在前几年就开始用上…

docker安装和docker安装RabbitMQ

docker安装 执行命令&#xff0c;先查看是否有Docker docker --version 如果想要删除&#xff1a;yum -y remove docker-ce 如果没有需要安装&#xff1a; 1.执行命令&#xff0c;实现Docker安装 yum install -y yum-utils yum-config-manager --add-repo http://mirrors.…

数组模拟堆实现堆排序

文章目录 QuestionIdeasCode Question 输入一个长度为 n 的整数数列&#xff0c;从小到大输出前 m 小的数。 输入格式 第一行包含整数 n 和 m 。 第二行包含 n 个整数&#xff0c;表示整数数列。 输出格式 共一行&#xff0c;包含 m 个整数&#xff0c;表示整数数列中前 m …

如何选择安全可靠的跨网文件安全交换一体机?

各行各业为了保护核心数据&#xff0c;绝大多数企业采取的第一个步骤是将企业内网与互联网进行隔离&#xff0c;将内部数据“困在”内网&#xff0c;同时也能够有效屏蔽外部网络攻击的风险。较大规模的企业&#xff0c;比如金融、政府、集成电路等行业机构&#xff0c;还可能对…

UE5----使用C++的项目重新打开后东西丢失

最近开始学习c编写代码&#xff0c;发现在场景里放置了Actor后&#xff0c;第二天打开项目&#xff0c;场景里边的放的球啊啥的东西没有了&#xff0c;蓝图类也丢失了父类。 解决方案&#xff1a; 不在Epic里打开虚幻引擎&#xff0c;在VS中打开。点击这个小绿三角&#xff0…

河北吉力宝:多维发力走创新智能鞋业道路

在快速发展的时代潮流中&#xff0c;智能科技正在改变我们的生活方式&#xff0c;消费者的选择更加多元化&#xff0c;以及制鞋行业同质化竞争严重等多重不利因素的影响&#xff0c;我国制鞋行业竞争加剧&#xff0c;各制鞋企业也在不断探索新市场&#xff0c;进一步拓展市场空…