Golang AES 加解密
文章目录
- AES 简介
- AES 加解密实现
- 小结
- 参考文献
AES 简介
利用 Go 提供的 AES 加解密与 Base64 编解码包,我们可以轻松实现 AES 加解密。实现之前,首先了解一下 AES 的基本知识。
AES(Advanced Encryption Standard)高级加密标准,是流行的对称加密算法,由美国国家标准与技术研究院(NIST)于 2001 年发布,用于取代 DES。Rijndael 算法 是 AES 标准的一个实现,一般说 AES 指的就是 Rijndael 算法。
(1)AES 有 5 种加密模式,分别是:
- 电子密码本模式(ECB,Electronic Code Book);
- 加密块链模式(CBC,Cipher Block Chaining),如果明文长度不是分组长度 16 字节的整数倍需要进行填充;
- 计数模式(CTR,Counter);
- 密码反馈模式(CFB,Cipher FeedBack);
- 输出反馈模式(OFB,Output FeedBack)。
(2)AES 是对称分组加密算法,每组长度为 128bits,即 16 字节。
(3)AES 秘钥的长度只能是16、24 或 32 字节,分别对应三种加密模式 AES-128、AES-192 和 AES-256,三者的区别是加密轮数不同。
AES | 分组长度(字节) | 密钥长度(字节) | 加密轮数 |
---|---|---|---|
AES-128 | 16 | 16 | 10 |
AES-192 | 16 | 24 | 12 |
AES-256 | 16 | 32 | 14 |
AES 加解密实现
下面以 CBC 模式为例,实现 AES 加解密。
package mainimport ("fmt""crypto/cipher""crypto/aes""bytes""encoding/base64"
)// PKCS7Padding fills plaintext as an integral multiple of the block length
func PKCS7Padding(p []byte, blockSize int) []byte {pad := blockSize - len(p)%blockSizepadtext := bytes.Repeat([]byte{byte(pad)}, pad)return append(p, padtext...)
}// PKCS7UnPadding removes padding data from the tail of plaintext
func PKCS7UnPadding(p []byte) []byte {length := len(p)paddLen := int(p[length-1])return p[:(length - paddLen)]
}// AESCBCEncrypt encrypts data with AES algorithm in CBC mode
// Note that key length must be 16, 24 or 32 bytes to select AES-128, AES-192, or AES-256
// Note that AES block size is 16 bytes
func AESCBCEncrypt(p, key []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}p = PKCS7Padding(p, block.BlockSize())ciphertext := make([]byte, len(p))blockMode := cipher.NewCBCEncrypter(block, key[:block.BlockSize()])blockMode.CryptBlocks(ciphertext, p)return ciphertext, nil
}// AESCBCDecrypt decrypts cipher text with AES algorithm in CBC mode
// Note that key length must be 16, 24 or 32 bytes to select AES-128, AES-192, or AES-256
// Note that AES block size is 16 bytes
func AESCBCDecrypt(c, key []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}plaintext := make([]byte, len(c))blockMode := cipher.NewCBCDecrypter(block, key[:block.BlockSize()])blockMode.CryptBlocks(plaintext, c)return PKCS7UnPadding(plaintext)
}// Base64AESCBCEncrypt encrypts data with AES algorithm in CBC mode and encoded by base64
func Base64AESCBCEncrypt(p, key []byte) (string, error) {c, err := AESCBCEncrypt(p, key)if err != nil {return "", err}return base64.StdEncoding.EncodeToString(c), nil
}// Base64AESCBCDecrypt decrypts cipher text encoded by base64 with AES algorithm in CBC mode
func Base64AESCBCDecrypt(c string, key []byte) ([]byte, error) {oriCipher, err := base64.StdEncoding.DecodeString(c)if err != nil {return nil, err}p, err := AESCBCDecrypt(oriCipher, key)if err != nil {return nil, err}return p, nil
}
使用示例如下:
func main() {p := []byte("plaintext")key := []byte("12345678abcdefgh")ciphertext, _ := Base64AESCBCEncrypt(p, key)fmt.Println(ciphertext)plaintext, _ := Base64AESCBCDecrypt(ciphertext, key)fmt.Println(string(plaintext))
}
运行输出:
A67NhD3RBiNaMgG6HTm8LQ==
plaintext
小结
以上代码已放到开源 Go 工具库 go-huge-util,大家如果需要,可直接通过 go mod 方式进行 import 然后使用。
import (huge "github.com/dablelv/go-huge-util"
)p := []byte("plaintext")
key := []byte("12345678abcdefgh")ciphertext, _ := huge.Base64AESCBCEncrypt(p, key) // A67NhD3RBiNaMgG6HTm8LQ==
plaintext, _ := huge.Base64AESCBCDecrypt(ciphertext, key) // plaintext
如果想了解 AES 实现原理,可参考AES加密算法的详细介绍与实现。
参考文献
[1] Go中国官网.Package aes
[2] AES加密算法的详细介绍与实现
[3] AES Encryption and Decryption Online Tool
Golang AES 加解密相关推荐
- AES加解密基本原理
1. 概述 在网络通信中,经常会用到加解密技术,其中AES加解密算法是比较广泛的应用于大块数据的对称加解密算法,本文主要介绍AES算法的一些基本原理,假设您对加解密.秘钥等知识有一定的认识,目标是为了 ...
- C语言实现AES加解密
C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...
- Java code lib aes 加解密
Java aes 加解密 /*** Created by LvJianwei on 2018/2/8.*/import javax.crypto.Cipher; import javax.crypto ...
- 数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...
近期刚做的一个项目.关于 Socket TCP 通信. 需求方提供了一个 ARM 机器,及数据採集器,须要我做一个服务端与数据採集器进行交互. 目的: 数据採集器:定时将读取到的数据发送到服务端. 服 ...
- 前端 crypto-js aes 加解密
背景 前段时间公司做项目,该项目涉及到的敏感数据比较多,经过的一波讨论之后,决定前后端进行接口加密处理,采用的是 AES + BASE64 算法加密~ 网上关于 AES 对称加密的算法介绍看上一篇! ...
- 记一次Java AES 加解密 对应C# AES加解密 的一波三折
最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码: public class EncryptD ...
- C语言实现AES加解密算法
C语言实现AES加解密算法 AES加解密 AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h ...
- openssl c++实现bouncycastle中AES加解密
0x01 为什么要用bouncycastle 先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密.密钥生成和协商以及 Message Authentica ...
- aes加密php源码,AES加解密类源码 · ThinkPHP5高阶实战教程 --诠释为API开发而生 · 看云...
# AES加解密类源码 > 根据网络整理 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017 ...
最新文章
- Linux 硬件信息命令
- python—多线程之数据混乱问题
- 看完这个“秒杀”设计方案!我有点慌了
- 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
- 深度学习福利入门到精通第二讲——AlexNet模型
- Apache POI读取Excel
- css easyui,对比easyui和jwwui css
- 修改系统启动项 grub2配置的方法 ubuntu[转]
- Win Server 8中的利器:微软在线备份服务
- oracle异步sql,Oracle sqlplus登陆异步io错误
- 华为性格测试挂的原因是什么?这局怎么破?
- 计算机设备全年销售表,2021年计算机机房设备行业财务部门表格模板汇总 .pdf
- netcore 集成 CAP 使用 rabbitMQ集群
- 苏州新导_室内定位技术实现停车场下的高精度定位_室内定位技术带你找朋友
- 自制汉字字库,识别汉字(一)(数字篇)
- 漫威对决同位素实验室怎么玩
- 云上部署oracle rac,在青云上部署oracle rac全过程
- Nmap学习4 - 主机发现 实验一
- 微信开发(一)--分享接口
- 原创|干货|长文|264亿件包裹怎么破?闪电式自动化分拣技术 细节大起底!
热门文章
- LeetCode笔记:39. Combination Sum
- git pull出现错误的解决办法
- Best Practices for AWS Security Using CloudCheckr
- 【SICP归纳】2 高阶函数和数据抽象
- thinkphp中I(parm)用法的注意事项
- .net语言中使用MapWinGIS.ocx
- 黄聪:C#设置Word中表格某个列宽
- flask get和post
- python sorted list 包含元组 字典 的多列排序
- linux/unix上 printf输出带颜色字体(有意思)-转