目录
注意:3DES是3重DES加解密算法,具体原理同DES,不在赘述。
引语
DES算法是全网公开的,其安全性是依靠秘钥的,但是随着计算机算力的增长,56位的秘钥容易受到穷举攻击。因此,3DES作为替换升级的方案应运而生。
加密
3DES是对称加密的一种,是DES向AES过渡的加密算法。它使用三个秘钥的三重DES加密方法,该算法执行三次DES算法,其加密的过程是加密-解密-加密。
加密算法公式
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加密算法的兼容。
解密
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...)
}