提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
提示:以下是本篇文章正文内容,下面案例可供参考
一、DES是什么?
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来。需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来。
二、go语言实现
1.使用CBC模式
// directory: src/demo/1DES-cbc.go
package main
import (
"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 utils
import "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
//填充0
padtext := 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 main
import (
"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 := out
for 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 := out
for 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))
}