AES加解密

package main

import (
	"bytes"
	"crypto/aes"
	"encoding/base64"
	"errors"
	"reflect"
)

func EncryptToBase64(passwd []byte, data []byte) (string, error) {
	secret, err := Encrypt(passwd, data)
	if err != nil {
		return "", err
	}
	return base64.StdEncoding.EncodeToString(secret), nil
}

func DecryptFromBase64(passwd []byte, data string) ([]byte, error) {
	rawData, err := base64.StdEncoding.DecodeString(data)
	if err != nil {
		return nil, err
	}
	return Decrypt(passwd, rawData)
}

// Encrypt text to cipher text
func Encrypt(key []byte, text []byte) ([]byte, error) {
	c, err := aes.NewCipher(PasswdPadding(key))
	if err != nil {
		return nil, err
	}
	paddingText := PKCS7Padding(text)
	cipherText := make([]byte, len(paddingText))
	for st, ed := 0, aes.BlockSize; ed <= len(paddingText); st, ed = st+aes.BlockSize, ed+aes.BlockSize {
		c.Encrypt(cipherText[st:ed], paddingText[st:ed])
	}
	return cipherText, nil
}

// Decrypt cipher text to text
func Decrypt(key []byte, cipherText []byte) ([]byte, error) {
	c, err := aes.NewCipher(PasswdPadding(key))
	if err != nil {
		return nil, err
	}
	paddingText := make([]byte, len(cipherText))
	for st, ed := 0, aes.BlockSize; ed <= len(paddingText); st, ed = st+aes.BlockSize, ed+aes.BlockSize {
		c.Decrypt(paddingText[st:ed], cipherText[st:ed])
	}
	return PKCS7UnPadding(paddingText)
}

//PasswdPadding Fill 0x00 if the length of key less than 32
func PasswdPadding(key []byte) []byte {
	ret := make([]byte, 32)
	copy(ret, key)
	return ret
}

// PKCS7Padding Fill bytes until the length is an integer multiple of 16 again
func PKCS7Padding(text []byte) []byte {
	padding := 16 - len(text)%16
	paddingText := bytes.Repeat([]byte{byte(padding)}, padding)
	return append(text, paddingText...)
}

// PKCS7UnPadding UnPadding
func PKCS7UnPadding(text []byte) ([]byte, error) {
	length := len(text)
	if length < 16 || text[length-1] > 16 {
		return nil, errors.New("invalid text length")
	}
	unPadding := int(text[length-1])
	ed := length - unPadding
	return text[:ed], nil
}

func main() {
	key := []byte("0123456789abcdeffafff")
	text := []byte("0123456789abcdef0123456789abcdef")
	encText, err := EncryptToBase64(key, text)
	if err != nil {
		panic(err)
	}

	decText, err := DecryptFromBase64(key, encText)
	if err != nil {
		panic(err)
	}

	println("秘钥:", string(key))
	println("原文:", string(text))
	println("密文:", string(encText))
	println("解密:", string(decText))
	println("原文与解密后文字是否相等:", reflect.DeepEqual(text, decText))
}
秘钥: 0123456789abcdeffafff
原文: 0123456789abcdef0123456789abcdef
密文: lwYlRgu+3JGWLJmLlkO4FZcGJUYLvtyRliyZi5ZDuBUgV7at5VdidSdAAj40elq0
解密: 0123456789abcdef0123456789abcdef
原文与解密后文字是否相等: true
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

metabit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值