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)

}

转载于:https://www.cnblogs.com/smartrui/p/10150759.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值