Go语言中操作DES加密详解 - Go语言中文社区

Go语言中操作DES加密详解


|版权声明:本文为博主原创文章,未经博主允许不得转载。博客地址: https://blog.csdn.net/sgsgy5

今天来讲解一下加密函数中对称加密的DES加密函数,利用go语言实现DES加密解密操作。

加解密思路分析:

  • 加密CBC分组模式
    1:创建并返回一个使用DES算法的cipher.block的接口
    密钥长度为64bit,即64/8字节
    2:对最后一个明文分组进行数据填充
    DES是以64bit的明文为一个单位来进行加密的
    最后一组不够64bit的则需要进行数据填充
    3:创建一个密码分组为链接模式的,底层使用DES加密的BlockMode接口
    4:加密连续的数据块

  • 解密
    1:创建并返回一个使用DES算法的cipher.block的接口
    2:创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
    3:数据块解密
    4:去掉最后一块数据的填充数据

下面我们来看一下代码实现

package main
import (
	"crypto/des"
	"crypto/cipher"
	"fmt"
	"bytes"
	"encoding/base64"
)
/*des加密解密*/

//des的cbc模式加密函数
//src :明文
//key :密钥,大小为8byte
func DesEncrypt_CBC(src ,key []byte)[]byte{  //传递两个参数,src为需要加密的明文,返回[]byte类型数据
	//1:创建并返回一个DES算法的cipher.block接口
	block,err:=des.NewCipher(key)
	//2:判断是否创建成功
	if err!=nil{
		panic(err)
	}
	//3:对最后一个明文分组进行数据填充
	src=PKCS5Padding(src,block.BlockSize())
	//4:创建一个密码分组为链接模式的,底层使用DES加密的BLockMode接口
	//    参数iv的长度,必须等于b的块尺寸
	tmp:=[]byte("helloAAA")  //初始化向量
	blockmode:=cipher.NewCBCEncrypter(block,tmp)
	//5:加密连续的数据块
	dst:=make([]byte,len(src))
	blockmode.CryptBlocks(dst,src)
	//fmt.Println("加密之后的数据:",dst)
	//6:将加密后的数据返回
	return dst
}
//des解密函数
//src :要解密的密文
//key :密钥,和加密密钥相同,大小为8byte
func DesDecrypt_CBC(src ,key []byte)[]byte{
	//1:创建并返回一个使用DES算法的cipher.block接口
	block,err:=des.NewCipher(key)
	//2:判断是否创建成功
	if err!=nil{
		panic(err)
	}
	//创建一个密码分组为链接模式的,底层使用DES解密的BlockMode接口
	tmp:=[]byte("helloAAA")
	blockMode:=cipher.NewCBCDecrypter(block,tmp)
	//解密数据
	dst:=make([]byte,len(src))
	blockMode.CryptBlocks(dst,src)
	//5:去掉最后一组填充数据
	dst=PKCS5UnPadding(dst)

	//返回结果
	return dst
}

//使用pkcs5的方式填充

func PKCS5Padding(ciphertext []byte,blockSize int)[]byte{
	//1:计算最后一个分组缺多少字节
	padding:=blockSize-(len(ciphertext)%blockSize)
	//2:创建一个大小为padding的切片,每个字节的值为padding
	padText:=bytes.Repeat([]byte{byte(padding)},padding)
	//3:将padText添加到原始数据的后边,将最后一个分组缺少的字节数补齐
	newText:=append(ciphertext,padText...)

	return newText
}
//删除pkcs5填充的尾部数据
func PKCS5UnPadding(origData []byte)[]byte{
	//1:计算数据的总长度
	length:=len(origData)
	//2:根据填充的字节值得到填充的次数
	number:=int(origData[length-1])
	//3:将尾部填充的number个字节去掉
	return origData[:(length-number)]
}

func main(){
	//测试
	key:=[]byte("11111111")  //用这个密钥加密解密

	//加密数据
	result:=DesEncrypt_CBC([]byte("床前明月光,疑是地上霜,举头望明月,低头是故乡"),key)
	fmt.Println(base64.StdEncoding.EncodeToString(result))

	//解密
	result=DesDecrypt_CBC(result,key)
	fmt.Println("解密之后的数据:",string(result))
}

看一下效果
在这里插入图片描述
后期将讲解别的加密算法,例如对称加密中的AES加密,非对称加密,椭圆曲线加密算法等等

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/sgsgy5/article/details/83584042
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢