3DES加密算法

本文深入探讨了3DES加密算法,介绍了3DES作为一种过渡加密算法的由来,以及其加密和解密的过程。文章详细解释了3DES采用加密-解密-加密的方式,以及为何这种方式可以兼容普通DES。此外,还提供了Go语言中使用3DES算法的示例代码,包括密钥长度的要求,以及加密和解密的具体实现。

一、3DES加密

DES是一个经典的对称加密算法,但也缺陷明显,即56位的密钥安全性不足,已被证实可以在短时间内破解。为解决此问题,出现了3DES,也称Triple DES,3DES为DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。为了兼容普通的DES,3DES并没有直接使用 加密->加密->加密 的方式,而是采用了加密->解密->加密 的方式。

当三重密钥均相同时,前两步相互抵消,相当于仅实现了一次加密,因此可实现对普通DES加密算法的兼容。

二、3DES解密

3DES解密过程,与加密过程相反,即逆序使用密钥。是以密钥3、密钥2、密钥1的顺序执行 解密->加密->解密。

相比DES,3DES因密钥长度变长,安全性有所提高,但其处理速度不高。因此又出现了AES加密算法,AES较于3DES速度更快、安全性更高。

三、Go语言使用3DES算法

对比DES,发现只是换了NewTripleDESCipher。不过,需要注意的是,密钥长度必须24byte,否则直接返回错误。

package main

import (
	"crypto/des"
	"bytes"
	"crypto/cipher"
	"fmt"
)

//为最后一组填充数据
func PaddingText(src []byte,blockSize int)[]byte{
	length := len(src)%blockSize
	//获取需要填充的字节数
	padding := blockSize-length
	//填充数据
	paddText := bytes.Repeat([]byte{byte(padding)},padding)
	//将填充数据追加到原始数据
	newText := append(src,paddText...)

	return newText
}

func UnPaddingText(src []byte) []byte{
	length := len(src)
	//取出原始数据最后一个字节
	number := int(src[length-1])
	//去除填充数据
	newText := src[:length-number]

	return newText
}

//使用DES算法对文件进行加密
//src:需要被加密的明文
//key:秘钥
func EncryptDES(src,key []byte)([]byte,error){
	//生成加密用的block
	block, err := des.NewTripleDESCipher(key)
	if err!=nil{
		return []byte(""),err
	}

	length := block.BlockSize()
	//拼接数据
	src = PaddingText(src,length)
	//NewCBCEncrypter第二个参数是初始化向量,长度要求和块大小一样,内容随意(需要和解密初始化向量相同)
	//根据块和向量创建CBC加密模式
	blockMode := cipher.NewCBCEncrypter(block,key[:block.BlockSize()])
	//创建切片,用于存储加密之后的密文
	dest := make([]byte,len(src))
	//加密

	blockMode.CryptBlocks(dest,src)

	return dest,nil
}

//使用DES算法解密
//src:需要被解密的密文
//key:秘钥,需要和加密时使用的秘钥相同
func DecryptDES(src,key []byte)([]byte,error){
	block, err := des.NewTripleDESCipher(key)
	if err != nil{
		return []byte(""),err
	}

	//准备初始化向量
	//创建解密模式
	blockMode := cipher.NewCBCDecrypter(block,key[:block.BlockSize()])
	//创建切片,用于存储解密之后的明文
	dest := make([]byte,len(src))
	//解密
	blockMode.CryptBlocks(dest,src)

	NewText := UnPaddingText(dest)

	return NewText,nil
}

func main(){
	src := []byte("单枪匹马你别怕,一腔孤勇又如何!")
	key := []byte("12345678")

	ciphertext,err := EncryptDES(src,key)
	if err != nil{
		fmt.Println("Encrypt err:",err)
		return
	}
	fmt.Printf("%x\n",ciphertext)

	plaintext,err := DecryptDES(ciphertext,key)
	if err != nil{
		fmt.Println("Decrypt err:",err)
		return
	}

	fmt.Println(string(plaintext))
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值