main.lua 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. --- 模块功能:rsa示例
  2. -- @module rsa
  3. -- @author wendal
  4. -- @release 2022.11.03
  5. --[[
  6. 提醒: 本demo需要用到公钥和私钥, demo目录中的公钥私钥文件是演示用的, 实际使用请自行生成
  7. 生成公钥私钥, 可使用openssl命令, 或者找个网页生成. 2048 是RSA位数, 最高支持4096,但不推荐,因为很慢.
  8. openssl genrsa -out privkey.pem 2048
  9. openssl rsa -in privkey.pem -pubout -out public.pem
  10. -- 下载脚本和资源到设备时, 务必加上本目录下的两个 pem 文件, 否则本demo无法运行.
  11. ]]
  12. -- LuaTools需要PROJECT和VERSION这两个信息
  13. PROJECT = "rsademo"
  14. VERSION = "1.0.1"
  15. log.info("main", PROJECT, VERSION)
  16. -- sys库是标配
  17. _G.sys = require("sys")
  18. -- 因为这是通用demo, air101/air103跑满速才不至于太慢-_-
  19. if rtos.bsp() == "AIR101" or rtos.bsp() == "AIR103" or rtos.bsp() == "AIR601" then
  20. if mcu then
  21. mcu.setClk(240)
  22. end
  23. end
  24. sys.taskInit(function()
  25. -- 为了日志能正常显示出来, 这里特意延时2秒, 实际使用中不需要
  26. sys.wait(2000)
  27. -- 检查是否带rsa库, 没有就提醒一下吧
  28. if not rsa then
  29. log.warn("main", "this demo need rsa lib!!!")
  30. return
  31. end
  32. -- 读取公钥并马上加密数据
  33. local res = rsa.encrypt((io.readFile("/luadb/public.pem")), "abc")
  34. -- 打印结果
  35. log.info("rsa", "encrypt", res and #res or 0, res and res:toHex() or "")
  36. -- 下面是解密, 通常不会在设备端进行, 这里主要是演示用法, 会很慢
  37. if res then
  38. -- 读取私钥, 然后解码数据
  39. local dst = rsa.decrypt((io.readFile("/luadb/privkey.pem")), res, "")
  40. log.info("rsa", "decrypt", dst and #dst or 0, dst and dst:toHex() or "")
  41. end
  42. -- 演示签名和验签
  43. local hash = crypto.sha1("1234567890"):fromHex()
  44. -- 签名通常很慢, 通常是服务器做
  45. local sig = rsa.sign((io.readFile("/luadb/privkey.pem")), rsa.MD_SHA1, hash, "")
  46. log.info("rsa", "sign", sig and #sig or 0, sig and sig:toHex() or "")
  47. if sig then
  48. -- 验签是很快的
  49. local ret = rsa.verify((io.readFile("/luadb/public.pem")), rsa.MD_SHA1, hash, sig)
  50. log.info("rsa", "verify", ret)
  51. end
  52. end)
  53. -- 用户代码已结束---------------------------------------------
  54. -- 结尾总是这一句
  55. sys.run()
  56. -- sys.run()之后后面不要加任何语句!!!!!