Go语言实现三重DES加密算法(CBC模式)

Go语言实现三重DES加密算法(CBC模式)


由于DES已经可以被暴力破解了,三重DES就是为了增加DES的强度,实现原理就是将DES重复三次,通常缩写为3DES。3DES的密钥长度为8byte*3=24byte。

3DES的加密机制为:加密->解密->加密
3DES的解密机制为:解密->加密->解密

CBC模式(密码分组链接模式)是常用的一种分组密码的模式。(点击查看分组密码及CBC模式概述)

实现代码如下:

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

//对明文进行填充
func Padding(plainText []byte,blockSize int) []byte{
	//计算要填充的长度
	n:= blockSize-len(plainText)%blockSize
	//对原来的明文填充n个n
	temp:=bytes.Repeat([]byte{byte(n)},n)
	plainText=append(plainText,temp...)
	return plainText
}
//对密文删除填充
func UnPadding(cipherText []byte) []byte{
	//取出密文最后一个字节end
	end:=cipherText[len(cipherText)-1]
	//删除填充
	cipherText=cipherText[:len(cipherText)-int(end)]
	return cipherText
}

//三重DES加密
func TripleDES_CBC_Encrypt(plainText []byte,key []byte) []byte{
	//指定算法,返回一个三重DES算法的Block的接口对象
	block,err:=des.NewTripleDESCipher(key)
	if err!=nil{
		panic(err)
	}
	//对明文进行填充
	plainText=Padding(plainText,block.BlockSize())
	//指定初始化向量IV,长度必须等于block的块尺寸
	iv:=[]byte("abcdefgh")
	//指定分组模式,返回一个BlockMode接口对象
	blockMode:=cipher.NewCBCEncrypter(block,iv)
	//对连续的数据块进行加密
	cipherText:=make([]byte,len(plainText))
	blockMode.CryptBlocks(cipherText,plainText)
	return cipherText
}

//三重DES解密
func TripleDES_CBC_Decrypt(cipherText []byte,key []byte) []byte{
	//指定解密算法,返回一个Block接口对象
	block,err:=des.NewTripleDESCipher(key)
	if err!=nil{
		panic(err)
	}
	//指定初始化向量IV,长度必须和block的块尺寸一致(和加密的一致)
	iv:=[]byte("abcdefgh")
	//指定分组模式,返回一个BlockMode接口对象
	blockMode:=cipher.NewCBCDecrypter(block,iv)
	//解密
	plainText:=make([]byte,len(cipherText))
	blockMode.CryptBlocks(plainText,cipherText)
	//删除填充
	plainText=UnPadding(plainText)
	//返回明文
	return plainText
}

测试代码如下:

func main(){
	message:=[]byte("hello world")
	//指定密钥
	key:=[]byte("12345678abcdefghijklmnop")
	//加密
	cipherText:=TripleDES_CBC_Encrypt(message,key)
	fmt.Println("加密后为:",string(cipherText))
	//解密
	plainText:=TripleDES_CBC_Decrypt(cipherText,key)
	fmt.Println("解密后为:",string(plainText))
}

测试结果如下:
3DES测试结果

你可能感兴趣的:(Go语言实现三重DES加密算法(CBC模式))