des加密 lua_lua-resty-nettle实现des解密
最近需要在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解密相关推荐
- linux下des加密命令,linux下的DES加密
linux下的DES加密 des_crypt, ecb_crypt, cbc_crypt, des_setparity, DES_FAILED 都是用于DES快速加密 调用格式 #include ...
- des加密 ios 和java_三重Des对称加密在Android、Ios 和Java 平台的实现
// // CommonFunc.m // PRJ_base64 // // Created by wangzhipeng on 12-11-29. // Copyright (c) 2012 ...
- des 加密 iOS
转载请注明原文出处 生成同名的Des.h文件和Des.m文件后,拷贝下方的代码可直接使用.注意在Des.m文件中将key值修改为项目所需的key.---> #define DesKey 过程很 ...
- getcoo php_PHP简单实现DES加密解密的方法
本文实例讲述了PHP简单实现DES加密解密的方法.分享给大家供大家参考,具体如下: des加密: function des_encrypt($str, $key) { $block = mcrypt_ ...
- .net实现md5加密 sha1加密 sha256加密 sha384加密 sha512加密 des加密解密
写项目时,后台一直用md5加密,一天群里人问,除了MD5还有其它的加密方法吗?当时只知道还有个SHA,但怎么实现什么的都不清楚,于是当网上找了下,把几种常见的加密方法都整理了下,用winform写了个 ...
- MD5 AES Des 加密解密
MD5加密不可逆 只能加密,不能解密,代码如下: package com.ruoyi.common.utils.security; import java.security.MessageDigest ...
- C#与java可以共用的DES加密解密
C#的DES加密与解密算法我就不写了,主要写一下怎么去解密C#用DES加密后串,大家都知道C#的DES加密密钥长度是8位的,而java是8的倍数位,所以用普通的java中的DES是不行的,要解C#的加 ...
- java和c 进行des_c语言的des加密,怎么用java解密
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 我试了好多java解密方法都不对,主要是看不懂c代码以下是C代码大神帮忙看看 /*------------------------------------ ...
- mysql des_mysql中DES加密解密
DES_DECRYPT(crypt_str[,key_str]) 使用DES_ENCRYPT()加密一个字符串.若出现错误,这个函数会返回 NULL. 注意,这个函数只有当MySQL在SSL 的支持下 ...
- python des解密_python实现DES加密解密方法实例详解
本文实例讲述了python实现DES加密解密方法.分享给大家供大家参考.具体分析如下: 实现功能:加密中文等字符串 密钥与明文可以不等长 这里只贴代码,加密过程可以自己百度,此处python代码没有优 ...
最新文章
- 荣耀v40搭载鸿蒙吗,荣耀V40照常发布,将更换操作系统,同nova8搭载鸿蒙2.0发布...
- lvs基本概念、调度方法、ipvsadm命令及nat模型示例
- 数字货币概念股继续活跃 旗天科技14个交易日大涨160%
- 怎样让一个心浮气躁的孩子静下心学习?
- tcp 重发 应用层重传
- 很无聊但是又很重要的 计算机网络基础知识 ---“互联网协议“
- matlab与计量经济学,matlab与计量经济学
- PCB检查流程checklist
- 小度计算机笔记,开售告罄、口碑炸裂、高语音交互率的小度耳机,全新升级语音笔记...
- Mac大小写切换需长按capslock键解决办法
- android按键定义
- centos 6.2 bind dlz mysql 驱动,bind9 dlz mysql 配置 – daemon
- win10笔记本使用ipad作为扩展屏
- Oracle11g 调整表空间大小 Resize
- Android6.0 WMS(八) 显示Activity的启动窗口
- vue子组件mounted不执行_vue 页面回退mounted函数不执行的解决方案
- lwip组播实现和原理-STM32F407
- 适当处理错误(捕获异常)
- 昂达v80p 刷linux,打破低价平板套路 昂达V80曝光再造新神器!
- select * from( select * from 表名) 是什么意思
热门文章
- Navicat Premium 12 安装教程 + 注册机 Navicat_Keygen_Patch_v5.0_By_DFoX_CHS [附资源]
- keras深度学习之猫狗分类三(特征提取)
- Stata之数据录入
- Oracle函数HEXTORAW乱码,Oracle常用函数之HEXTORAW
- java浏览器控件jxbrowser(简单demo模拟自动登录与点击)
- 计算机网络——自顶向下
- 修改Android动画速度
- DXGI高帧率屏幕录像软件源码解析(声音捕获,抓屏,ffmpeg录像,MP4录像,flv录像,麦克风采集)(第1篇API展示及使用部分)
- 数论 day 2 试题解析
- VB.NET实现文件上传下载