golang aes ECB加密解密
时间:2020-08-10 02:49:34 +0800 CST 浏览:1853

看到网上有些分享的aes ECB加密都是有问题的,这里发一个修复版。

/**
 * @author 张文兵
 * @mail wenbing@mgtv.com
 * @blog https://zhangwenbing.com/
 * @datetime 2020-08-06 19:40:49
 * @description
 */

package ecb

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

// Tool ECB工具的加密解密
// key字节长度16
type Tool struct {
    Key string
}

// NewTool 新建一个ECB加密工具
func NewTool(key string) *Tool {
    return &Tool{Key: key}
}

func (ecbTool *Tool) padding(src []byte) []byte {
    //填充个数
    paddingCount := aes.BlockSize - len(src)%aes.BlockSize
    if paddingCount == aes.BlockSize {
        return src
    }
    //填充数据
    return append(src, bytes.Repeat([]byte{byte(0)}, paddingCount)...)
}

//unpadding
func (ecbTool *Tool) unPadding(src []byte) []byte {
    for i := len(src) - 1; ; i-- {
        if src[i] != 0 {
            return src[:i+1]
        }
    }
}

// Encrypt ECB加密
func (ecbTool *Tool) Encrypt(src []byte) ([]byte, error) {
    block, err := aes.NewCipher([]byte(ecbTool.Key))
    if err != nil {
        return nil, err
    }

    //padding
    src = ecbTool.padding(src)

    decrypted := make([]byte, len(src))
    size := aes.BlockSize

    for bs, be := 0, size; bs < len(src); bs, be = bs+size, be+size {
        if src[bs] == 0 {
            continue
        }
        block.Encrypt(decrypted[bs:be], src[bs:be])
    }

    return ecbTool.unPadding(decrypted), nil
}

// Decrypt ECB解密
func (ecbTool *Tool) Decrypt(src []byte) ([]byte, error) {
    block, err := aes.NewCipher([]byte(ecbTool.Key))
    if err != nil {
        return nil, err
    }

    //padding
    src = ecbTool.padding(src)

    decrypted := make([]byte, len(src))
    size := aes.BlockSize

    for bs, be := 0, size; bs < len(src); bs, be = bs+size, be+size {
        block.Decrypt(decrypted[bs:be], src[bs:be])
    }

    return ecbTool.unPadding(decrypted), nil
}

// Base64 base64加密
func (ecbTool *Tool) Base64(src []byte) string {
    return base64.RawURLEncoding.EncodeToString(src)
}

// UnBase64 base64解密
func (ecbTool *Tool) UnBase64(src string) ([]byte, error) {
    return base64.RawURLEncoding.DecodeString(src)
}


如果这篇文章对你有所帮助,可以通过下边的“打赏”功能进行小额的打赏。

本网站部分内容来源于互联网,如有侵犯版权请来信告知,我们将立即处理。


来说两句吧