golang DES跟base64相结合加解密

来源:互联网 发布:简单c语言程序 编辑:程序博客网 时间:2024/05/16 17:43
// DEStest project DEStest.go
//注意base64对中文不同编码加解密结果不一样,即UTF-8跟GBKpackage mainimport ("bytes""crypto/cipher""crypto/des""encoding/base64""fmt""github.com/axgle/mahonia")//DES加密func DesEncrypt(origData, key []byte) (string, error) {//UTF-8 to GBKvar enc mahonia.Encoderenc = 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 := origDatablockMode.CryptBlocks(crypted, origData)//base64加密encodeString := base64.StdEncoding.EncodeToString(crypted)return encodeString, nil}func PKCS5Padding(ciphertext []byte, blockSize int) []byte {padding := blockSize - len(ciphertext)%blockSizepadtext := bytes.Repeat([]byte{byte(padding)}, padding)return append(ciphertext, padtext...)}//DES解密func DesDecrypt(encodeString string, key []byte) (string, error) {var dec mahonia.Decoder//base64解密crypted, err := base64.StdEncoding.DecodeString(encodeString)block, err := des.NewCipher(key)if err != nil {return "", err}blockMode := cipher.NewCBCDecrypter(block, key)origData := cryptedblockMode.CryptBlocks(origData, crypted)//origData = PKCS5UnPadding(origData)origData = ZeroUnPadding(origData)//GBK to UTF-8dec = 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)}

原创粉丝点击