Golang中,Aes加解密

今天在用Golang解析php那边用Aes加密的一个key。网上大多是用base64将结果编码一下。而且用到了向量。我php

那边没有用到向量。所以golang这边也是要去掉的。参考网站的改了下。能够和php通用。

另外,需要注意的是加密的key只能是16,24,32.分别对应的是AES-128,AES-192,AES-256等

package main

import (

​	"bytes"

​	"crypto/aes"

​	"crypto/cipher"

​	"encoding/base64"

​	"encoding/hex"

​	"errors"

​	"fmt"

)



//填充

func pad(src []byte) []byte {

​	padding := aes.BlockSize - len(src)%aes.BlockSize

​	padtext := bytes.Repeat([]byte{byte(padding)}, padding)

​	return append(src, padtext...)

}



func unpad(src []byte) ([]byte, error) {

​	length := len(src)

​	unpadding := int(src[length-1])



​	if unpadding > length {

​		return nil, errors.New("unpad error. This could happen when incorrect encryption key is used")

​	}



​	return src[:(length - unpadding)], nil

}



func encrypt(key []byte, text string) (string, error) {

​	block, err := aes.NewCipher(key)

​	if err != nil {

​		return "", err

​	}



​	msg := pad([]byte(text))

​	ciphertext := make([]byte, aes.BlockSize+len(msg))



​	//没有向量,用的空切片

​	iv := make([]byte,aes.BlockSize)
 
​	mode := cipher.NewCBCEncrypter(block, iv)

​	mode.CryptBlocks(ciphertext[aes.BlockSize:], msg)



​	finalMsg := (base64.StdEncoding.EncodeToString(ciphertext))


​	fmt.Println(hex.EncodeToString([]byte(ciphertext[aes.BlockSize:])))


​	return finalMsg, nil

}



func decrypt(key []byte, text string) (string, error) {

​	block, err := aes.NewCipher(key)

​	if err != nil {

​		return "", err

​	}
 

​	decodedMsg,_ := hex.DecodeString(text)



​	iv  :=make([]byte,aes.BlockSize)

​	msg := decodedMsg



​	mode := cipher.NewCBCDecrypter(block, iv)

​	mode.CryptBlocks(msg,msg)



​	unpadMsg, err := unpad(msg)

​	if err != nil {

​		return "", err

​	}



​	return string(unpadMsg), nil

}



func main() {

​	key := []byte("0123456789abcdef")

​	encryptText, _ := encrypt(key, "123456")

​	rawText, err := decrypt(key, "2994dc19badcd3e820065f4f8211f584")

​	fmt.Println("text %s \n", rawText)

}
posted @ 2018-12-20 17:33  随彦心MO  阅读(5022)  评论(0编辑  收藏  举报