三重DES

目录

1.1 简介

1.2 三重DES加密图解

1.3 三重DES解密图解

1.4 图解说明

1.5 Golang中对3DES的操作


1.1 简介

现在DES已经可以在现实的时间内被暴力破解,因此我们需要一种用来替代DES的分组密码,三重DES就是出于这个目的被开发出来的。

三重DES(triple-DES)是为了增加DES的强度,==将DES重复3次所得到的一种密码算法==,通常缩写为3DES

1.2 三重DES加密图解

明文经过三次DES处理才能变成最后的密文,由于DES密钥长度实质是56位,因此3DES的密钥长度就是56*3=168比特。

注意:三重DES的三次DES加密是(加密->解密->加密),而不是(加密->加密->加密),为什么这样设计呢?看看下面这张图就明白了。

如果三次DES加密的密钥都相同,前两次DES,相当于还原成了密文,这样看来,真正起作用的只是最后一次。这样做的好处是:三重DES对DES具备向下兼容性。

还有一种密码叫DES-EDE2,下面我们用图来描述这一种密码。

当然,只有三个密钥互不相等才是正宗的DES-EDE3。

1.3 三重DES解密图解

三重DES的解密过程和加密过程正好相反,是以密钥3、密钥2、密钥1的顺序执行解密->加密->解密的操作。

1.4 图解说明

自己想去吧,其实老子也懵逼........手动滑稽

1.5 Golang中对3DES的操作

  •  加密思路实现:
  1. 创建并返回一个使用3DES算法的cipher.Block接口 ,秘钥长度为64bit*3=192bit, 即 192/8 = 24字节(byte)
  2. 对最后一个明文分组进行数据填充 ,3DES是以64比特的明文(比特序列)为一个单位来进行加密的 ,最后一组不够64bit, 则需要进行数据填充 ,最后一组不够64bit, 则需要进行数据填充
  3. 创建一个密码分组为链接模式的, 底层使用3DES加密的BlockMode接口
  4. 加密连续的数据块
  5. 返回数据
  •  解密思路实现:
  1. 创建并返回一个使用3DES算法的cipher.Block接口
  2. 创建一个密码分组为链接模式的, 底层使用3DES解密的BlockMode接口
  3. 数据块解密
  4. 去掉最后一组的填充数据
  5. 数据返回
  • 3DES加密代码 :
// 3DES加密
func TripleDESEncrypt(src, key []byte) []byte {
	// 1. 创建并返回一个使用3DES算法的cipher.Block接口
	block, err := des.NewTripleDESCipher(key)
	if err != nil{
		panic(err)
	}
	// 2. 对最后一组明文进行填充
	src = PKCS5Padding(src, block.BlockSize())
	// 3. 创建一个密码分组为链接模式, 底层使用3DES加密的BlockMode模型
	blockMode := cipher.NewCBCEncrypter(block, key[:8])
	// 4. 加密数据
	dst := src
	blockMode.CryptBlocks(dst, src)
	return dst
}
  • 3DES解密代码 :
// 3DES解密
func TripleDESDecrypt(src, key []byte) []byte {
	// 1. 创建3DES算法的Block接口对象
	block, err := des.NewTripleDESCipher(key)
	if err != nil{
		panic(err)
	}
	// 2. 创建密码分组为链接模式, 底层使用3DES解密的BlockMode模型
	blockMode := cipher.NewCBCDecrypter(block, key[:8])
	// 3. 解密
	dst := src
	blockMode.CryptBlocks(dst, src)
	// 4. 去掉尾部填充的数据
	dst = PKCS5UnPadding(dst)
	return dst
}
  • 重要的函数说明 :
  1. 生成一个底层使用3DES加/解密的Block接口对象
    函数对应的包: import "crypto/des"
    func NewTripleDESCipher(key []byte) (cipher.Block, error)
    	- 参数 key: 3des对称加密使用的密码, 密码长度为(64*3)bit, 即(8*3)byte
    	- 返回值 cipher.Block: 创建出的使用DES加/解密的Block接口对象
  2. 创建一个密码分组为CBC模式, 底层使用b加密的BlockMode接口对象
    函数对应的包: import "crypto/cipher"
    func NewCBCEncrypter(b Block, iv []byte) BlockMode
        - 参数 b: 使用des.NewTripleDESCipher 函数创建出的Block接口对象
        - 参数 iv: 事先准备好的一个长度为一个分组长度的比特序列, 每个分组为64bit, 即8byte
        - 返回值: 得到的BlockMode接口对象
  3. 使用cipher包的BlockMode接口对象对数据进行加/解密

    接口对应的包: import "crypto/cipher"
    type BlockMode interface {
        // 返回加密字节块的大小
        BlockSize() int
        // 加密或解密连续的数据块,src的尺寸必须是块大小的整数倍,src和dst可指向同一内存地址
        CryptBlocks(dst, src []byte)
    }
    接口中的 CryptBlocks(dst, src []byte) 方法:
        - 参数 dst: 传出参数, 存储加密或解密运算之后的结果 
        - 参数 src: 传入参数, 需要进行加密或解密的数据切片(字符串)
  4. 创建一个密码分组为CBC模式, 底层使用b解密的BlockMode接口对象
函数对应的包: import "crypto/cipher"
func NewCBCDecrypter(b Block, iv []byte) BlockMode
    - 参数 b: 使用des.NewTripleDESCipher 函数创建出的Block接口对象
    - 参数 iv: 事先准备好的一个长度为一个分组长度的比特序列, 每个分组为64bit, 即8byte, 
               该序列的值需要和NewCBCEncrypter函数的第二个参数iv值相同
    - 返回值: 得到的BlockMode接口对象

你想要成为什么,你就是什么......

猜你喜欢

转载自blog.csdn.net/boss2967/article/details/82974047
今日推荐