crypto_app.lua 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. --[[
  2. @module crypto_app
  3. @summary crypto_app应用功能模块
  4. @version 1.0
  5. @date 2025.10.15
  6. @author 沈园园
  7. @usage
  8. 本文件为crypto_app应用功能模块,核心业务逻辑为:
  9. 1、演示有关加解密的各种 API 的功能包含MD5,SHA,哈希(MD5,SHA),AES/DEC/3DES,CRC,checksum校验和;
  10. 本文件没有对外接口,直接在main.lua中require "crypto_app"就可以加载运行;
  11. ]]
  12. --加密运算主函数
  13. local function crypto_task_func()
  14. -- MD5/哈希MD5,输出结果已经hex编码
  15. log.info("md5", crypto.md5("abc"))
  16. log.info("hmac_md5", crypto.hmac_md5("abc", "1234567890"))
  17. -- SHA1/哈希SHA1,输出结果已经hex编码
  18. log.info("sha1", crypto.sha1("abc"))
  19. log.info("hmac_sha1", crypto.hmac_sha1("abc", "1234567890"))
  20. -- SHA256/哈希SHA256,输出结果已经hex编码
  21. log.info("sha256", crypto.sha256("abc"))
  22. log.info("hmac_sha256", crypto.hmac_sha256("abc", "1234567890"))
  23. -- SHA512/哈希SHA512,输出结果已经hex编码
  24. log.info("sha512", crypto.sha512("abc"))
  25. log.info("hmac_sha512", crypto.hmac_sha512("abc", "1234567890"))
  26. -- AES加密, 未经Hex编码. AES-128-ECB 算法 对称加密,对齐方式:"ZERO"
  27. local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "ZERO", "023001", "HZBIT@WLW/YSBKEY")
  28. log.info("AES", "aes-128-ecb", data_encrypt:toHex())
  29. local data_decrypt = crypto.cipher_decrypt("AES-128-ECB", "ZERO", data_encrypt, "HZBIT@WLW/YSBKEY")
  30. log.info("AES", "aes-128-ecb", data_decrypt)
  31. -- AES加密, 未经Hex编码. AES-128-ECB/CBC 算法 对称加密,对齐方式:"PKCS7"
  32. local data_encrypt = crypto.cipher_encrypt("AES-128-ECB", "PKCS7", "12345678901234 > 123456", "1234567890123456")
  33. local data2_encrypt = crypto.cipher_encrypt("AES-128-CBC", "PKCS7", "12345678901234 > 123456", "1234567890123456", "1234567890666666")
  34. log.info("AES", "aes-128-ecb", data_encrypt:toHex())
  35. log.info("AES", "aes-128-cbc", data2_encrypt:toHex())
  36. -- AES解密, 未经Hex编码, AES-128-ECB/CBC 算法 对称解密,,对齐方式:"PKCS7"
  37. local data_decrypt = crypto.cipher_decrypt("AES-128-ECB", "PKCS7", data_encrypt, "1234567890123456")
  38. local data2_decrypt = crypto.cipher_decrypt("AES-128-CBC", "PKCS7", data2_encrypt, "1234567890123456", "1234567890666666")
  39. log.info("AES", "aes-128-ecb", data_decrypt)
  40. log.info("AES", "aes-128-cbc", data2_decrypt)
  41. log.info("mem", rtos.meminfo("sys"))
  42. -- DES-ECB 加解密
  43. local data1 = crypto.cipher_encrypt("DES-ECB", "PKCS7", "abcdefg", "12345678")
  44. if data1 then
  45. log.info("des", data1:toHex())
  46. local data2 = crypto.cipher_decrypt("DES-ECB", "PKCS7", data1, "12345678")
  47. log.info("des", data2)
  48. else
  49. log.info("des", "当前固件不支持DES/3DES")
  50. end
  51. -- 3DES-ECB 加解密
  52. local data1 = crypto.cipher_encrypt("DES-EDE3-ECB", "PKCS7", "abcdefg!!--ZZSS", "123456781234567812345678")
  53. if data1 then
  54. log.info("3des", data1:toHex())
  55. local data2 = crypto.cipher_decrypt("DES-EDE3-ECB", "PKCS7", data1, "123456781234567812345678")
  56. log.info("3des", data2)
  57. else
  58. log.info("3des", "当前固件不支持DES/3DES")
  59. end
  60. -- 计算CRC16
  61. local originStr = "123456sdfdsfdsfdsffdsfdsfsdfs1234"
  62. local crc16 = crypto.crc16("MODBUS",originStr)
  63. log.info("crc16", crc16)
  64. -- 计算CRC16 modbus
  65. local crc16 = crypto.crc16_modbus("123456sdfdsfdsfdsffdsfdsfsdfs1234")
  66. log.info("crc16", crc16)
  67. crc16 = crypto.crc16_modbus("123456sdfdsfdsfdsffdsfdsfsdfs1234", 0xFFFF)
  68. log.info("crc16", crc16)
  69. -- 计算CRC32
  70. local data = "123456sdfdsfdsfdsffdsfdsfsdfs1234"
  71. local crc32 = crypto.crc32(data)
  72. log.info("crc32", crc32) --21438764
  73. -- start和poly可选, 是 2025.4.14 新增的参数
  74. local crc32 = crypto.crc32(data, 0xFFFFFFFF, 0x04C11DB7, 0xFFFFFFFF) --等同于crypto.crc32(data)
  75. log.info("crc32", crc32)
  76. -- 计算CRC8
  77. local data= "sdfdsfdsfdsffdsfdsfsdfs1234"
  78. local crc8 = crypto.crc8(data)
  79. log.info("crc8", crc8)
  80. local crc8 = crypto.crc8(data, 0x31, 0xff, false)
  81. log.info("crc8", crc8)
  82. -- 计算CRC7
  83. if crypto.crc7 then
  84. local result = crypto.crc7("abc", 0xE5, 0x00)
  85. log.info("crc7", result, string.format("%02X", result)) --50 32
  86. else
  87. log.info("crypto", "当前固件不支持crypto.crc7")
  88. end
  89. log.info("随机数测试")
  90. for i=1, 10 do
  91. sys.wait(100)
  92. log.info("crypto", "真随机数",string.unpack("I",crypto.trng(4)))
  93. -- log.info("crypto", "伪随机数",math.random()) -- 输出的是浮点数,不推荐
  94. -- log.info("crypto", "伪随机数",math.random(1, 65525)) -- 不推荐
  95. end
  96. -- totp的密钥
  97. log.info("totp的密钥")
  98. local secret = "VK54ZXPO74ISEM2E"
  99. --写死时间戳用来测试
  100. local ts = 1646796576
  101. --生成十分钟的动态码验证下
  102. for i=1,600,30 do
  103. local r = crypto.totp(secret,ts+i)
  104. local time = os.date("*t",ts+i + 8*3600)--东八区
  105. log.info("totp", string.format("%06d" ,r),time.hour,time.min,time.sec)
  106. end
  107. --将数据进行base64编码
  108. -- 本函数与 string.toBase64 是同一个
  109. local bdata = crypto.base64_encode("123")
  110. log.info("base64", "encode", bdata)
  111. --将数据进行base64解码
  112. -- 本函数与 string.fromBase64 是同一个
  113. local data = crypto.base64_decode("MTIz")
  114. log.info("base64", "decode", bdata, data)--123
  115. -- 打印所有支持的cipher
  116. if crypto.cipher_list then
  117. log.info("cipher", "list", json.encode(crypto.cipher_list()))
  118. else
  119. log.info("cipher", "当前固件不支持crypto.cipher_list")
  120. end
  121. -- 打印所有支持的cipher suites
  122. if crypto.cipher_suites then
  123. log.info("cipher", "suites", json.encode(crypto.cipher_suites()))
  124. else
  125. log.info("cipher", "当前固件不支持crypto.cipher_suites")
  126. end
  127. -- 计算文件的hash值(md5/sha1/sha256及hmac形式)
  128. log.info("文件hash值测试")
  129. if crypto.md_file then
  130. -- 无hmac的hash值
  131. log.info("md5", crypto.md_file("MD5", "/luadb/logo.jpg"))
  132. log.info("sha1", crypto.md_file("SHA1", "/luadb/logo.jpg"))
  133. log.info("sha256", crypto.md_file("SHA256", "/luadb/logo.jpg"))
  134. -- 带hmac的hash值
  135. log.info("hmac_md5", crypto.md_file("MD5", "/luadb/logo.jpg", "123456"))
  136. log.info("hmac_sha1", crypto.md_file("SHA1", "/luadb/logo.jpg", "123456"))
  137. log.info("hmac_sha256", crypto.md_file("SHA256", "/luadb/logo.jpg", "123456"))
  138. else
  139. log.info("文件hash值测试", "当前固件不支持crypto.md_file")
  140. end
  141. --计算数据的hash值(md5/sha1/sha256及hmac形式)
  142. if crypto.md then
  143. -- 无hmac的hash值
  144. log.info("md5", crypto.md("MD5", "1234567890"))
  145. log.info("sha1", crypto.md("SHA1", "1234567890"))
  146. log.info("sha256", crypto.md("SHA256", "1234567890"))
  147. -- 带hmac的hash值
  148. log.info("hmac_md5", crypto.md("MD5", "1234567890", "123456"))
  149. log.info("hmac_sha1", crypto.md("SHA1", "1234567890", "123456"))
  150. log.info("hmac_sha256", crypto.md("SHA256", "1234567890", "123456"))
  151. else
  152. log.info("数据hash值测试", "当前固件不支持crypto.md")
  153. end
  154. -- 流式hash测试
  155. log.info("流式hash测试")
  156. if crypto.hash_init then
  157. -- MD5
  158. local md5_obj = crypto.hash_init("MD5")
  159. crypto.hash_update(md5_obj, "1234567890")
  160. crypto.hash_update(md5_obj, "1234567890")
  161. crypto.hash_update(md5_obj, "1234567890")
  162. crypto.hash_update(md5_obj, "1234567890")
  163. local md5_result = crypto.hash_finish(md5_obj)
  164. log.info("md5_stream", md5_result)
  165. log.info("md5", crypto.md5("1234567890123456789012345678901234567890"))
  166. -- HMAC_MD5
  167. local hmac_md5_obj = crypto.hash_init("MD5", "1234567890")
  168. crypto.hash_update(hmac_md5_obj, "1234567890")
  169. crypto.hash_update(hmac_md5_obj, "1234567890")
  170. crypto.hash_update(hmac_md5_obj, "1234567890")
  171. crypto.hash_update(hmac_md5_obj, "1234567890")
  172. local hmac_md5_result = crypto.hash_finish(hmac_md5_obj)
  173. log.info("hmac_md5_stream", hmac_md5_result)
  174. log.info("hmac_md5", crypto.hmac_md5("1234567890123456789012345678901234567890", "1234567890"))
  175. -- SHA1
  176. local sha1_obj = crypto.hash_init("SHA1")
  177. crypto.hash_update(sha1_obj, "1234567890")
  178. crypto.hash_update(sha1_obj, "1234567890")
  179. crypto.hash_update(sha1_obj, "1234567890")
  180. crypto.hash_update(sha1_obj, "1234567890")
  181. local sha1_result = crypto.hash_finish(sha1_obj)
  182. log.info("sha1_stream", sha1_result)
  183. log.info("sha1", crypto.sha1("1234567890123456789012345678901234567890"))
  184. -- HMAC_SHA1
  185. local hmac_sha1_obj = crypto.hash_init("SHA1", "1234567890")
  186. crypto.hash_update(hmac_sha1_obj, "1234567890")
  187. crypto.hash_update(hmac_sha1_obj, "1234567890")
  188. crypto.hash_update(hmac_sha1_obj, "1234567890")
  189. crypto.hash_update(hmac_sha1_obj, "1234567890")
  190. local hmac_sha1_result = crypto.hash_finish(hmac_sha1_obj)
  191. log.info("hmac_sha1_stream", hmac_sha1_result)
  192. log.info("hmac_sha1", crypto.hmac_sha1("1234567890123456789012345678901234567890", "1234567890"))
  193. -- SHA256
  194. local sha256_obj = crypto.hash_init("SHA256")
  195. crypto.hash_update(sha256_obj, "1234567890")
  196. crypto.hash_update(sha256_obj, "1234567890")
  197. crypto.hash_update(sha256_obj, "1234567890")
  198. crypto.hash_update(sha256_obj, "1234567890")
  199. local sha256_result = crypto.hash_finish(sha256_obj)
  200. log.info("sha256_stream", sha256_result)
  201. log.info("sha256", crypto.sha256("1234567890123456789012345678901234567890"))
  202. -- HMAC_SHA256
  203. local hmac_sha256_obj = crypto.hash_init("SHA256", "1234567890")
  204. crypto.hash_update(hmac_sha256_obj, "1234567890")
  205. crypto.hash_update(hmac_sha256_obj, "1234567890")
  206. crypto.hash_update(hmac_sha256_obj, "1234567890")
  207. crypto.hash_update(hmac_sha256_obj, "1234567890")
  208. local hmac_sha256_result = crypto.hash_finish(hmac_sha256_obj)
  209. log.info("hmac_sha256_stream", hmac_sha256_result)
  210. log.info("hmac_sha256", crypto.hmac_sha256("1234567890123456789012345678901234567890", "1234567890"))
  211. -- SHA512
  212. local sha512_obj = crypto.hash_init("SHA512")
  213. if sha512_obj then
  214. crypto.hash_update(sha512_obj, "1234567890")
  215. crypto.hash_update(sha512_obj, "1234567890")
  216. crypto.hash_update(sha512_obj, "1234567890")
  217. crypto.hash_update(sha512_obj, "1234567890")
  218. local sha512_result = crypto.hash_finish(sha512_obj)
  219. log.info("sha512_stream", sha512_result)
  220. log.info("sha512", crypto.sha512("1234567890123456789012345678901234567890"))
  221. end
  222. -- HMAC_SHA512
  223. local hmac_sha512_obj = crypto.hash_init("SHA512", "1234567890")
  224. if hmac_sha512_obj then
  225. crypto.hash_update(hmac_sha512_obj, "1234567890")
  226. crypto.hash_update(hmac_sha512_obj, "1234567890")
  227. crypto.hash_update(hmac_sha512_obj, "1234567890")
  228. crypto.hash_update(hmac_sha512_obj, "1234567890")
  229. local hmac_sha512_result = crypto.hash_finish(hmac_sha512_obj)
  230. log.info("hmac_sha512_stream", hmac_sha512_result)
  231. log.info("hmac_sha512", crypto.hmac_sha512("1234567890123456789012345678901234567890", "1234567890"))
  232. end
  233. else
  234. log.info("crypto", "当前固件不支持crypto.hash_init")
  235. end
  236. if crypto.checksum then
  237. log.info("checksum", "OK", string.char(crypto.checksum("OK")):toHex())
  238. log.info("checksum", "357E", string.char(crypto.checksum("357E", 1)):toHex())
  239. else
  240. log.info("checksum", "当前固件不支持crypto.checksum")
  241. end
  242. log.info("crypto", "ALL Done")
  243. sys.wait(100000)
  244. end
  245. --创建一个task,并且运行task的主函数crypto_task_func
  246. sys.taskInit(crypto_task_func)