网站换皮肤了
golang aes ECB加密解密
时间:2020-01-02 10:30 浏览:250

摘要

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


package ecb

import (
    "bytes"
    "crypto/aes"
)

// Tool ECB工具的加密解密
// key字节长度 16 24 32长度 对应的是AES-128 AES-192  AES-256
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 == 0 {
        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
    }

    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
}




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

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


来说两句吧