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)

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM