golang实现三重DES加密解密
DES
- DES(Data Encryption)是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS46-3),一直以来被美国及其他国家的政府和银行等广泛使用。随着计算机的进步,DES已经能够被暴力破解,1997年的DES Challenge I 中用了96天破译密钥,1998年的DES Challenge II-1中用了41天,1998年的DES Challenge II-2中用了56小时,1999年的DES Challenge III 中只用了22小时15分钟。
- DES是一种将64比特的明文加密成64比特的密文的对称密码算法,它的密钥的长度是56比特。尽管从规格上来说,DES的密钥长度是64比特,但由于每隔7比特会设置一个用于错误检查的比特,因此实质上其密钥长度是56比特。
- DES 是以64比特的明文(比特序列)为一个单位来进行加密的,这个64比特的单位称为分组 ,一般来说,以分组为单位进行处理的密码算法称为分组密码,DES就是分组密码的一种。
- DES每次只能加密64比特的数据,如果要加密的明文比较长,就需要对DES加密进行迭代(反复),而迭代的具体方式就称为模式。
- DES 内部实现理论:在 des 中各个步骤称为轮,整个加密过程进行16轮循环。

单轮加密

- 子密钥:中间的“子密钥”指的是本轮加密所使用的的密钥,在Feistel网络中,每一轮都需要使用一个不同的子密钥。由于密钥只在一轮中使用,它只是一个局部的密钥,因此才称为子密钥(subkey)。
- 轮函数:根据“右侧”和子密钥生成对“左侧”进行加密的比特序列,它是密码系统核心。将轮函数的输出与“左侧”进行XOR运算,其结果就是“加密后的左侧”。也就是说,我们用XOR将轮函数的输出与“左侧”进行合并。而输入的“右侧”则会直接成为输出的“右侧”。
两轮加密
连续两轮加密的密钥如果相同,相当于加密之后又进行解密。

三轮加密

三轮解密

部分实际上没有进行任何处理,在加密算法中看起来是一种浪费,却保证了可解密性,因为完全没有进行任何处理的右半部分是解密过程所必须的信息。
由于加密和解密可以用完全相同的结构来实现,因此用于实现 DES 算法的硬件设备的设计也变得更容易了。
三重DES
三重DES(triple-des)是为了增加DES的强度,将DES重复3次所得到的一种密码算法,也称为TDEA(Triple Date Encryption Algorithm),通常缩写为3DES。
明文经过三次DES处理才能变成最后的密文,由于DES密钥的长度实质上是56比特,因此三重DES的密钥长度就是56×3=168比特。

从图中我们可以发现,三重DES并不是进行三次DES加密(加密→加密→加密),而是加密→解密→加密的过程。在加密算法中加入解密操作让人感觉很不可思议,实际上这个方法是IBM公司设计出来的,目的是为了让三重DES能够兼容普通的DES。
当三重DES中所有的密钥都相同时,三重DES也就等同于普通的DES了。这是因为在前两步加密→解密之后,得到的就是最初的明文。因此,以前用DES加密的密文,就可以通过这种方式用三重DES来进行解密。也就是说,三重DES对DES具备向下兼容性。
在DES的部分我们已经提到过,DES的加密和解密过程只是改变了子密钥的顺序,而实际进行的处理是相同的。
如果所有密钥都使用相同的比特序列,则其结果与普通的DES是等价的。
如果密钥1和密钥3使用相同的密钥,而密钥2使用不同的密钥(也就是只使用两个DES密钥),这种三重DES就称为DES-EDE2。EDE表示的是加密(Encryption)→解密(Decryption)→加密(Encryption)这个流程。
密钥1、密钥2、密钥3全部使用不同的比特序列的三重DES称为des-ede3。
go 实现三重DES加密解密
在这里,我们用了一个 go 的加解密包,做了以下封装:
package main
import (
"encoding/base64"
"github.com/wumansgy/goEncrypt"
)
// 密钥 24字节
const secretKey = "hjdo843k920s6um4kk8sk3s8"
// 三重DES加密
func TripleDesEncrypt(encryptedString string) (string, error) {
cryptText, err := goEncrypt.TripleDesEncrypt([]byte(encryptedString), []byte(secretKey))
if err != nil {
return "", err
}
return base64.StdEncoding.EncodeToString(cryptText), nil
}
// 三重DES解密
func TripleDesDecrypt(decryptString string) (string, error) {
decryptBytes, err := base64.StdEncoding.DecodeString(decryptString)
if err != nil {
return "", err
}
cryptText, err := goEncrypt.TripleDesDecrypt(decryptBytes, []byte(secretKey))
if err != nil {
return "", err
}
return string(cryptText), nil
}
golang实现三重DES加密解密的更多相关文章
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- go-dongle 0.2.0 版本发布了,一个轻量级、语义化的 golang 编码解码、加密解密库
dongle 是一个轻量级.语义化.对开发者友好的 Golang 编码解码和加密解密库 Dongle 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧 github.com/g ...
- php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...
- des加密解密——java加密,php解密
最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...
- DES加密解密
加密后生成Base64字符串,并去除'='字符. 加密后替换掉'+',这样加密后的字符串可以作为url参数传递. using System; using System.IO; using System ...
- 一个java的DES加密解密类转换成C#
一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...
- golang AES/ECB/PKCS5 加密解密 url-safe-base64
因为项目的需要用到golang的一种特殊的加密解密算法AES/ECB/PKCS5,但是算法并没有包含在标准库中,经过多次失败的尝试,终于解码成功,特此分享: /* 描述 : golang AES/EC ...
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
- php实现和c#一致的DES加密解密
原文:php实现和c#一致的DES加密解密 php实现和c#一致的DES加密解密,可以从网上搜到一大堆,但是测试后发现都没法用.以下正确代码是我经过苦苦才找到的.希望大家在系统整合时能用的上. 注意: ...
随机推荐
- Qt编写物联网管理平台49-设备模拟工具
一.前言 本系统专门配备了设备模拟工具,用来在没有外接真实设备的时候,模拟modbus协议数据,支持多个设备,支持串口和网络方式,可切换正常数据和报警数据,反应到主程序上.对应主程序中两种端口,一种是 ...
- Royal Elementor Addons Pro v1.3.987 + v1.5.0 elementor网页设计元素组件插件下载
Royal Elementor Addons Pro elementor网页设计元素组件插件破解版简介&下载 Royal Elementor Addons Pro Nulled Element ...
- 深入LinkedBlockingQueue实现原理
学习BlockingQueue之LinkedBlockingQueue实现原理 一:概念 LinkedBlockingQueue是一个用链表实现的有界阻塞队列.此队列的默认和最大长度为 Integ ...
- springboot整合security实现权限控制
1.建表,五张表,如下:1.1.用户表CREATE TABLE `t_sys_user` ( `user_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT ...
- e-prime2.0 安装
先卸载之前的 卸载 1.点开之前安装的文件.exe 2.选择remove,即卸载 打开注册表 1.开始-运行:输入regedit 2.然后找到并删除注册表中: HKEY_CURRENT_USER\So ...
- Integer包装类中的IntegerCache结构
public void test3() { Integer i = new Integer(1); Integer j = new Integer(1); System.out.println(i = ...
- .NET9 AOT部署
概念 AOT是Ahead-of-Time的缩写,AOT是将C#程序提前编译为机器代码(通常为平台特定的二进制文件),在应用程序启动之前完成编译过程. 微软官方文档是这样说的 将应用程序发布为本机 AO ...
- 小程序之按钮你不知道的v2
<button type="primary">提交</button> <button type="primary" loading ...
- 离散最大似然法与 OI
若总体属于离散型,其分布律在参数 \(\theta\) 作用下 \(P\{X=x\}=p(x;\theta),\Theta=\{\theta\}\) 的形式已知,设 \(X_1,X_2,\dots,x ...
- 我把deepseek等大模型接入了微信公众号,打造个人AI助手
前言 最近deepseek大模型可是火出了圈,给国产大模型公司点赞.于是乎去deepseek试了一下效果,奈何太多人使用了,问两句来一句 "服务器繁忙,请稍后再试",体验感实在太差 ...