提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、DES是什么?
- 二、go语言实现
- 1.使用CBC模式
- 1.使用ECB模式
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、DES是什么?
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
二、go语言实现
1.使用CBC模式
// directory: src/demo/1DES-cbc.go
package mainimport ("crypto/des""demo1/utils""crypto/cipher""fmt""encoding/hex"
)//使用des算法进行加密
//src:待加密的明文 key:秘钥
func EncryptDES(src, key []byte) []byte {//创建cipher.Block.接口,其对应的就是一个加密块block, err := des.NewCipher(key)if err != nil {panic(err)}//获取每个块的大小length := block.BlockSize()//对最后一组明文进行填充src = utils.PaddingText(src, length)//初始化向量iv := []byte("12345678")//创建cbc加密模式blockMode := cipher.NewCBCEncrypter(block, iv)//创建切片,用于存储加密之后的数据dst := make([]byte, len(src))blockMode.CryptBlocks(dst, src)return dst
}//使用des进行解密
//src:待解密的密文 key:秘钥
func DecryptDES(src, key []byte) []byte {block, err := des.NewCipher(key)if err != nil {panic(err)}iv := []byte("12345678")//创建CBC解密模式blockMode := cipher.NewCBCDecrypter(block, iv)dst := make([]byte, len(src))blockMode.CryptBlocks(dst, src)return utils.UnPaddingText(dst)
}func main() {src := []byte("wei")key := []byte("87654321")encrypt_msg := EncryptDES(src, key)//fmt.Println("encrypt_msg = ", encrypt_msg)fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))decrypt_msg := DecryptDES(encrypt_msg, key)fmt.Println("decrypt_msg = ", string(decrypt_msg))
}
// directory : src/demo1/utils/utils.go
package utilsimport "bytes"//填充最后一个分组
//src:待填充的数据, blockSize:分组大小
func PaddingText(src []byte, blockSize int) []byte {//求出最后一个分组需要填充的字节数padding := blockSize - len(src)%blockSize//创建新的切片,切片的字节数为padding。padText := bytes.Repeat([]byte{byte(padding)}, padding)//将新创建的切片和待填充的数据进行拼接nextText := append(src, padText...)return nextText
}//删除尾部填充数据
func UnPaddingText(src []byte) []byte {//获取待处理的数据的长度len := len(src)//去除最后一个字符number := int(src[len-1])newText := src[:len-number]return newText
}//ciphertext:待填充的数据 blocksize:每个块的大小
func ZeroPadding(ciphertext []byte, blocksize int) []byte {padding := blocksize - len(ciphertext)%blocksize//填充0padtext := bytes.Repeat([]byte{0}, padding)return append(ciphertext, padtext...)
}//去除尾部填充的0
func ZeroUnPadding(origdata []byte) []byte {return bytes.TrimRightFunc(origdata, func(r rune) bool {return r == rune(0)})
}
1.使用ECB模式
package mainimport ("crypto/des""demo1/utils""fmt""encoding/hex"
)//加密
func DesECBEncrypt(data, key []byte) []byte {block, err := des.NewCipher(key)if err != nil {panic(err)}length := block.BlockSize()data = utils.ZeroPadding(data,length)out := make([]byte, len(data))dst := outfor len(data) > 0 {//每次加密8字节block.Encrypt(dst, data[:length])//去除已被加密的数据data = data[length:]dst = dst[length:]}return out
}//解密
func DesECBDecrypt(data, key []byte) []byte{block, err := des.NewCipher(key)if err != nil {panic(err)}length := block.BlockSize()out := make([]byte, len(data))dst := outfor len(data) > 0 {block.Decrypt(dst, data[:length])data = data[length:]dst = dst[length:]}out = utils.ZeroUnPadding(out)return out
}func main() {key := []byte("12345678")data := []byte("wei")encrypt_msg := DesECBEncrypt(data, key)fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))decrypt_msg := DesECBDecrypt(encrypt_msg, key)fmt.Println("decrypt_msg = ", string(decrypt_msg))
}