Golang实现简单的AES加解密

package main

import (
   "bytes"
   "crypto/aes"
   "crypto/cipher"
   "encoding/base64"
   "fmt"
)

func PKCS7Padding(ciphertext []byte, blockSize int) []byte {
   padding := blockSize - len(ciphertext)%blockSize
   padtext := bytes.Repeat([]byte{byte(padding)}, padding)
   return append(ciphertext, padtext...)
}

func PKCS7UnPadding(origData []byte) []byte {
   length := len(origData)
   unpadding := int(origData[length-1])
   return origData[:(length - unpadding)]
}

//AES加密,CBC
func AesEncrypt(origData, key []byte) ([]byte, error) {
   block, err := aes.NewCipher(key)
   if err != nil {
      return nil, err
   }
   blockSize := block.BlockSize()
   origData = PKCS7Padding(origData, blockSize)
   blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
   crypted := make([]byte, len(origData))
   blockMode.CryptBlocks(crypted, origData)
   return crypted, nil
}

//AES解密
func AesDecrypt(crypted, key []byte) ([]byte, error) {
   block, err := aes.NewCipher(key)
   if err != nil {
      return nil, err
   }
   blockSize := block.BlockSize()
   blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
   origData := make([]byte, len(crypted))
   blockMode.CryptBlocks(origData, crypted)
   origData = PKCS7UnPadding(origData)
   return origData, nil
}

func main() {
   text := "123456789" // 你要加密的数据
   AesKey := []byte("#HvL%$o0oNNoOZnk#o2qbqCeQB1iXeIR") // 对称秘钥长度必须是16的倍数

   fmt.Printf("明文: %s\n秘钥: %s\n", text, string(AesKey))
   encrypted, err := AesEncrypt([]byte(text), AesKey)
   if err != nil {
      panic(err)
   }
   fmt.Printf("加密后: %s\n", base64.StdEncoding.EncodeToString(encrypted))
   //encrypteds, _ := base64.StdEncoding.DecodeString("j4H4Tv5VcXv0oNLwB/fr+g==")
   origin, err := AesDecrypt(encrypted, AesKey)
   if err != nil {
      panic(err)
   }
   fmt.Printf("解密后明文: %s\n", string(origin))
}
点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注