鸿蒙开发之AES加解密

        密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

简介

        这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一 [1]。

        该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhine doll"。)

剖析

        高级加密标准算法从很多方面解决了令人担忧的问题。实际上,攻击数据加密标准的那些手段对于高级加密标准算法本身并没有效果。如果采用真正的128位加密技术甚至256位加密技术,蛮力攻击要取得成功需要耗费相当长的时间。

        虽然高级加密标准也有不足的一面,但是,它仍是一个相对新的协议。因此,安全研究人员还没有那么多的时间对这种加密方法进行破解试验。我们可能会随时发现一种全新的攻击手段会攻破这种高级加密标准。至少在理论上存在这种可能性。

AES加密模式

        对称/分组密码一般分为流加密(如OFB、CFB等)和块加密(如ECB、CBC等)。对于流加密,需要将分组密码转化为流模式工作。对于块加密(或称分组加密),如果要加密超过块大小的数据,就需要涉及填充和链加密模式。

ECB(Electronic Code Book电子密码本)模式

ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

优点:

        1.简单; 2.有利于并行计算; 3.误差不会被传送; 缺点: 1.不能隐藏明文的模式; 2.可能对明文进行主动攻击; 因此,此模式适于加密小消息。

CBC(Cipher Block Chaining,加密块链)模式

优点:

        1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。 缺点: 1.不利于并行计算; 2.误差传递; 3.需要初始化向量IV

CFB(Cipher FeedBack Mode,加密反馈)模式

优点:

1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据; 缺点: 1.不利于并行计算; 2.误差传送:一个明文单元损坏影响多个单元; 3.唯一的IV;

OFB(Output FeedBack,输出反馈)模式

优点:

1.隐藏了明文模式; 2.分组密码转化为流模式; 3.可以及时加密传送小于分组的数据; 缺点: 1.不利于并行计算; 2.对明文的主动攻击是可能的; 3.误差传送:一个明文单元损坏影响多个单元 [4]。

鸿蒙加密

        首先引用 import cryptoFramework from '@ohos.security.cryptoFramework' 在cryptoFramework 创建 createSymKeyGenerator(通过指定算法名称的字符串,获取相应的对称密钥生成器实例。) 本例以AES 256为准。

注:AES 256的key和iv 都是32位为准 如果是AES 128的key 和 iv 是16位。

AES 256 加密 实例如下:

  /**
   * 加密
   * @param key
   * @param source
   */
  encrypt(source: String, key: string, iv: string): Promise<String> {
    let cipherAlgName = 'AES256|CBC|PKCS7';

    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES256);
    let ivParam: cryptoFramework.IvParamsSpec = {
      iv: { data: SecurityCommon.stringToUint8Array(iv, 32) },
      algName: "IvParamsSpec"
    }
    let cipher;
    return new Promise((resolve, reject) => {
      symKeyGenerator.convertKey({ data: SecurityCommon.stringToUint8Array(iv, 32) }).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
        }
        //创建cipher之后才能初始化
        return cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, symKey, ivParam)
          .then(() => {
            //创建cipher且初始化之后才能执行doFinal
            return cipher.doFinal({
              data: SecurityCommon.stringToUint8Array(source)
            })
          })
          .then(output => {
            let base64 = new util.Base64Helper();
            let result = base64.encodeToStringSync(output.data);
            return new Promise((resolve) => {
              resolve(result)
            })
          }).catch(e => {
            return new Promise((_, reject) => {
              reject(e)
            })
          })
      }).catch(e => {
        return new Promise((_, reject) => {
          reject(e)
        })

      }).then(result => {
        resolve(result)
      })
    })

  }

鸿蒙解密

        首先引用 import cryptoFramework from '@ohos.security.cryptoFramework' 在cryptoFramework 创建 createSymKeyGenerator(通过指定算法名称的字符串,获取相应的对称密钥生成器实例。) 本例以AES 256为准。

注:AES 256的key和iv 都是32位为准 如果是AES 128的key 和 iv 是16位。

AES 256 解密 实例如下:


  /**
   * aes 解密
   * @param message
   * @param key
   * @param iv
   * @param callback
   */
  decrypt(message: string, key: string, iv: string): Promise<String> {
    let cipherAlgName = 'AES256|CBC|PKCS7';

    let symKeyGenerator = cryptoFramework.createSymKeyGenerator(AES256);
    let ivParam: cryptoFramework.IvParamsSpec = {
      iv: { data: SecurityCommon.stringToUint8Array(iv, 32) },
      algName: "IvParamsSpec"
    }
    let cipher;
    return new Promise((resolve, reject) => {
      return symKeyGenerator.convertKey({
        data: SecurityCommon.stringToUint8Array(iv, 32)
      }).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(message);
            return cipher.doFinal({
              data: result
            })
          })
          .then(output => {
            let result = SecurityCommon.uint8ArrayToString(output.data)
            return new Promise((resolve) => {
              resolve(result)
            })
          }).catch(e => {
            return new Promise((_, reject) => {
              reject(e)
            })
          })
      }).catch(e => {
        reject(e)
      }).then(result => {
        resolve(result)
      })
    })

  }

字符串转无符号字节数组(Uint8Array)的方法 


  /**
   * 把String 转换为Uint8 数组
   * @param str
   * @returns
   */
  stringToUint8Array(str, len = null): Uint8Array {
    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);
  }

无符号字节数组 转换为字符串

  uint8ArrayToString(array: Uint8Array) {
    let arrayString = '';
    for (let i = 0; i < array.length; i++) {
      arrayString += String.fromCharCode(array[i]);
    }
    return arrayString;
  }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

fastadmin学习04-一键crud

FastAdmin 默认内置一个 test 表&#xff0c;可根据表字段名、字段类型和字段注释通过一键 CRUD 自动生成。 create table fa_test (id int unsigned auto_increment comment ID primary key,user_id int(10) default 0 null…

基础算法-去重字符串,辗转相除法,非递归前序遍历二叉树题型分析

目录 不同子串 辗转相除法-求最大公约数 二叉树非递归前序遍历 不同子串 从a开始&#xff0c;截取 a aa aaa aaab 从第二个下标开始a aa aab 从第三个 a ab 从第四个 b 使用set的唯一性&#xff0c;然后暴力遍历来去去重&#xff0c;从第一个下标开始截取aaab a aa aaa aaab…

代码随想录算法训练营第36天|738.单调递增的数字|968.监控二叉树|总结

代码随想录算法训练营第36天|738.单调递增的数字|968.监控二叉树|总结 738.单调递增的数字 https://programmercarl.com/0738.%E5%8D%95%E8%B0%83%E9%80%92%E5%A2%9E%E7%9A%84%E6%95%B0%E5%AD%97.html class Solution { public:int monotoneIncreasingDigits(int n) {string s…

R语言批量计算t检验,输出pvalue和均值

1.输入数据如下&#xff1a; 2.代码如下 setwd("E:/R/Rscripts/rG4相关绘图") # 读取CSV文件 data <- read.csv("box-cds-ABD-不同类型rg4-2.csv", stringsAsFactors FALSE)# 筛选出Type2列为指定五种类型的数据 filtered_data <- subset(data, …

【分类评估指标,精确率,召回率,】from sklearn.metrics import classification_report

from&#xff1a; https://zhuanlan.zhihu.com/p/368196647 多分类 from sklearn.metrics import classification_report y_true [0, 1, 2, 2, 2] y_pred [0, 0, 2, 2, 1] target_names [class 0, class 1, class 2] # print(classification_report(y_true, y_pred, targe…

学浪m3u8视频解密

学浪视频在网页上并不是mp4&#xff0c;而是以m3u8进行传输&#xff0c;使用m3u8可以有效解决服务器的压力&#xff0c;而且不仅仅是m3u8&#xff0c;还加密了key&#xff0c;需要逆向key算法得到真实key 下面是学浪m3u8视频解密的工具&#xff0c;全程自动化&#xff0c;不需…

MobileSAM 项目排坑

MobileSAM 项目排坑 任务过程记录创建环境交互式测试notebookV2测试 任务 把MobileSAM这个项目跑通&#xff0c;明天就可以集中学习SAM、MobileSAM、EfficientSAM和Segformer的论文和代码了。 过程记录 创建环境 老样子&#xff1a; git clone https://github.com/Chaonin…

《系统架构设计师教程(第2版)》第8章-系统质量属性与架构评估-01-软件系统质量属性

文章目录 1. 质量属性概念1.1 软件系统质量1.2 软件质量属性概述1.3 各生命周期的质量属性1.2.1 开发期质量属性1.2.2 运行期质量属性 2. 面向架构评估的质量属性2.1 性能(Performance)2.2 可靠性 (Reliability)2.2.1 容错2.2.2 健壮性 2.3 可用性 (Availability)2.4 安全性 (S…

macOS Sonoma如何查看隐藏文件

在使用Git进行项目版本控制时&#xff0c;我们可能会遇到一些隐藏文件&#xff0c;比如.gitkeep文件。它通常出现在Git项目的子目录中&#xff0c;主要作用是确保空目录也可以被跟踪。 终端命令 在尝试查看.gitkeep文件时&#xff0c;使用Terminal命令来显示隐藏文件 default…

c(RGDfK)-Biotin,生物素Biotin标记细胞穿膜环肽c(RGDfk)

c(RGDfK)-Biotin&#xff0c;生物素Biotin标记细胞穿膜环肽c&#xff08;RGDfk&#xff09; 中文名称 &#xff1a;生物素Biotin标记c&#xff08;RGDfk&#xff09;环肽 英 文 名 &#xff1a;c(RGDfK)-Biotin 品 牌 &#xff1a;Tanshtech 单字母&#xff1…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…

基于 RisingWave 和 ScyllaDB 构建事件驱动应用

概览 在构建事件驱动应用时&#xff0c;人们面临着两大挑战&#xff1a;1&#xff09;低延迟处理大量数据&#xff1b;2&#xff09;实现流数据的实时摄取和转换。 结合 RisingWave 的流处理功能和 ScyllaDB 的高性能 NoSQL 数据库&#xff0c;可为构建事件驱动应用和数据管道…

蓝桥杯 2022 省A 选数异或

一种比较无脑暴力点的方法&#xff0c;时间复杂度是(nm)。 (注意的优先级比^高&#xff0c;记得加括号(a[i]^a[j])x&#xff09; #include <iostream> #include <vector> #include <bits/stdc.h> // 包含一些 C 标准库中未包含的特定实现的函数的头文件 usi…

【ROS 笔记1】Topic message通俗理解

前言: topic 能够将所有的独立的模块, 进行有序的交流,链接。 可以想象, roscore, 假设是一个铁路系统的总的开关,当打开总的开关(run roscore), 铁路路就可以畅通起来, 铁路畅通后, 如何进行北京站(机器人recognition)与上海站(机器人抓取)的交流。 那么我们可以从…

Linux基础篇:解析Linux命令执行的基本原理

Linux 命令是一组可在 Linux 操作系统中使用的指令&#xff0c;用于执行特定的任务&#xff0c;例如管理文件和目录、安装和配置软件、网络管理等。这些命令通常在终端或控制台中输入&#xff0c;并以文本形式显示输出结果。 Linux 命令通常以一个或多个单词的简短缩写或单词…

C语言例4-36:求Fibonacci数列的前40个数

教材优化代码如下&#xff1a; //求Fibonacci数列的前40个数 #include<stdio.h> int main(void) {long int f11,f21;int i1;for(;i<20;i){printf("%15ld%15ld",f1,f2);if(i%20)printf("\n");f1f2;f2f1;}return 0; } 结果如下&#xff1a; 我的基…

最小可行架构实践:创建家庭保险聊天机器人——可持续架构(四)

前言 即使像聊天机器人这样的简单应用也需要一个最小可行产品&#xff08;MVP&#xff09;和最小可行架构&#xff08;MVA&#xff09;&#xff0c;因为正确开发聊天机器人应用并不容易&#xff0c;而开发失败可能会极大地影响客户满意度。MVP是产品开发策略的一个有用组成部分…

Adobe最近推出了Firefly AI的结构参考以及面向品牌的GenStudio

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

代码随想录Day22:二叉树Part8

Leetcode 235. 二叉搜索树最近公共祖先 讲解前&#xff1a; 这道题其实可以用完全一样的code和普通二叉树的公共祖先一样&#xff0c;得到答案&#xff0c;但是那样就完全没有用到BST的特性&#xff0c;我这里的解法其实也不知道是不是用到了BST的特性&#xff0c;我这里觉得…

linux离线安装jenkins及使用教程

本教程采用jenkins.war的方式离线安装部署&#xff0c;在线下载的方式会遇到诸多问题&#xff0c;不宜采用 一、下载地址 地址&#xff1a;Jenkins download and deployment 下载最新的长期支持版 由于jenkins使用java开发的&#xff0c;所以需要安装的linux服务器装有jdk环…
最新文章