Go   发布时间:2022-04-09  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了golang实现AES ECB模式的加密和解密大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

最近有一个需求需要在golang中实现AES ECB模式的加密和解密,看了一下官方文档和相关资料发现golang 官方包并没有完善的实现,于是自己尝试写了一个,本文中的AES算法是基于ECB模式,关于AES算法的几种模式原理大家可以去百度搜索一下,集中模式如下。

1.电码本模式(ElectronicCodebookBook(ECB))

2.密码分组链接模式(CipherBlockChaining(CBC)

3.计算器模式(Counter(CTR))

4.密码反馈模式(CipherFeedBACk(CFB))

5.@L_675_6@反馈模式(OutputFeedBACk(OFB))


我这里采用的ECB加密基本原理是将明文切分成若干相同的小段,然后对每一段进行加密和解密,最后组合就是最终的结果,AES算法有AES-128、AES-192、AES-256三种,分别对应的key是 16、24、32字节长度,同样对应的加密解密区块长度BlockSize也是16、24、32字节长度。

下面贴上我的实现代码:

package main

import (
	"bytes"
	"crypto/aes"

	"fmt"
)

//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 := aes.blockSize - len(srC)%aes.blockSize
	if paddingCount == 0 {
		return src
	} else {
		//填充数据
		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)
	//返回加密结果
	encryptData := make([]byte,len(srC))
	//存储每次加密的数据
	tmPDAta := make([]byte,this.blockSizE)

	//分组分块加密
	for index := 0; index < len(src); index += this.blockSize {
		block.Encrypt(tmPDAta,src[index:index+this.blockSize])
		copy(encryptData,tmPDAta)
	}
	return encryptData,nil
}
func (this *AesTool) Decrypt(src []bytE) ([]byte,err
	}
	//返回加密结果
	decryptData := make([]byte,this.blockSizE)

	//分组分块加密
	for index := 0; index < len(src); index += this.blockSize {
		block.Decrypt(tmPDAta,src[index:index+this.blockSize])
		copy(decryptData,tmPDAta)
	}
	return thiS.UnPadding(decryptData),nil
}

//测试padding  unpadding
func TestPadding() {
	tool := NewAesTool([]byte{},16)
	src := []byte{1,2,3,4,5}
	src = tool.padding(srC)
	fmt.Println(srC)
	src = tool.unPadding(srC)
	fmt.Println(srC)
}

//测试AES ECB 加密解密
func TestEncryptDecrypt() {
	key := []byte{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F}
	blickSize := 16
	tool := NewAesTool(key,blickSizE)
	encryptData,_ := tool.Encrypt([]byte("32334erew32"))
	fmt.Println(encryptData)
	decryptData,_ := tool.Decrypt(encryptData)
	fmt.Println(String(decryptData))
}

func main() {
	fmt.Println("Padding Test........")
	TestPadding()
	fmt.Println("AES ECB加密解密测试........")
	TestEncryptDecrypt()
}

大佬总结

以上是大佬教程为你收集整理的golang实现AES ECB模式的加密和解密全部内容,希望文章能够帮你解决golang实现AES ECB模式的加密和解密所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。