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

摘要

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


package aes

import (
	"bytes"
	"crypto/aes"
)

//AES ECB模式的加密解密
type AesTool struct {
	//128 192  256位的其中一个 长度 对应分别是 16 24  32字节长度
	Key       []byte
	BlockSize int
}

func NewAesTool(key []byte, blockSize int) *AesTool {
	return &AesTool{Key: key, BlockSize: blockSize}
}

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

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

func (this *AesTool) Encrypt(src []byte) ([]byte, error) {
	//key只能是 16 24 32长度
	block, err := aes.NewCipher([]byte(this.Key))
	if err != nil {
		return nil, err
	}
	//padding
	src = this.padding(src)

	decrypted := make([]byte, len(src))
	size := this.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 this.unPadding(decrypted), nil
}

func (this *AesTool) Decrypt(src []byte) ([]byte, error) {
	//key只能是 16 24 32长度
	block, err := aes.NewCipher([]byte(this.Key))
	if err != nil {
		return nil, err
	}

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

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

	return this.unPadding(decrypted), nil
}




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

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


来说两句吧