main.lua 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. -- LuaTools需要PROJECT和VERSION这两个信息
  2. PROJECT = "gmssldemo"
  3. VERSION = "1.0.0"
  4. log.info("main", PROJECT, VERSION)
  5. -- sys库是标配
  6. _G.sys = require("sys")
  7. if wdt then
  8. --添加硬狗防止程序卡死,在支持的设备上启用这个功能
  9. wdt.init(9000)--初始化watchdog设置为9s
  10. sys.timerLoopStart(wdt.feed, 3000)--3s喂一次狗
  11. end
  12. sys.taskInit(function()
  13. sys.wait(1000)
  14. log.info("gmssl", "start")
  15. -- 未加密字符串
  16. local originStr = "!!from LuatOS!!"
  17. -- SM2 , 非对称加密, 类似于RSA,但属于椭圆算法
  18. -- 就当前实现还是比较慢的
  19. if gmssl.sm2encrypt then -- 部分BSP不支持
  20. local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
  21. local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
  22. local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
  23. -- GMSSL默认格式
  24. log.info("==== SM2 默认GMSSL模式")
  25. local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr)
  26. log.info("sm2默认模式", "加密后", encodeStr and string.toHex(encodeStr))
  27. if encodeStr then
  28. log.info("sm2默认模式", "解密后", gmssl.sm2decrypt(private,encodeStr))
  29. end
  30. -- 网站兼容模式 https://i.goto327.top/CryptTools/SM2.aspx
  31. -- 密文格式 C1C3C2, 新国标, 一般是这种
  32. log.info("==== SM2 网站兼容模式")
  33. local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true)
  34. log.info("sm2网站兼容模式 C1C3C2", "加密后", encodeStr and string.toHex(encodeStr))
  35. if encodeStr then
  36. log.info("sm2网站兼容模式 C1C3C2", "解密后", gmssl.sm2decrypt(private,encodeStr, true))
  37. else
  38. log.info("解密失败")
  39. end
  40. -- 密文格式 C1C2C3, 老国标, 老的Java库通常支持这种
  41. log.info("==== SM2 网站兼容模式, 但C1C2C3")
  42. local encodeStr = gmssl.sm2encrypt(pkx,pky,originStr, true, true)
  43. log.info("sm2网站兼容模式 C1C2C3", "加密后", encodeStr and string.toHex(encodeStr))
  44. if encodeStr then
  45. log.info("sm2网站兼容模式 C1C2C3", "解密后", gmssl.sm2decrypt(private,encodeStr, true, true))
  46. else
  47. log.info("解密失败")
  48. end
  49. end
  50. -- SM3 算法, hash类
  51. if gmssl.sm3update then
  52. log.info("=== SM3测试")
  53. encodeStr = gmssl.sm3update("lqlq666lqlq946")
  54. log.info("gmssl.sm3update",string.toHex(encodeStr))
  55. end
  56. if gmssl.sm4encrypt then
  57. log.info("=== SM4测试")
  58. local passwd = "1234567890123456"
  59. local iv = "1234567890666666"
  60. -- SM4 算法, 对称加密
  61. originStr = ">>SM4 ECB ZeroPadding test<<"
  62. --加密模式:ECB;填充方式:ZeroPadding;密钥:1234567890123456;密钥长度:128 bit
  63. encodeStr = gmssl.sm4encrypt("ECB", "ZERO", originStr, passwd)
  64. log.info("sm4.ecb.zero", "加密后", string.toHex(encodeStr))
  65. log.info("sm4.ecb.zero", "解密后", gmssl.sm4decrypt("ECB","ZERO",encodeStr,passwd))
  66. originStr = ">>SM4 ECB Pkcs5Padding test<<"
  67. --加密模式:ECB;填充方式:Pkcs5Padding;密钥:1234567890123456;密钥长度:128 bit
  68. encodeStr = gmssl.sm4encrypt("ECB", "PKCS5", originStr, passwd)
  69. log.info("sm4.ecb.pks5", "加密后", string.toHex(encodeStr))
  70. log.info("sm4.ecb.pks5", "解密后", gmssl.sm4decrypt("ECB","PKCS5",encodeStr,passwd))
  71. originStr = ">>SM4 CBC Pkcs5Padding test<<"
  72. --加密模式:CBC;填充方式:Pkcs5Padding;密钥:1234567890123456;密钥长度:128 bit;偏移量:1234567890666666
  73. encodeStr = gmssl.sm4encrypt("CBC","PKCS5", originStr, passwd, iv)
  74. log.info("sm4.cbc.pks5", "加密后", string.toHex(encodeStr))
  75. log.info("sm4.cbc.pks5", "解密后", gmssl.sm4decrypt("CBC","PKCS5",encodeStr,passwd, iv))
  76. -- 完全对齐16字节的对比测试
  77. originStr = "1234567890123456"
  78. encodeStr = gmssl.sm4encrypt("ECB","PKCS7",originStr,passwd)
  79. log.info("sm4.ecb.pkcs7", encodeStr:toHex())
  80. encodeStr = gmssl.sm4encrypt("ECB","PKCS5",originStr,passwd)
  81. log.info("sm4.ecb.pkcs5", encodeStr:toHex())
  82. encodeStr = gmssl.sm4encrypt("ECB","ZERO",originStr,passwd)
  83. log.info("sm4.ecb.zero", encodeStr:toHex())
  84. encodeStr = gmssl.sm4encrypt("ECB","NONE",originStr,passwd)
  85. log.info("sm4.ecb.none", encodeStr:toHex())
  86. end
  87. -- SM2签名和验签
  88. if gmssl.sm2sign then
  89. local originStr = string.fromHex("434477813974bf58f94bcf760833c2b40f77a5fc360485b0b9ed1bd9682edb45")
  90. local pkx = "ABE87C924B7ECFDEA1748A06E89003C9F7F4DC5C3563873CE2CAE46F66DE8141"
  91. local pky = "9514733D38CC026F2452A6A3A3A4DA0C28F864AFA5FE2C45E0EB6B761FBB5286"
  92. local private = "129EDC282CD2E9C1144C2E7315F926D772BC96600D2771E8BE02060313FE00D5"
  93. -- 不带id的情况,即默认id="1234567812345678"
  94. local sig = gmssl.sm2sign(private, originStr, nil)
  95. log.info("sm2sign", sig and sig:toHex())
  96. if sig then
  97. local ret = gmssl.sm2verify(pkx, pky, originStr, nil, sig)
  98. log.info("sm2verify", ret or "false")
  99. end
  100. -- 带id的情况
  101. local id = "1234"
  102. local sig = gmssl.sm2sign(private, originStr, id)
  103. log.info("sm2sign", sig and sig:toHex())
  104. if sig then
  105. local ret = gmssl.sm2verify(pkx, pky, originStr, id, sig)
  106. log.info("sm2verify", ret or "false")
  107. end
  108. end
  109. log.info("gmssl", "ALL Done")
  110. end)
  111. -- 用户代码已结束---------------------------------------------
  112. -- 结尾总是这一句
  113. sys.run()
  114. -- sys.run()之后后面不要加任何语句!!!!!