Golang实现AES对称加密的过程详解

AES是一个对称密码,旨在取代DES成为广泛使用的标准,本文给大家分享Golang实现AES对称加密的过程,本文附有Golang实现AES加密ECB模式的源码,感兴趣的朋友跟随小编一起学习下吧

Posted in Golang onMay 20, 2021

AES加密

AES对称加密简介
AES是一个对称密码,旨在取代DES成为广泛使用的标准。是美国联邦政府采用的一种区块加密标准。

AES对称加密过程
加密解密算法的输入是一个128位分组。这些分组被描述成4×4的字节方阵,这个分组被复制到数组中,并在加密和解密的每一阶段都被修改。在字节方阵中,每一格都是一个字,包含了4字节。在矩阵中字是按列排序的。
加密由N轮构成,轮数依赖于密钥长度:16字节密钥对应10轮,24字节密钥对应12轮,32字节对应14轮。

AES加密模式

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

ECB模式是最早采用和最简单的模式,它将加密的数据分成若干组,每组的大小跟加密密钥长度相同,然后每组都用相同的密钥进行加密。

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

这种模式是先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。

3.密码反馈模式(Cipher FeedBack (CFB))
隐藏了明文模式,分组密码转化为流模式,可以及时加密传送小于分组的数据

4.OFB(Output FeedBack,输出反馈)模式
隐藏了明文模式;,分组密码转化为流模式,可以及时加密传送小于分组的数据

AES填充方式
AES支持支持几种填充:NoPadding,PKCS5Padding,ISO10126Padding,PaddingMode.Zeros,PaddingMode.PKCS7。对于AES来说PKCS5Padding和PKCS7Padding是完全一样的,不同在于PKCS5限定了块大小为8bytes而PKCS7没有限定。因此对于AES来说两者完全相同

Golang实现AES加密解密

下面附上Golang实现AES加密ECB模式的源码:

package main
import (
    "bytes"
    "crypto/aes"
    "fmt"
    "testing"
)
 
//ECB模式解密
func ECBDecrypt(crypted, key []byte) ([]byte, error) {
    if !validKey(key) {
        return nil, fmt.Errorf("秘钥长度错误,当前传入长度为 %d",len(key))
    }
    if len(crypted) < 1 {
        return nil, fmt.Errorf("源数据长度不能为0")
    }
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    if len(crypted)%block.BlockSize() != 0 {
        return nil, fmt.Errorf("源数据长度必须是 %d 的整数倍,当前长度为:%d",block.BlockSize(), len(crypted))
    }
    var dst []byte
    tmpData := make([]byte, block.BlockSize())
 
    for index := 0; index < len(crypted); index += block.BlockSize() {
        block.Decrypt(tmpData, crypted[index:index+block.BlockSize()])
        dst = append(dst, tmpData...)
    }
    dst, err = PKCS5UnPadding(dst)
    if err != nil {
        return nil, err
    }
    return dst, nil
}
 
//ECB模式加密
func ECBEncrypt(src, key []byte) ([]byte, error) {
    if !validKey(key) {
        return nil, fmt.Errorf("秘钥长度错误, 当前传入长度为 %d",len(key))
    }
    block, err := aes.NewCipher(key)
    if err != nil {
        return nil, err
    }
    if len(src) < 1 {
        return nil, fmt.Errorf("源数据长度不能为0")
    }
    src = PKCS5Padding(src, block.BlockSize())
    if len(src)%block.BlockSize() != 0 {
        return nil, fmt.Errorf("源数据长度必须是 %d 的整数倍,当前长度为:%d",block.BlockSize(), len(src))
    }
    var dst []byte
    tmpData := make([]byte, block.BlockSize())
    for index := 0; index < len(src); index += block.BlockSize() {
        block.Encrypt(tmpData, src[index:index+block.BlockSize()])
        dst = append(dst, tmpData...)
    }
    return dst, nil
}
 
// PKCS5填充
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
    padding := blockSize - len(ciphertext)%blockSize
    padtext := bytes.Repeat([]byte{byte(padding)}, padding)
    return append(ciphertext, padtext...)
}
 
// 去除PKCS5填充
func PKCS5UnPadding(origData []byte) ([]byte, error) {
    length := len(origData)
    unpadding := int(origData[length-1])
 
    if length < unpadding {
        return nil, fmt.Errorf("invalid unpadding length")
    }
    return origData[:(length - unpadding)], nil
}
 
// 秘钥长度验证
func validKey(key []byte) bool {
    k := len(key)
    switch k {
    default:
        return false
    case 16, 24, 32:
        return true
    }
}
 
func TestAes(t *testing.T){
    srcData := "hello world !"
    key := []byte("abcdabcdabcdabcdabcdabcdabcdabcd")
    //测试加密
    encData ,err := ECBEncrypt([]byte(srcData),(key))
    if err != nil {
        t.Errorf(err.Error())
        return
    }
 
    //测试解密
    decData ,err := ECBDecrypt(encData,key)
    if err != nil {
        t.Errorf(err.Error())
        return
    }
    t.Log(string(decData))
}

以上就是Golang实现AES对称加密的过程详解的详细内容

Golang 相关文章推荐
golang 实现对Map进行键值自定义排序
Apr 28 Golang
解决golang结构体tag编译错误的问题
May 02 Golang
golang中的并发和并行
May 08 Golang
Golang并发操作中常见的读写锁详析
Aug 30 Golang
golang实现一个简单的websocket聊天室功能
Oct 05 Golang
Go语言读取txt文档的操作方法
Jan 22 Golang
golang实现浏览器导出excel文件功能
Mar 25 Golang
Golang Elasticsearches 批量修改查询及发送MQ
Apr 19 Golang
Golang jwt身份认证
Apr 20 Golang
Golang map映射的用法
Apr 22 Golang
Golang 并发编程 SingleFlight模式
Apr 26 Golang
Golang 入门 之url 包
May 04 Golang
go语言基础 seek光标位置os包的使用
May 09 #Golang
Golang 实现获取当前函数名称和文件行号等操作
May 08 #Golang
Golang 获取文件md5校验的方法以及效率对比
May 08 #Golang
GoLang中生成UUID唯一标识的实现
May 08 #Golang
聊聊golang中多个defer的执行顺序
May 08 #Golang
Golang全局变量加锁的问题解决
golang 实现并发求和
May 08 #Golang
You might like
php中变量及部分适用方法
2008/03/27 PHP
PHPMailer的主要功能特点和简单使用说明
2014/02/17 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
PHP简单计算两个时间差的方法示例
2017/06/20 PHP
Jquery ajaxsubmit上传图片实现代码
2010/11/04 Javascript
jquery里的正则表达式说明
2011/08/03 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
js动画效果制件让图片组成动画代码分享
2014/01/14 Javascript
CSS3,HTML5和jQuery搜索框集锦
2014/12/02 Javascript
jQuery中remove()方法用法实例
2014/12/25 Javascript
Vue2.0实现1.0的搜索过滤器功能实例代码
2017/03/20 Javascript
详谈构造函数加括号与不加括号的区别
2017/10/26 Javascript
vue中路由验证和相应拦截的使用详解
2017/12/13 Javascript
在vue项目中引用Iview的方法
2018/09/14 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
Python数据拟合与广义线性回归算法学习
2017/12/22 Python
django框架自定义用户表操作示例
2018/08/07 Python
pyqt5 获取显示器的分辨率的方法
2019/06/18 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
Html5新特性用canvas标签画多条直线附效果截图
2014/06/30 HTML / CSS
美国批发供应商:Kole Imports
2019/04/10 全球购物
最新的互联网创业计划书
2014/01/10 职场文书
预备党员入党自我评价范文
2014/03/10 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
班主任对学生的评语
2014/04/26 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
画展邀请函
2015/01/31 职场文书
工作保证书怎么写
2015/02/28 职场文书
2015年国庆晚会主持词
2015/07/01 职场文书
如何书写民事调解协议书?
2019/06/25 职场文书
python源码剖析之PyObject详解
2021/05/18 Python
Python利用机器学习算法实现垃圾邮件的识别
2021/06/28 Python
使用CSS3实现按钮悬停闪烁动态特效代码
2021/08/30 HTML / CSS