前端之家收集整理的这篇文章主要介绍了
golang DES跟base64相结合加解密,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
// DEStest project DEStest.go
//注意base64对中文不同编码加解密结果不一样,即UTF-8跟GBK
package main
import (
"bytes"
"crypto/cipher"
"crypto/des"
"encoding/base64"
"fmt"
"github.com/axgle/mahonia"
)
//DES加密
func DesEncrypt(origData,key []byte) (string,error) {
//UTF-8 to GBK
var enc mahonia.Encoder
enc = mahonia.NewEncoder("gbk")
origDataStr := enc.ConvertString(string(origData))
origData = []byte(origDataStr)
block,err := des.NewCipher(key)
if err != nil {
return "",err
}
origData = PKCS5Padding(origData,block.BlockSize())
// origData = ZeroPadding(origData,block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block,key)
crypted := make([]byte,len(origData))
// 根据CryptBlocks方法的说明,如下方式初始化crypted也可以
//crypted := origData
blockMode.CryptBlocks(crypted,origData)
//base64加密
encodeString := base64.StdEncoding.EncodeToString(crypted)
return encodeString,nil
}
func PKCS5Padding(ciphertext []byte,blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)},padding)
return append(ciphertext,padtext...)
}
//DES解密
func DesDecrypt(encodeString string,error) {
var dec mahonia.Decoder
//base64解密
crypted,err := base64.StdEncoding.DecodeString(encodeString)
block,err
}
blockMode := cipher.NewCBCDecrypter(block,key)
origData := crypted
blockMode.CryptBlocks(origData,crypted)
//origData = PKCS5UnPadding(origData)
origData = ZeroUnPadding(origData)
//GBK to UTF-8
dec = mahonia.NewDecoder("gbk")
origDataStr := dec.ConvertString(string(origData))
return origDataStr,nil
}
func ZeroUnPadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
func main() {
b := []byte("中国人")
c := []byte("12345678")
a,_ := DesEncrypt(b,c)
fmt.Println(a)
q,_ := DesDecrypt(a,c)
fmt.Println(q)
}