编程语言
首页 > 编程语言> > GO的DES/3DES加密算法的实现及通信透彻解析

GO的DES/3DES加密算法的实现及通信透彻解析

作者:互联网

GO的DES/3DES加密算法的实现及通信透彻解析

前位语:

各位老铁万福金安,相信各位之所以找到这篇文章,肯定是因为项目遇到了关于des/des3的相关问题.不要着急,建议耐下性子花上半个小时,理解完本篇文章,你的问题将迎刃而解.

前景提要:

最近因工作需要,接触到des加密算法; 但是因为des加密容易被暴力破解,所以项目中用到的是3des加密算法,也就是des三重加密.

这里还有要提的是, 因为之前的项目是c++服务, 所以这里的情况就是加密方用的c++, 解密方用的是GO;所以这里我们也会讲到des在各个语言的通信.

一、DES介绍

DES(Data Encryption Standard)是对称加密算法, DES三个入口参数: key、data、mode.

key: 加密/解密的密钥,项目中自己设计的一串字符串. 因为des加密为对称加密, 所以加解密用的密钥key是同一个.

data: 加密时为明文数据(源数据). 解密时为密文数据, 需要将其还原.

mode: 工作模式. 是加密算法底层实现的模式, 按64位进行明文分组.这里大致介绍下两种工作模式.

MODE: ECB

MODE: CBC

使用方法

go get -u github.com/forgoer/openssl

DES

密钥key: 必须为8字节(最好是8位英文+字母的组合)
DES-ECB:

openssl.DesECBEncrypt(src, key, openssl.PKCS7_PADDING)
openssl.DesECBDecrypt(src, key, openssl.PKCS7_PADDING)

DES-CBC:

openssl.DesCBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
openssl.DesCBCDecrypt(src, key, iv, openssl.PKCS7_PADDING)

注:
这里如果多语言进行通信, 需要注意的就是key为8字节, 一致即可, 补齐方式通信双方定义好.

二、3DES加密原理

简介

3DES(Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称. 原理就是对每个数据块进行了三次DES加密算法, 由于计算机能力增强, 原版DES密钥(key)的长度变得容易被暴力破解, 所以3DES通过一种相对简单的办法, 即增加密钥key值的长度(变为24字节)避免类似的攻击.

3DES是DES向AES过渡的加密算法. 具体实现如下:
> 假设: 
==Encry()--代表加密  
Decry()代表解密  
k1,k2,k3代码24字节的密钥分为3段  
src代表明文 
c代表密文==
过程就是这样的:
3DES加密: c = Encryk3(Decryk2(Encryk1(src))   加密(解密(加密))
3DES解密: src = Decryk1(Encryk2(Decryk3(c))   解密(加密(解密))
使用方法
3DES

密钥key: 长度为24字节(最好是24位英文+字母的组合)
3DES-ECB:

openssl.Des3ECBEncrypt(src, key, openssl.PKCS7_PADDING)
openssl.Des3ECBDecrypt(src, key, openssl.PKCS7_PADDING)

3DES-CBC:

openssl.Des3CBCEncrypt(src, key, iv, openssl.PKCS7_PADDING)
openssl.Des3CBCDecrypt(src, key, iv, openssl.PKCS7_PADDING)

注: 这里很多小伙伴会说key不足24字节怎么办, 或者多出24字节怎么办, 这里说下

1.24位密钥,不足24位的右补0x00;
2.加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,…
3.本身已8位对齐的,后面补八个0x08。

下面是GO的key密钥不足24字节的补齐代码

func ZeroPadding(ciphertext []byte, blockSize int) []byte {
	padding := blockSize - len(ciphertext)%blockSize
	padtext := bytes.Repeat([]byte{0}, padding)
	return append(ciphertext, padtext...)
}

如果超出24字节, 建议直接截取, 如果多语言通信, 建议双方商量好.

注意点:

三、多语言通信

综上,跨语言加密解密,应该使用PKCS5Padding填充.

标签:3DES,加密,字节,DES,openssl,解密,key,加密算法
来源: https://blog.csdn.net/hgdl_sanren/article/details/111191762