电子说
今天是对加解密通用函数的深度解读,我将详细讲解,建议收藏,不可错过。
1、加解密概述
加解密算法是保证数据安全的基础技术,无论是在数据传输、存储,还是用户身份验证中,都起着至关重要的作用.随着互联网的发展和信息安全威胁的增加,了解并掌握常用的加解密算法已经成为开发者和安全从业者的必修课.
常见的15种加密解密算法分别是:
散列哈希[MD5、SHA1、CRC32],对称[DES,3DES(TDEA、TripleDES),AES,Blowfish,RC4、RC5,IDEA],Base64、Rabbit、Escape。
三种分类:
1.1 对称加密
对称加密是指加密和解密使用同一个密钥的加密方法.由于加密和解密过程中的密钥相同,因此需要在通信双方之间安全地共享密钥.对称加密的速度较快,适合用于大量数据的加密.
1.2 非对称加密
非对称加密算法采用一对密钥:公钥和私钥.公钥用于加密,私钥用于解密.由于加密和解密使用不同的密钥,非对称加密算法解决了密钥分发的问题,是当前加密系统中安全性最高的加密技术之一.
1.3 Hash算法
这是一种不可逆的算法,它常用于验证数据的完整性。
2、请输入标题
本文章通过Air780的核心板烧录LuatOS示例代码,来演示有关加解密的各种API的功能。
最新源码下载:
https://gitee.com/openLuat/LuatOS-Air780E/tree/master/demo/crypto
API的具体用法,读者可以参考本文中的"五、API说明"。
3、硬件准备
3.1 Air780E核心板
使用Air780E核心板,如下图所示:
此核心板的详细使用说明参考:
https://docs.openluat.com/air780e/product/
Air780E产品手册中的《开发板Core_Air780E使用说明VX.X.X.pdf》,写这篇文章时最新版本的使用说明为:《开发板Core_Air780E使用说明V1.0.5.pdf》;核心板使用过程中遇到任何问题,可以直接参考这份使用说明pdf文档。
3.2 SIM卡
中国大陆环境下,可以上网的sim卡,一般来说,使用移动,电信,联通的物联网卡或者手机卡都行。
3.3 PC电脑
WINDOWS系统。
3.4 数据通信线
带TYPE-C口的USB数据线。
4、软件环境
4.1 Luatools工具
要想烧录LuatOS到4G模组中,需要用到的调试工具:Luatools
详细使用说明参考:
Luatools工具使用说明
https://docs.openluat.com/Luatools/
Luatools工具集具备以下几大核心功能:
一键获取最新固件:自动连接服务器,轻松下载最新的模组固件.
固件与脚本烧录:便捷地将固件及脚本文件烧录至目标模组中.
串口日志管理:实时查看模组通过串口输出的日志信息,并支持保存功能.
串口调试助手:提供简洁的串口调试界面,满足基本的串口通信测试需求.
Luatools下载之后,新建一个命名为"Luatools"的文件夹,将下载的Luatools_v3.exe拷贝或移动到新建的Luatools文件夹内,点击Luatools_v3.exe即可运行。
4.2 准备需要烧录的代码
首先要说明一点:脚本代码,要和固件的soc文件一起烧录。
4.2.1 烧录的底层固件文件
底层core下载地址:
LuatOS固件版本下载地址
https://docs.openluat.com/air780e/luatos/firmware/
Air780E的底层固件在Luatools解压后目录的:
LuatOS-SoC_V1112_EC618_FULL.soc
4.2.2 烧录的脚本代码
首先要下载Air780的LuatOS示例代码到一个合适的项目目录,示例代码网站:
https://gitee.com/openLuat/LuatOS-Air780E
下载流程参考下图:
下载的文件解压,找到
LuatOS-Air780E-masterdemocryptomain.lua,如图:
5、API说明
5.1 crypto.md5(str)
计算md5值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的md5值的hex字符串 |
例子
5.2 crypto.hmac_md5(str,key)
计算hmac_md5值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
string |
密钥 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的hmac_md5值的hex字符串 |
例子
5.3 crypto.sha1(str)
计算sha1值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的sha1值的hex字符串 |
例子
5.4 crypto.hmac_sha1(str,key)
计算hmac_sha1值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
string |
密钥 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的hmac_sha1值的hex字符串 |
例子
5.5 crypto.sha256(str)
计算sha256值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的sha256值的hex字符串 |
例子
5.6 crypto.hmac_sha256(str,key)
计算hmac_sha256值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
string |
密钥 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的hmac_sha256值的hex字符串 |
例子
5.7 crypto.sha512(str)
计算sha512值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的sha512值的hex字符串 |
例子
5.8 crypto.hmac_sha512(str,key)
计算hmac_sha512值
参数
传入值类型 | 解释 |
---|---|
string |
需要计算的字符串 |
string |
密钥 |
返回值
返回值类型 | 解释 |
---|---|
string |
计算得出的hmac_sha512值的hex字符串 |
例子
5.9 crypto.base64_encode(data)
将数据进行base64编码
参数
传入值类型 | 解释 |
---|---|
string |
待编码的数据 |
返回值
返回值类型 | 解释 |
---|---|
string |
编码后的数据 |
例子
5.10 crypto.base64_decode(data)
将数据进行base64解码
参数
传入值类型 | 解释 |
---|---|
string |
待解码的数据 |
返回值
返回值类型 | 解释 |
---|---|
string |
解码后的数据 |
例子
5.11 crypto.cipher_list()
获取当前固件支持的cipher列表
参数
无
返回值
返回值类型 | 解释 |
---|---|
table |
本固件支持的cipher列表,字符串数组 |
例子
5.12 crypto.cipher_suites()
获取当前固件支持的ciphersuites列表
参数
无
返回值
返回值类型 | 解释 |
---|---|
table |
本固件支持的ciphersuites列表,字符串数组 |
例子
5.13 crypto.cipher_encrypt(type,padding,str,key,iv)
对称加密
参数
传入值类型 | 解释 |
---|---|
string |
算法名称,例如AES-128-ECB/AES-128-CBC, 可查阅crypto.cipher_list() |
string |
对齐方式, 支持PKCS7/ZERO/ONE_AND_ZEROS/ ZEROS_AND_LEN/NONE |
string |
需要加密的数据 |
string |
密钥,需要对应算法的密钥长度 |
string |
IV值,非ECB算法需要 |
返回值
返回值类型 | 解释 |
---|---|
string |
加密后的字符串 |
例子
5.14 crypto.cipher_decrypt(type,padding,str,key,iv)
对称解密
参数
传入值类型 | 解释 |
---|---|
string |
算法名称,例如AES-128-ECB/AES-128-CBC,可查阅crypto.cipher_list() |
string |
对齐方式,支持PKCS7/ZERO/ONE_AND_ZEROS/ZEROS_AND_LEN/NONE |
string |
需要解密的数据 |
string |
密钥,需要对应算法的密钥长度 |
string |
IV值,非ECB算法需要 |
返回值
返回值类型 | 解释 |
---|---|
string |
解密后的字符串 |
例子
5.15 crypto.crc16
(method,data,poly,initial,finally,inReversemoutReverse)
计算CRC16
参数
传入值类型 | 解释 |
---|---|
string |
CRC16模式(”IBM”,”MAXIM”,”USB”,”MODBUS”,”CCITT”,”CCITT-FALSE”,”X25”,”XMODEM”,”DNP”,”USER-DEFINED”) |
string |
字符串 |
int |
poly值 |
int |
initial值 |
int |
finally值 |
int |
输入反转,1反转,默认0不反转 |
int |
输入反转,1反转,默认0不反转 |
返回值
返回值类型 | 解释 |
---|---|
int |
对应的CRC16值 |
例子
5.16 crypto.crc16_modbus(data,start)
直接计算modbus的crc16值
参数
传入值类型 | 解释 |
---|---|
string |
数据 |
int |
初始化值,默认0xFFFF |
返回值
返回值类型 | 解释 |
---|---|
int |
对应的CRC16值 |
例子
5.17 crypto.crc32(data)
计算crc32值
参数
传入值类型 | 解释 |
---|---|
string |
数据 |
返回值
返回值类型 | 解释 |
---|---|
int |
对应的CRC32值 |
例子
5.18 crypto.crc8(data,poly,start,revert)
计算crc8值
参数
传入值类型 | 解释 |
---|---|
string |
数据 |
int |
crc多项式,可选,如果不写,将忽略除了数据外所有参数 |
int |
crc初始值,可选,默认0 |
boolean |
是否需要逆序处理,默认否 |
返回值
返回值类型 | 解释 |
---|---|
int |
对应的CRC8值 |
例子
5.19 crypto.crc7(data,poly,start)
计算crc7值
参数
传入值类型 | 解释 |
---|---|
string |
数据 |
int |
crc多项式,可选,默认0xE5 |
int |
crc初始值,可选,默认0x00 |
返回值
返回值类型 | 解释 |
---|---|
int |
对应的CRC7值 |
例子
5.20 crypto.checksum(data,mode)
计算checksum校验和
参数
传入值类型 | 解释 |
---|---|
string |
待计算的数据,必选 |
int |
模式,累加模式,0-异或,1-累加,默认为0 |
返回值
返回值类型 | 解释 |
---|---|
int |
checksum值,校验和 |
例子
5.21 crypto.trng(len)
生成真随机数
参数
传入值类型 | 解释 |
---|---|
int |
数据长度 |
返回值
返回值类型 | 解释 |
---|---|
string |
指定随机数字符串 |
例子
5.22 crypto.totp(secret,time)
计算TOTP动态密码的结果
参数
传入值类型 | 解释 |
---|---|
string |
网站提供的密钥(就是BASE32编码后的结果) |
int |
可选,时间戳,默认当前时间 |
返回值
返回值类型 | 解释 |
---|---|
int |
计算得出的六位数结果计算失败返回nil |
例子
5.23 crypto.md_file(tp,path,hmac)
计算文件的hash值(md5/sha1/sha256及hmac形式)
参数
传入值类型 | 解释 |
---|---|
string |
hash类型,大小字母,例如“MD5”“SHA1”“SHA256” |
string |
文件路径,例如/luadb/logo.jpg |
string |
hmac值,可选 |
返回值
返回值类型 | 解释 |
---|---|
string |
HEX过的hash值,若失败会无返回值 |
例子
5.24 crypto.md(tp,data,hmac)
计算数据的hash值(md5/sha1/sha256及hmac形式)
参数
传入值类型 | 解释 |
---|---|
string |
hash类型,大小字母,例如“MD5”“SHA1”“SHA256” |
string |
待处理的数据 |
string |
hmac值,可选 |
返回值
返回值类型 | 解释 |
---|---|
string |
HEX过的hash值,若失败会无返回值 |
例子
5.25 crypto.hash_init(tp)
创建流式hash用的stream
参数
传入值类型 | 解释 |
---|---|
string |
hash类型,大写字母,例如“MD5”“SHA1”“SHA256” |
string |
hmac值,可选 |
返回值
返回值类型 | 解释 |
---|---|
userdata |
成功返回一个数据结构,否则返回nil |
例子
5.26 crypto.hash_update(stream,data)
流式hash更新数据
参数
传入值类型 | 解释 |
---|---|
userdata |
crypto.hash_init()创建的stream,必选 |
string |
待计算的数据,必选 |
return |
无 |
返回值
无
例子
5.27 crypto.hash_finish(stream)
获取流式hash校验值并释放创建的stream
参数
传入值类型 | 解释 |
---|---|
userdata |
crypto.hash_init()创建的stream,必选 |
返回值
返回值类型 | 解释 |
---|---|
string |
成功返回计算得出的流式hash值的hex字符串,失败无返回 |
例子
6、功能验证
6.1 烧录固件
6.1.1 正确连接电脑和4G模组威廉希尔官方网站 板
使用带有数据通信功能的数据线,不要使用仅有充电功能的数据线.
6.1.2 识别4G模组的boot引脚
在下载之前,要用模组的boot引脚触发下载,也就是说,要把4G模组的boot引脚拉到1.8v,或者直接把boot引脚和VDD_EXT引脚相连.我们要在按下BOOT按键时让模块开机,就可以进入下载模式了.
具体到Air780E开发板:
1、当我们模块没开机时,按着BOOT键然后长按POW开机.
2、当我们模块开机时,按着BOOT键然后点按重启键即可.
6.1.3 识别电脑的正确端口
判断是否进入BOOT模式:模块上电,此时在电脑的设备管理器中,查看串口设备,会出现一个端口表示进入了boot下载模式,如下图所示:
6.1.4 用Luatools工具烧录
新建项目
首先,确保你的Luatools的版本,大于等于3.0.6版本的.
在Luatools的左上角上有版本显示的,如图所示:
Luatools版本没问题的话,就点击Luatools右上角的“项目管理测试”按钮,如下图所示:
这时会弹出项目管理和烧录管理的对话框,可以新建一个项目,如下图:
开始烧录
选择780E板子对应的底层core和刚改的main.lua脚本文件.下载到板子中.
点击下载后,我们需要进入boot模式才能正常下载.
如果没进入boot模式会出现下图情况:
进入boot模式下载,如图:
6.2 例程
本库有专属demo,点此链接查看crypto的demo例子
6.3 对应log
7、总结
通过本章内容的学习,你可以学习到有关加解密算法的函数,例如:crypto.md5(str)、crypto.hmac_md5(str,key)、crypto.hmac_sha1(str,key)等等函数。
更多内容,敬请关注!
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !