aes是对称加密算法,这篇博客只介绍怎么使用golang中怎么调用标准库已封装的算法实现,如果是要学习aes算法实现,移步百度
有两个操作:加密和解密
const BlockSize = 16
功能说明:AES算法块(加密数据块)的字节长度。
package main
import (
"bytes"
"crypto/aes"
"crypto/cipher"
"log"
"fmt"
)
// 填充数据
func padding(src []byte, blockSize int) []byte {
padNum := blockSize - len(src) % blockSize
pad := bytes.Repeat([]byte{byte(padNum)}, padNum)
return append(src, pad...)
}
// 去掉填充数据
func unpadding(src []byte) []byte {
n := len(src)
unPadNum := int(src[n-1])
return src[:n-unPadNum]
}
// 加密
func encryptAES(src []byte, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
src = padding(src, block.BlockSize())
blockMode := cipher.NewCBCEncrypter(block, key)
blockMode.CryptBlocks(src, src)
return src, nil
}
// 解密
func decryptAES(src []byte, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
blockMode := cipher.NewCBCDecrypter(block, key)
blockMode.CryptBlocks(src, src)
src = unpadding(src)
return src, nil
}
func main() {
d := []byte("hello,ase")
key := []byte("hgfedcba87654321")
fmt.Println("加密前:", string(d))
x1, err := encryptAES(d, key)
if err != nil {
log.Fatalln(err)
}
fmt.Println("加密后:", string(x1))
x2, err := decryptAES(x1, key)
if err != nil {
log.Fatalln(err)
}
fmt.Println("解密后:", string(x2))
}
网友评论