3DES加密算法原理及实现

目录

引语

加密

加密算法公式

为什么采用加密-解密-加密的形式

解密

代码实现


注意:3DES是3重DES加解密算法,具体原理同DES,不在赘述。

 

引语

DES算法是全网公开的,其安全性是依靠秘钥的,但是随着计算机算力的增长,56位的秘钥容易受到穷举攻击。因此,3DES作为替换升级的方案应运而生。

加密

3DES是对称加密的一种,是DES向AES过渡的加密算法。它使用三个秘钥的三重DES加密方法,该算法执行三次DES算法,其加密的过程是加密-解密-加密。

img
3DES加密流程

 

加密算法公式

3DES使用2个或者3个秘钥,最少112位最多168位。设Ek()和Dk()分别代表DES算法的加密和解密过程,k代表DES算法使用的秘钥,M代表明文,C代表密文,则3DES加密的共识如下:

C = Ek3(Dk2(Ek2(Dk1(C))))

在这里,我们可以使秘钥k1 = k3 ,即使用两个有效的秘钥,已降低对计算机算力的要求;但是,我们不允许k1=k2=k3,因为这样设置,3DES的安全性将退化至DES

 

为什么采用加密-解密-加密的形式

3DES为了向前兼容DES算法,采用了加密-解密-加密的形式 , 简单解释一下:当k1 = k2 = k3时,前两步的结果会相互抵消,相当于仅实现了一次DES加密,因此可以实现对普通DES加密算法的兼容。

 

img
兼容

 

 

解密

3DES解密过程,与加密过程相反,即逆序使用秘钥并执行解密-加密-解密的过程

img
3DES解密过程

 

 

代码实现

使用DES现成类库,实现3DES算法,使用go语言。最近学习go语言,后续有学习笔记。

package main
​
import (
 "crypto/des"
 "bytes"
 "crypto/cipher"
 "fmt"
)
​
//DES 和 3DES加密区别
//前者 加密  密钥必须是8byte
//后者加密 解密 再加密  密钥必须是24byte
func main() {
 //定义密钥,必须是24byte
 key := []byte("123456789012345678901234")
 //定义明文
 origData := []byte("hello world")
​
 //加密
 en := ThriDESEnCrypt(origData,key)
​
 //解密
 de := ThriDESDeCrypt(en,key)
 fmt.Println(string(de))
}
//解密
func ThriDESDeCrypt(crypted,key []byte)[]byte{
 //获取block块
 block,_ :=des.NewTripleDESCipher(key)
 //创建切片
 context := make([]byte,len(crypted))
​
 //设置解密方式
 blockMode := cipher.NewCBCDecrypter(block,key[:8])
 //解密密文到数组
 blockMode.CryptBlocks(context,crypted)
​
 //去补码
 context = PKCSUnPadding(context)
 return context
}
​
//去补码
func PKCSUnPadding(origData []byte)[]byte{
 length := len(origData)
 unpadding := int(origData[length-1])
 return origData[:length-unpadding]
}
//加密
func ThriDESEnCrypt(origData,key []byte)[]byte{
 //获取block块
 block,_ :=des.NewTripleDESCipher(key)
 //补码
 origData = PKCSPadding(origData, block.BlockSize())
 //设置加密方式为 3DES  使用3条56位的密钥对数据进行三次加密
 blockMode := cipher.NewCBCEncrypter(block,key[:8])
​
 //创建明文长度的数组
 crypted := make([]byte,len(origData))
​
 //加密明文
 blockMode.CryptBlocks(crypted,origData)
​
 return crypted
​
​
}
//补码
func PKCSPadding(origData []byte,blockSize int)[]byte{
 //计算需要补几位数
 padding := blockSize-len(origData)%blockSize
 //在切片后面追加char数量的byte(char)
 padtext := bytes.Repeat([]byte{byte(padding)},padding)
​
 return append(origData,padtext...)
}

 

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值