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

1. 电码本模式(Electronic Codebook Book (ECB))

2.密码分组链接模式(Cipher Block Chaining (CBC))

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

4.密码反馈模式(Cipher FeedBack (CFB))

5.输出反馈模式(Output FeedBack (OFB))

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

下面贴上我的实现代码:

package mainimport ("bytes""crypto/aes""fmt"
)//AES ECB模式的加密解密
type AesTool struct {//128 192  256位的其中一个 长度 对应分别是 16 24  32字节长度Key       []byteBlockSize 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.BlockSizeif 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}//paddingsrc = 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, error) {//key只能是 16 24 32长度block, err := aes.NewCipher([]byte(this.Key))if err != nil {return nil, err}//返回加密结果decryptData := make([]byte, len(src))//存储每次加密的数据tmpData := 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 := 16tool := 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模式的加密和解密相关推荐

  1. python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  2. 对称加密算法AES - ECB模式

    目录 什么是ECB模式? 如何使用Java 实现ECB模式的AES算法? 加密方法 解密方法 什么是ECB模式? ECB,Electronic Codebook,电码本.ECB模式是分组算法的一种基本 ...

  3. C++或C 实现AES ECB模式加密解密,支持官方验证

    本文主要介绍 AES 算法的加解密方法.本文使用的语言为 C++,调用的 AES 库为:cryptopp. 1 概述 AES 加密算法的介绍如下(摘自 WikiPedia): 高级加密标准(英语:Ad ...

  4. php实现aes ecb模式加密,PHP、Python、Java的AES ECB加密实现-Fun言

    AES加密 ECB模式 PKCS5填充 128位密码/密码块 ECB模式是将明文按照固定大小的块进行加密的,块大小不足则进行填充,ECB模式没有用到向量. 具体加密算法,请参见米扑博客总结的系列文章: ...

  5. PHP 使用 AES/ECB/PKCS7 padding 加密

    很好用的 AES 加密的类,ECB 模式,PKCS7 padding 填充方式. <?phpclass AES {protected $cipher;protected $mode;protec ...

  6. java des ecb_java DES ECB模式对称加密解密

    最近需要又要使用DES加密数据,要求DES加密出来的数据为对称加密,经过研究,发现了一些问题: 1.DES对称ECB模式加密的数据,长度必须为8的倍数 2.加密的数据,加密后先转码(因为加密后的数据我 ...

  7. java des ecb_【转】 java DES ECB模式对称加密解密

    最近需要又要使用DES加密数据,要求DES加密出来的数据为对称加密,经过研究,发现了一些问题: 1.DES对称ECB模式加密的数据,长度必须为8的倍数 2.加密的数据,加密后先转码(因为加密后的数据我 ...

  8. aes sample java,python-AES加密java解密

    我有超过1000个图像和视频需要加密.没什么比这更简单的了,我想用AES,但我搞不懂如何在我的电脑上加密,然后在设备上解密.在 我会用python加密我电脑上的所有项目.然后以随需应变的方式用java ...

  9. aesmiyao php_PHP使用AES,ECB模式块和PKCS5Padding生成对称密钥

    首先,要对你需要即兴创作的输入做PKCS#5填充: // source: http://php.net/manual/en/ref.mcrypt.php#69782 function pkcs5_pa ...

最新文章

  1. 前端笔记(3)css,选择器,文字文本属性,外观属性
  2. IOT物联网观察之三大运营商物联网发展进入规模商用阶段
  3. Linux环境——MySQL安装及配置(8.0版本)
  4. .NET的一点历史故事:作者的一些感想
  5. 深度学习pytorch--线性回归(三)
  6. python:单元测试框架pytest的一个简单例子
  7. 英语学习笔记2019-11-15
  8. 使用vmware12安装Ubuntu 遇到的两个问题和解决
  9. 力扣题目——107. 二叉树的层序遍历 II
  10. 一小时做出Java实战项目——飞翔的小鸟
  11. tomcat自动重启
  12. 卸载ncurses_linux 安装,卸载 监控服务
  13. 考研倒计时一幕刷屏!网友:这一定是最接近梦想的人!
  14. vulnhub Pwned: 1
  15. 《一次与IP MTU、TCP MSS导致SSL协商失败的案例》—那些年踩过的坑(二)
  16. 收到垃圾广告短信,回复“T”退订,完全没用怎么办?
  17. import androidx.core.app.Fragment;报红
  18. php dsp 使用量,DSP广告需求方平台——新数网络
  19. 在win10更新的时候出现0x80240004错误代码怎么解决。
  20. word生成freemarker模板 并下载

热门文章

  1. cad怎么卸载干净_CAD无法卸载,又无法安装怎么办?
  2. Python零基础入门(二)——Python中常见的数据结构[学习笔记]
  3. vscode如何关闭Pylint警告或错误提示
  4. fiddler显示服务器IP
  5. Python错误重试逼疯多少人?解决办法来了
  6. 访问服务器显示无法访问目标主机,发送4接收4无法访问目标主机
  7. linux编译c文件for循环,Linux C 循环队列的实现
  8. canny边缘检测算法_OpenCV4中调用HED边缘检测算法
  9. linux svn pacman,【图片】manjaro Linux 中的etc pacman.conf设置错误了,谁发个默认的我看看,谢谢大佬们了_manjaro吧_百度贴吧...
  10. java中 object创建对象_java创建对象的几种方式