golang使用aes庫實現加解密操作
阿新 • • 發佈:2020-12-23
golang實現加密解密的庫很多,這裡使用的是aes庫+base64庫來實現.
使用時,需要指定一個私鑰,來進行加解密,這裡指定是:
var aeskey = []byte(“321423u9y8d2fwfl”)
上程式碼:
package main import ( "fmt" "crypto/cipher" "crypto/aes" "bytes" "encoding/base64" ) func PKCS5Padding(ciphertext []byte,blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize padtext := bytes.Repeat([]byte{byte(padding)},padding) return append(ciphertext,padtext...) } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) unpadding := int(origData[length-1]) return origData[:(length - unpadding)] } func AesEncrypt(origData,key []byte) ([]byte,error) { block,err := aes.NewCipher(key) if err != nil { return nil,err } blockSize := block.BlockSize() origData = PKCS5Padding(origData,blockSize) blockMode := cipher.NewCBCEncrypter(block,key[:blockSize]) crypted := make([]byte,len(origData)) blockMode.CryptBlocks(crypted,origData) return crypted,nil } func AesDecrypt(crypted,err } blockSize := block.BlockSize() blockMode := cipher.NewCBCDecrypter(block,key[:blockSize]) origData := make([]byte,len(crypted)) blockMode.CryptBlocks(origData,crypted) origData = PKCS5UnPadding(origData) return origData,nil } func main() { var aeskey = []byte("321423u9y8d2fwfl") pass := []byte("vdncloud123456") xpass,err := AesEncrypt(pass,aeskey) if err != nil { fmt.Println(err) return } pass64 := base64.StdEncoding.EncodeToString(xpass) fmt.Printf("加密後:%v\n",pass64) bytesPass,err := base64.StdEncoding.DecodeString(pass64) if err != nil { fmt.Println(err) return } tpass,err := AesDecrypt(bytesPass,aeskey) if err != nil { fmt.Println(err) return } fmt.Printf("解密後:%s\n",tpass) }
輸出:
加密後:rLyZug0MCEF2TBcJdhMyjg==
解密後:vdncloud123456
補充:Golang AES CBC 加密
我就廢話不多說了,大家還是直接看程式碼吧~
package main import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) const ( key = "2018201820182018" iv = "1234567887654321" ) func main() { str := "我勒個去" es,_ := AesEncrypt(str,[]byte(key)) fmt.Println(es) ds,_ := AesDecrypt(es,[]byte(key)) fmt.Println(string(ds)) } func AesEncrypt(encodeStr string,key []byte) (string,error) { encodeBytes := []byte(encodeStr) //根據key 生成密文 block,err := aes.NewCipher(key) if err != nil { return "",err } blockSize := block.BlockSize() encodeBytes = PKCS5Padding(encodeBytes,[]byte(iv)) crypted := make([]byte,len(encodeBytes)) blockMode.CryptBlocks(crypted,encodeBytes) return base64.StdEncoding.EncodeToString(crypted),nil } func PKCS5Padding(ciphertext []byte,blockSize int) []byte { padding := blockSize - len(ciphertext)%blockSize //填充 padtext := bytes.Repeat([]byte{byte(padding)},padtext...) } func AesDecrypt(decodeStr string,error) { //先解密base64 decodeBytes,err := base64.StdEncoding.DecodeString(decodeStr) if err != nil { return nil,err } block,err } blockMode := cipher.NewCBCDecrypter(block,[]byte(iv)) origData := make([]byte,len(decodeBytes)) blockMode.CryptBlocks(origData,decodeBytes) origData = PKCS5UnPadding(origData) return origData,nil } func PKCS5UnPadding(origData []byte) []byte { length := len(origData) unpadding := int(origData[length-1]) return origData[:(length - unpadding)] }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支援我們。如有錯誤或未考慮完全的地方,望不吝賜教。