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通用方法及类库7
函数名 //int转字节数组 static QByteArray intToByte(int i); static QByteArray intToByteRec(int i); //字节数组转int ...
- JavaScript中find()和 filter()方法的区别小结
前言 JavaScript 在 ES6 上有很多数组方法,每种方法都有独特的用途和好处. 在开发应用程序时,大多使用数组方法来获取特定的值列表并获取单个或多个匹配项. 在列出这两种方法的区别之前,我们 ...
- [转]GMM:高斯混合模型讲义(台湾)
- IM通讯协议专题学习(二):快速理解Protobuf的背景、原理、使用、优缺点
本文由vivo技术团队Li Guanyun分享,为了提升阅读体验,进行了较多修订和重新排版. 1.引言 Protobuf 作为一种跨平台.语言无关.可扩展的序列化结构数据通讯协议,已广泛应用于网络数据 ...
- 有道云笔记默认的笔记格式转markdown
目录 0. 前言 1. 有道云笔记自带的笔记格式转markdown的方案 1.1 pdf => md 1.2 pdf => word => md 2. Markdown技巧 2.1 ...
- Solution Set - “我将它捣成美梦愿你梦里无忧”
目录 0.「NOI Simu.」掌分治 1.「集训队互测 2019」「LOJ #3077」绝目编诗 2.「ICPC 2019 WF」「洛谷 P6256」Directing Rainfall 3.「CT ...
- GIMP 开源、免费,功能强大的图像编辑软件
引言 万事开头难,打造个人网站,图片处理是必不可少的,老王的电脑还是 10 年前配置的,日常使用倒还流畅,但要是使用 Photoshop 就有些吃力,特别是越新的版本.然后,发现 GIMP 这个开源的 ...
- Quartz调度框架详解、运用场景、与集群部署实践
以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...
- shell脚本中的逻辑判断
shell脚本中也可以实现逻辑判断. 案例4:shell脚本中的逻辑判断 如果你学过C或者其他语言,相信你不会对if 陌生,在shell脚本中我们同样可以使用if逻辑判断.在shell中if判断的基本 ...
- 盘点!HelloGitHub 年度热门开源项目
春节将至,HelloGitHub 也迎来了年终盘点时刻.这是一份送给开源爱好者的"年终盛宴",期待你在这里发现更多值得关注的开源佳作. 为了满足不同读者的需求,我精心准备了这期超长 ...