image.png
image.png
image.png
image.png
image.png
image.png
image.png
DES-CBC实例:
package main
import (
"crypto/cipher"
"crypto/des"
"encoding/hex"
"fmt"
"gopcp/cryptology/utils"
)
func main() {
//明文
src := []byte("I Love you")
//秘钥
key := []byte("87654321")
//加密
encrypt_msg := EncryptDES(src, key)
fmt.Println("encrypt_msg = ", hex.EncodeToString(encrypt_msg))//encrypt_msg = cdacd3001fefdcd6f84593a17a3c0866
//解密
decrypt_msg := DecryptDES(encrypt_msg, key)
fmt.Println("decrypt_msg = ", string(decrypt_msg))//decrypt_msg = I Love you
}
//加密
func EncryptDES(src, key []byte) []byte {
//通过秘钥创建加密块
block, err := des.NewCipher(key)
if err != nil {
panic(err)
}
//获取每个块的大小
blockSize := block.BlockSize()
//对明文进行填充
src = utils.ZeroPadding(src, blockSize)
//构建初始化向量
iv := []byte("12345678")
//创建CBC加密模式
blockMode := cipher.NewCBCEncrypter(block, iv)
dst := make([]byte, len(src))
blockMode.CryptBlocks(dst, src)
return dst
}
//解密
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.ZeroUnPadding(dst)
}
package utils
import "bytes"
//填充最后一个分组
//src:待填充的明文
//blockSize:分组大小
func PaddingText(src []byte, blockSize int) []byte {
//求出最后一个分组需要填充的字节数
padding := blockSize - len(src)%blockSize
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
padtext := bytes.Repeat([]byte{0}, padding)
return append(ciphertext, padtext...)
}
//去除尾部填充数据
func ZeroUnPadding(origdata []byte) []byte {
return bytes.TrimRightFunc(origdata, func(r rune) bool {
return r == rune(0)
})
}