基于SM4的文件加密解密功能实现(ECB模式)

上海张律师
• 阅读 3

​ ##HarmonyOS 应用开发##

先上一下效果

前置准备:有一个演示.txt文件,我提前下载到了手机上,里面的内容是“测试内容,今天天气很好”。

进入“文件加密”页面,选择文件后,显示文件内容,输入密钥后,点击加密,显示加密后内容,并可以保存到文件里

进入“文件解密”页面,选择文件后,显示加密后的文件内容,输入密钥,点击解密,显示解密后内容,并可以保存到文件里

两个页面的截图如下: 基于SM4的文件加密解密功能实现(ECB模式))基于SM4的文件加密解密功能实现(ECB模式)

相关技术实现思路如下:

一、SM4加密解密

大部分的代码官网都有,我这里先介绍一下我的开发中踩坑的记录

如果看官方文档里的代码,你会发现,他对于加密解密的演示,是直接把加密后的结果,扔给解密的代码的。

基于SM4的文件加密解密功能实现(ECB模式)

如果直接拿来用的话,问题是……encryptText,他不是一个string,而是cryptoFramework.DataBlob

如果要把这个解密后的内容,显示给用户看的话,看文档的意思就是encryptText.data.toString(),所以我就通过encryptText.data.toString()获取了加密后的文字内容,并保存到了文件里。

但是解密的时候,我按照文档里的代码,输入这个解密后的文字内容,但是提示错误,是doFinal()这一步的报错,但是我在文档里都看不到具体这个报错对应的错误原因是什么……

后来在开发群里,有幸得到了大佬的指点

大佬的原话如下: “你输出的是hex 那么 在入参的时候也需要将hex转换成unit8Array 类型要匹配”

“不能输出的是hex 解密的时候又传入了base64但是还用hex格式解”

然后再回头自己的代码

我是把加密后的数据,直接转成了string输出并保存,然后再把这个string进行解密。但是对于这个string,我并没有去指定具体是什么格式的,是utf-8,还是啥,都没有指定。

在大佬的指点下,我把代码进行了修改

整体的逻辑是:

输入要加密的文字内容 + 密钥(密钥的处理直接用示例代码里的即可)

把输出的加密内容,转成hex格式,但是hex格式用户看不了(是乱码),所以hex再转成base64输出,并保存到文件里

解密的时候,先把base64解码后以string格式输出,然后再把这个string转成hex格式以后进行解密

这样一来,加密的时候,实际输出的是hex(只不过为了方便用户看进行了base64编码),输入到解密里的时候,也是hex(从base64转到hex),输入和输出的格式一致,解密成功

加密解密的代码如下:

// 加密消息。 export async function encryptMessagePromise(symKey: string, message: string) { let Key = await genSymKeyByData(new Uint8Array(buffer.from(symKey, 'utf-8').buffer)); let plainText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(message, 'utf-8').buffer) }; let cipher = cryptoFramework.createCipher('SM4_128|ECB|PKCS7'); await cipher.init(cryptoFramework.CryptoMode.ENCRYPT_MODE, Key, null); let encryptData = await cipher.doFinal(plainText); let a1 = buffer.from(encryptData.data).toString('hex'); let a2 = buffer.from(a1).toString("base64"); return a2; }

// 解密消息。 export async function decryptMessagePromise(symKey: string, message: string) { let Key = await genSymKeyByData(new Uint8Array(buffer.from(symKey, 'utf-8').buffer)); let base64 = new util.Base64Helper(); let textDecoder: util.TextDecoder = util.TextDecoder.create(); let result: string = textDecoder.decodeToString(base64.decodeSync(message),{stream:true}); let cipherText: cryptoFramework.DataBlob = { data: new Uint8Array(buffer.from(result, 'hex').buffer) }; let decoder = cryptoFramework.createCipher('SM4_128|ECB|PKCS7'); await decoder.init(cryptoFramework.CryptoMode.DECRYPT_MODE, Key, null); let decryptData = await decoder.doFinal(cipherText); let a1 = buffer.from(decryptData.data).toString('utf-8'); return a1; }

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
DES与RSA加解密
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。大体上分为双向加密 和单向加密 ,而双向加密又分为对称加密 和非对称加密(有些资料将加密直接分为对称加密和非对称加密)。 双向加密大体意思就是明文加密后形成密文,可以通过算法还原成明文。而
Stella981 Stella981
3年前
Spring Boot 实现配置文件加解密原理
SpringBoot配置文件加解密原理就这么简单背景接上文《失踪人口回归,mybatisplus3.3.2发布》\1\,提供了一个非常实用的功能「数据安全保护」功能,不仅支持数据源的配置加密,对于springboot全局的yml/properties文件均可实现敏感信息加密功能,在一定的程度上控制开发人员流动导致
Wesley13 Wesley13
3年前
SCP和SFTP相同点和区别
都是使用SSH协议来传输文件的。不用说文件内容,就是登录时的用户信息都是经过SSH加密后才传输的,所以说SCP和SFTP实现了安全的文件传输。SCP和CP命令相似,SFTP和FTP的使用方法也类似。SCP和SFTP的共同之处在于「使用SSH将文件加密才传输的」使用「WinSCP」或者「FileZilla」之类的客户端,还可以和Windows之间进行文
Stella981 Stella981
3年前
API加密框架Monkey
框架介绍monkeyapiencrypt是我之前写的一个API加密的框架,主要是将加密/解密的逻辑交给框架实现,等数据到达Controller后自动解密了,让开发人员不需要关注数据的加解密操作。Github:https://github.com/yinjihuan/monkeyapiencrypt\1\!(ht
Wesley13 Wesley13
3年前
Go加密解密之DES
一、DES简介DES(DataEncryptionStandard)是对称加密算法,也就是加密和解密用相同的密钥。其入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解
Wesley13 Wesley13
3年前
16进制显示文件内容
include <iostreaminclude <stdio.husing namespace std;define BUFF_SIZE 20int main (){FILE fp;fp  fopen("epp370p0190_0408.13
Stella981 Stella981
3年前
Linux下DES安全通信编程
des.h///文件名:des.h/功能: 实现DES加密算法的加密解密功能    for linux/
Easter79 Easter79
3年前
This file has expired
错误如下:Fatalerror:Thisfilehasexpired.in/var/www/html/dispatch86/index.phponline0原因:该文件为Zend加密过得文件。ZendSafeguardStdio在加密文件的时候可以设置一个过期时间。解决方法:将文件重新加密。\
Stella981 Stella981
3年前
PostgreSQL备份加密方法
本文加密方式是在利用pg\_dump备份出文件后直接利用openssl进行文件加密。1、生产密钥:   利用各种参数进行建立公私密钥,这里利用输入参数作为密钥生成的一部分,其他的可以手动添加,脚本如下:sure@localhostbin$catcreatepem.sh!/bin/bashda
Stella981 Stella981
3年前
Qt编写项目作品27
一、功能特点1.多线程收发文件,支持加密传输。2.接收端支持监听端口接收文件和主动连接服务器接收文件两种方式。3.按照文件开始符文件大小文件内容文件结束符逐个分包接收。4.可对接收的加密过的文件包进行解密输出。5.如果采用连接服务器方式接收文件可指定请求文件。6.接收端请求文件的形式可以作为通用的