go中使用des cbc加密解密
加密:
func MyEncrypt(data, key []byte, iv []byte) ([]byte, error) {
/*
key必须是8位,否则报错:
if len(key) != 8 {
return nil, KeySizeError(len(key))
}
*/
block, err := des.NewCipher(key)
if err != nil {
return nil, err
}
bs := block.BlockSize()
data = PKCS5Padding(data, bs) //填充字符
blockMode := cipher.NewCBCEncrypter(block, iv)
out := make([]byte, len(data))
blockMode.CryptBlocks(out, data)
return out, nil
}
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padText := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padText...)
}
func base64Encode(src []byte) []byte {
return []byte(base64.StdEncoding.EncodeToString(src))
}
func main() {
key := []byte("12345678")
iv := []byte("12345678")
data := []byte("hello world")
out, _ := MyEncrypt(data, key, iv)
deByte := base64Encode(out)
log.Println("加密后:", string(deByte)) //2022/01/17 15:40:30 加密后: CyqS6B+0nOGkMmaqyup7gQ==
}
解密:
func MyDecrypt(data []byte, key []byte, iv []byte) ([]byte, error) {
block, err := des.NewCipher(key)
if err != nil {
return nil, err
}
blockMode := cipher.NewCBCDecrypter(block, iv)
out := make([]byte, len(data))
blockMode.CryptBlocks(out, data)
out = PKCS5UnPadding(out)
return out, nil
}
func PKCS5UnPadding(origData []byte) []byte {
length := len(origData)
unPadding := int(origData[length-1])
return origData[:(length - unPadding)]
}
func base64Decode(src []byte) ([]byte, error) {
return base64.StdEncoding.DecodeString(string(src))
}
func main() {
key := []byte("12345678")
iv := []byte("12345678")
src := []byte("CyqS6B+0nOGkMmaqyup7gQ==")
enByte, _ := base64Decode(src)
out, _ := MyDecrypt(enByte, key, iv)
log.Println("解密后:", string(out)) //2022/01/17 15:44:23 解密后: hello world
}

浙公网安备 33010602011771号