| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package utils
- import (
- "bytes"
- "crypto/aes"
- "crypto/cipher"
- "errors"
- )
- // AESSecretKey AES密钥
- const AESSecretKey = "0d299ce2d4105282f7471074cb0f9f9d"
- // AESEncrypt AES加密
- func AESEncrypt(plaintext, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, errors.New("错误的数据或密钥")
- }
- ecb := NewECBEncrypter(block)
- content := plaintext[:]
- content = PKCS5Padding(content, block.BlockSize())
- crypted := make([]byte, len(content))
- ecb.CryptBlocks(crypted, content)
- return crypted, nil
- }
- // AESDecrypt AES
- func AESDecrypt(crypted, key []byte) ([]byte, error) {
- block, err := aes.NewCipher(key)
- if err != nil {
- return nil, errors.New("错误的密钥")
- }
- blockMode := NewECBDecrypter(block)
- if len(crypted)%blockMode.BlockSize() != 0 {
- return nil, errors.New("错误的数据")
- }
- origData := make([]byte, len(crypted))
- blockMode.CryptBlocks(origData, crypted)
- origData = PKCS5UnPadding(origData)
- return origData, nil
- }
- // PKCS5Padding ECB PKCS5Padding
- func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
- padding := blockSize - len(ciphertext)%blockSize
- padtext := bytes.Repeat([]byte{byte(padding)}, padding)
- return append(ciphertext, padtext...)
- }
- // PKCS5UnPadding ECB PKCS5Unpadding
- func PKCS5UnPadding(origData []byte) []byte {
- length := len(origData)
- // 去掉最后一个字节 unpadding 次
- unpadding := int(origData[length-1])
- // 防止数据越界崩溃
- if length-unpadding >= len(origData) {
- return origData
- }
- return origData[:(length - unpadding)]
- }
- type ecb struct {
- b cipher.Block
- blockSize int
- }
- func newECB(b cipher.Block) *ecb {
- return &ecb{
- b: b,
- blockSize: b.BlockSize(),
- }
- }
- type ecbEncrypter ecb
- // NewECBEncrypter returns a BlockMode which encrypts in electronic code book
- // mode, using the given Block.
- func NewECBEncrypter(b cipher.Block) cipher.BlockMode {
- return (*ecbEncrypter)(newECB(b))
- }
- func (x *ecbEncrypter) BlockSize() int { return x.blockSize }
- func (x *ecbEncrypter) CryptBlocks(dst, src []byte) {
- if len(src)%x.blockSize != 0 {
- panic("crypto/cipher: input not full blocks")
- }
- if len(dst) < len(src) {
- panic("crypto/cipher: output smaller than input")
- }
- for len(src) > 0 {
- x.b.Encrypt(dst, src[:x.blockSize])
- src = src[x.blockSize:]
- dst = dst[x.blockSize:]
- }
- }
- type ecbDecrypter ecb
- // NewECBDecrypter returns a BlockMode which decrypts in electronic code book
- // mode, using the given Block.
- func NewECBDecrypter(b cipher.Block) cipher.BlockMode {
- return (*ecbDecrypter)(newECB(b))
- }
- func (x *ecbDecrypter) BlockSize() int { return x.blockSize }
- func (x *ecbDecrypter) CryptBlocks(dst, src []byte) {
- if len(src)%x.blockSize != 0 {
- panic("crypto/cipher: input not full blocks")
- }
- if len(dst) < len(src) {
- panic("crypto/cipher: output smaller than input")
- }
- for len(src) > 0 {
- x.b.Decrypt(dst, src[:x.blockSize])
- src = src[x.blockSize:]
- dst = dst[x.blockSize:]
- }
- }
|