package main
import (
"bytes"
"crypto/cipher"
"crypto/des"
"fmt"
)
//创建一个用来加密的填充数据函数
func paddingInfo(src []byte, blockSize int) []byte {
//1.获取src的长度,blocksize对于des是8
length := len(src) //获取明文长度
//2.对blocksize进行进行取余数.
remains := length % blockSize //用总长度来除以8个字节的块,取它的余数
//3.获取要填的数量 = blocksize - 余数
paddingNumber := blockSize - remains //用8个字节的块减去余数,获得要补全的元素个数(得到一个int型数字)
//4.将填充的数字转换成字符,创建了只有一个字符的切片
s1 := []byte{byte(paddingNumber)} //把要补全的个数转换成字节,把新的字节型切片赋值给s1
//5.创造一个有4个"4"的切片
s2 := bytes.Repeat(s1,paddingNumber) //把4个长度的所有元素都补全成为4
//6.将填充的切片追加到src后面
s3 := append(src,s2...) //在明文后面补上,最后一个快里缺少的元素
return s3 //把完整的可以加密的块返回给加密函数
}
//创建加密函数
func desCBCEncrypt(src,key[]byte) []byte {
//1.创建并返回一个使用des算法的cipher.block接口.
block, err := des.NewCipher(key)//调用加密函数,返回值为一个模块,和错误信息
if err != nil {
panic(err)
}
//2.填充数据,将输入的明文构造成8的倍数
src = paddingInfo(src,block.BlockSize())//填充数据,用来补全模块
//3.创建CBC分组模式,返回一个密码分组的链接模式,底层用b加密的Blockmode接口,初始向量iv的长度必须等于b的块尺寸
iv := []byte("12345678")
blockMode := cipher.NewCBCEncrypter(block, iv)//创建分组模块,每块为8字节的切片
//4.加密处理
blockMode.CryptBlocks(src /*密文*/,src) //把明文内的完整块和补全来的块一起进行加密
return src //返回一个加密后的乱码
}
//创建一个用来解密的填充数据函数
func unpaddingIfo(src []byte) []byte {
//1.获取src长度
length := len(src)//获得切片长度
//2.得到最后一个字符
lastChar := src[length-1]//截取切片的最后一个元素
//3.将字符转为数字
number := int(lastChar)//把切片的最后一个元素转换成整形
//4.截取需要的长度
return src[: length-number]//截取总长度减去多余元素,获得未加密前的所有数据
}
//创建解密函数
func desCBCDecrypt(cipherData,key []byte) []byte {
//1.创建并返回一个使用DES算法的cipher.block接口
block, err := des.NewCipher(key) //调用密码算法函数参数为秘钥,返回为多个块
if err != nil {
panic(err)
}
//2.创建CBC分组模式
iv := []byte("12345678")
blockMode := cipher.NewCBCDecrypter(block,iv)//把块分解为8个字符一个的块
//3.开始解密
blockMode.CryptBlocks(cipherData/*明文*/,cipherData)//去掉块(或得多个切片)
//4.去掉填充数据(一定要在解密之后执行去掉填充)
plainText/*纯文本*/ := unpaddingIfo(cipherData)
return plainText
}
func main() {
//创建明文和秘钥
src := []byte("123456789lkpo")
key := []byte("23432345")
//进行加密
encrypt := desCBCEncrypt(src, key)
fmt.Printf("encrypt :=%x\n",encrypt)
//进行解密
plainText := desCBCDecrypt(encrypt, key)
fmt.Printf("encrypt := %s\n",plainText)
}
对称加密-DES-CBC
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...