基础资料
基于Air105开发板:Air105 - LuatOS 文档
上手:开发上手 - LuatOS 文档
探讨重点
对官方CRYPTO(加密与解密) 功能的复现,进行相关内容的学习及探讨。
单片机的CRYPTO(加密与解密)功能是指单片机上集成了加密与解密算法,可以通过编程实现数据的加密与解密。不同的单片机厂商会提供不同的CRYPTO模块,例如STM32就有X-CUBE-CRYPTOLIB和STM32的对称加解密加速器Crypto等。这些模块可以支持多种对称和非对称加密算法,如DES/TDES、AES等。
实现功能
功能1:常用加解密操作及hash函数;
常用的加解密操作有对称加密和非对称加密。对称加密是指加密和解密使用相同的密钥,而非对称加密则是使用不同的密钥进行加密和解密。常见的对称加密算法有DES、3DES、AES等,常见的非对称加密算法有RSA、ECC等。
哈希函数是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。常见的哈希函数有MD5、SHA-1、SHA-224、SHA-384、SHA-512等。
功能2:RSA加密解密(RSA1024、RSA2048);
RSA1024和RSA2048的区别在于密钥长度不同。RSA算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加密解密所需时间越长。实际中常使用1024bit秘钥和2048bit秘钥,分别称为RSA1024和RSA2048。秘钥包含公钥和私钥,即公钥私钥长度一样,都是1024bit或2048bit。
硬件准备
Air103开发板1块。
软件版本
AIR103:LuatOS@AIR105 base 22.11 bsp V0011 32bit
软件使用
接口文档可参考:CRYPTO功能
功能1:常用加解密操作及hash函数
--- base64 算法测试
local function base64Test(str)
local encodeStr = crypto.base64_encode(str, #str)
log.info("base64 encode", encodeStr:toHex())
log.info("base64 decode", crypto.base64_decode(encodeStr, #encodeStr))
end
--- md5 算法测试
local function md5Test(str)
log.info("md5 encode", crypto.md5(str, #str))
end
--- sha1 算法测试
local function sha1Test(str)
log.info("sha1 encode", crypto.sha1(str, #str))
end
--- sha256 算法测试
local function sha256Test(str)
log.info("sha256 encode", crypto.sha256(str, #str))
end
--- crc算法测试
local function crcTest(str)
log.info("crc modebus encode", string.format("%04X", crypto.crc16("MODBUS", str)))
end
功能2:常用加解密操作及hash函数
-- 读取公钥并马上加密数据
local res = rsa.encrypt((io.readFile("/luadb/rsa_public_key.pem")), "abc")
-- 打印结果
log.info("rsa", "encrypt", res and #res or 0, res and res:toHex() or "")
if res then
-- 读取私钥, 然后解码数据
local dst = rsa.decrypt((io.readFile("/luadb/rsa_private_key.pem")), res, "")
log.info("rsa", "decrypt", dst and #dst or 0, dst and dst:toHex() or "")
end
-- 演示签名和验签
local hash = crypto.sha1("1234567890"):fromHex()
-- 签名通常很慢, 通常是服务器做
local sig = rsa.sign((io.readFile("/luadb/rsa_private_key.pem")), rsa.MD_SHA1, hash, "")
log.info("rsa", "sign", sig and #sig or 0, sig and sig:toHex() or "")
if sig then
-- 验签是很快的
local ret = rsa.verify((io.readFile("/luadb/rsa_public_key.pem")), rsa.MD_SHA1, hash, sig)
log.info("rsa", "verify", ret)
end
end)
log
[2022-11-24 22:55:01.257] Jump_AppRun 76:jump to 0x01010400 !
[2022-11-24 22:55:01.257] main 188:APP Build release Nov 24 2022 14:43:27!
[2022-11-24 22:55:01.257] I/main LuatOS@AIR105 base 22.11 bsp V0011 32bit
[2022-11-24 22:55:01.257] I/main ROM Build: Nov 24 2022 14:43:34
[2022-11-24 22:55:01.271] D/main loadlibs luavm 204792 15504 15504
[2022-11-24 22:55:01.271] D/main loadlibs sys 406792 51112 51616
[2022-11-24 22:55:01.271] I/user.main rsademo 1.0.1
[2022-11-24 22:55:03.346] I/user.rsa encrypt 128 1F632C35E2BA14797342E2444DAC168E1526EDA9215B650D3C51537BD70D95B56BF5529ABC61DEE08790B2C5E4D6DBC1585565ADD57BA4AFA85DD75A43DE6196C80337C2393E03E1D30F126B73D990A0B65BEAFF19741D3F905A5D2BD29E306AA0FB9E4FA6239AB59127CA7EF5FFC086CE9A432C1F1765DFE46B246ACFBEBAB6
[2022-11-24 22:55:03.520] I/user.rsa decrypt 3 616263
[2022-11-24 22:55:03.693] I/user.rsa sign 128 167DE068E144FF39D53032F6C0E76D331E3C781B58A52FF038A91A1E64848079F1B97F64AE9EA83FEF1BD22B08281D5049E6E9F2A80B4BDE678F36868EEB0F2CFC4C6911190B322A4779DD038323C90676A0D8005DAADEE861ADAC2ADBBCE77F6ACAB705372D4247A82B8BC772C681147B0A85B47BF21972CC053706BBE1E1BE
[2022-11-24 22:55:03.693] I/user.rsa verify true