最近需要在openresty内对客户端上传的一段des加密数据做解密,于是搜到了lua-resty-nettle这个库。

下面记录一下关键概念和lua-resty-nettle用法。

关键概念

DES加密是逐块进行的,据我了解常见的都是8字节一块。

密钥

DES是对称加密,其密钥要求长度为8个字节,等于一个块的大小。

加密模式

支持多种加密模式,很常听见这些名词:ECB,CBC,CTR,OFB,CFB。

常用的是ECB和CBC。

初始化向量

英文叫做iv,第二个字母就是vector。

只有ECB不需要iv,其他加密模式要求传8字节(一个块的大小)的iv一起参与编码,起到进一步混淆加密结果的作用。

按道理iv每次加密随机生成是最好的,加密端可以将iv暴露出去,以便解密端可以基于相同的iv完成解密。

padding补齐

des要求待加密的数据也是按块大小对齐的,一般就是8字节。

当数据不够长时,加密端算法会自动补齐,当然也可以调用方主动补齐后再加密。

内置的标准补齐算法有几种:’pkcs5′,’pkcs7′,’iso10126′,’ansix923′,’zero’ 。

常见的是pkcs5,pkcs7,zero,无论它们原理是什么,目标都是补齐到8字节对齐。

加密端和解密端必须按相同的补齐算法计算,否则就会发现数据不一样。

用法

这个库只能在LuaJIT下工作,适用于openresty。

加密

lua解密

解密需要引入2个模块:

des模块:负责解密工作

padding:负责对解密后的字符串擦除padding补齐用途的字节

Lua

local pkcs7 = require "resty.nettle.padding.pkcs7"

local des = require "resty.nettle.des"

function hexToBin(hex, spacer)

if spacer == nil then

spacer = ""

end

local h2b =

{

["0"] = 0,

["1"] = 1,

["2"] = 2,

["3"] = 3,

["4"] = 4,

["5"] = 5,

["6"] = 6,

["7"] = 7,

["8"] = 8,

["9"] = 9,

["A"] = 10,

["B"] = 11,

["C"] = 12,

["D"] = 13,

["E"] = 14,

["F"] = 15,

["a"] = 10,

["b"] = 11,

["c"] = 12,

["d"] = 13,

["e"] = 14,

["f"] = 15,

}

return (string.gsub(hex, "(.)(.)"..spacer, function (h, l)

return string.char(h2b[h]*16+h2b[l])

end))

end

local ds, wk = des.new("Zmge53Xe", "ecb")

local plain = pkcs7.unpad(ds:decrypt(hexToBin("1fabbb0ee09c2e4f57d95510e21b909bb8e91d850004d615")), 8)

print(plain)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

localpkcs7=require"resty.nettle.padding.pkcs7"

localdes=require"resty.nettle.des"

functionhexToBin(hex,spacer)

ifspacer==nilthen

spacer=""

end

localh2b=

{

["0"]=0,

["1"]=1,

["2"]=2,

["3"]=3,

["4"]=4,

["5"]=5,

["6"]=6,

["7"]=7,

["8"]=8,

["9"]=9,

["A"]=10,

["B"]=11,

["C"]=12,

["D"]=13,

["E"]=14,

["F"]=15,

["a"]=10,

["b"]=11,

["c"]=12,

["d"]=13,

["e"]=14,

["f"]=15,

}

return(string.gsub(hex,"(.)(.)"..spacer,function(h,l)

returnstring.char(h2b[h]*16+h2b[l])

end))

end

localds,wk=des.new("Zmge53Xe","ecb")

localplain=pkcs7.unpad(ds:decrypt(hexToBin("1fabbb0ee09c2e4f57d95510e21b909bb8e91d850004d615")),8)

print(plain)

首先通过des.new函数创建des加密器:

第一个参数:8字节的密钥(与加密算法的块大小一致)

第二个参数:加密模式,我选择ecb,不需要传iv

第三个参数:iv,初始化向量,8字节

然后通过ds:decrypt可以完成des解密,解密后的字符串末尾可能有补齐字节,所以使用pkcs7算法删除补齐的字节,得到原始字符串。

注意,我和客户端协商的就是使用pkcs7算法,如果是其他算法需要使用其他的padding类进行unpad。

参考资料

如果文章帮助了你,请帮我点击1次谷歌广告,或者微信赞助1元钱,感谢!

知识星球有更多干货内容,对我认可欢迎加入:

des加密 lua_lua-resty-nettle实现des解密相关推荐

  1. linux下des加密命令,linux下的DES加密

     linux下的DES加密 des_crypt, ecb_crypt, cbc_crypt, des_setparity, DES_FAILED 都是用于DES快速加密 调用格式 #include ...

  2. des加密 ios 和java_三重Des对称加密在Android、Ios 和Java 平台的实现

    // //  CommonFunc.m //  PRJ_base64 // //  Created by wangzhipeng on 12-11-29. //  Copyright (c) 2012 ...

  3. des 加密 iOS

    转载请注明原文出处 生成同名的Des.h文件和Des.m文件后,拷贝下方的代码可直接使用.注意在Des.m文件中将key值修改为项目所需的key.--->  #define DesKey 过程很 ...

  4. getcoo php_PHP简单实现DES加密解密的方法

    本文实例讲述了PHP简单实现DES加密解密的方法.分享给大家供大家参考,具体如下: des加密: function des_encrypt($str, $key) { $block = mcrypt_ ...

  5. .net实现md5加密 sha1加密 sha256加密 sha384加密 sha512加密 des加密解密

    写项目时,后台一直用md5加密,一天群里人问,除了MD5还有其它的加密方法吗?当时只知道还有个SHA,但怎么实现什么的都不清楚,于是当网上找了下,把几种常见的加密方法都整理了下,用winform写了个 ...

  6. MD5 AES Des 加密解密

    MD5加密不可逆 只能加密,不能解密,代码如下: package com.ruoyi.common.utils.security; import java.security.MessageDigest ...

  7. C#与java可以共用的DES加密解密

    C#的DES加密与解密算法我就不写了,主要写一下怎么去解密C#用DES加密后串,大家都知道C#的DES加密密钥长度是8位的,而java是8的倍数位,所以用普通的java中的DES是不行的,要解C#的加 ...

  8. java和c 进行des_c语言的des加密,怎么用java解密

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...

  9. mysql des_mysql中DES加密解密

    DES_DECRYPT(crypt_str[,key_str]) 使用DES_ENCRYPT()加密一个字符串.若出现错误,这个函数会返回 NULL. 注意,这个函数只有当MySQL在SSL 的支持下 ...

  10. python des解密_python实现DES加密解密方法实例详解

    本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...

最新文章

  1. 荣耀v40搭载鸿蒙吗,荣耀V40照常发布,将更换操作系统,同nova8搭载鸿蒙2.0发布...
  2. lvs基本概念、调度方法、ipvsadm命令及nat模型示例
  3. 数字货币概念股继续活跃 旗天科技14个交易日大涨160%
  4. 怎样让一个心浮气躁的孩子静下心学习?
  5. tcp 重发 应用层重传
  6. 很无聊但是又很重要的 计算机网络基础知识 ---“互联网协议“
  7. matlab与计量经济学,matlab与计量经济学
  8. PCB检查流程checklist
  9. 小度计算机笔记,开售告罄、口碑炸裂、高语音交互率的小度耳机,全新升级语音笔记...
  10. Mac大小写切换需长按capslock键解决办法
  11. android按键定义
  12. centos 6.2 bind dlz mysql 驱动,bind9 dlz mysql 配置 – daemon
  13. win10笔记本使用ipad作为扩展屏
  14. Oracle11g 调整表空间大小 Resize
  15. Android6.0 WMS(八) 显示Activity的启动窗口
  16. vue子组件mounted不执行_vue 页面回退mounted函数不执行的解决方案
  17. lwip组播实现和原理-STM32F407
  18. 适当处理错误(捕获异常)
  19. 昂达v80p 刷linux,打破低价平板套路 昂达V80曝光再造新神器!
  20. select * from( select * from 表名) 是什么意思

热门文章

  1. Navicat Premium 12 安装教程 + 注册机 Navicat_Keygen_Patch_v5.0_By_DFoX_CHS [附资源]
  2. keras深度学习之猫狗分类三(特征提取)
  3. Stata之数据录入
  4. Oracle函数HEXTORAW乱码,Oracle常用函数之HEXTORAW
  5. java浏览器控件jxbrowser(简单demo模拟自动登录与点击)
  6. 计算机网络——自顶向下
  7. 修改Android动画速度
  8. DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第1篇API展示及使用部分)
  9. 数论 day 2 试题解析
  10. VB.NET实现文件上传下载