文章目录

  • 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 加解密相关推荐

  1. AES加解密基本原理

    1. 概述 在网络通信中,经常会用到加解密技术,其中AES加解密算法是比较广泛的应用于大块数据的对称加解密算法,本文主要介绍AES算法的一些基本原理,假设您对加解密.秘钥等知识有一定的认识,目标是为了 ...

  2. C语言实现AES加解密

    C语言实现AES加解密 AES算法 具体代码 AES算法 (AES)RIJNDAEL算法是一个数据块长度盒密钥长度都可变的分组加密算法,其数据块长度和密钥长度都可独立地选定为大于等于128位且小于等于 ...

  3. Java code lib aes 加解密

    Java aes 加解密 /*** Created by LvJianwei on 2018/2/8.*/import javax.crypto.Cipher; import javax.crypto ...

  4. 数据採集器服务——Socket(今天才发现AES加解密代码跟贴的时候不一样,貌似乱码,不知什么情况)...

    近期刚做的一个项目.关于 Socket TCP 通信. 需求方提供了一个 ARM 机器,及数据採集器,须要我做一个服务端与数据採集器进行交互. 目的: 数据採集器:定时将读取到的数据发送到服务端. 服 ...

  5. 前端 crypto-js aes 加解密

    背景 前段时间公司做项目,该项目涉及到的敏感数据比较多,经过的一波讨论之后,决定前后端进行接口加密处理,采用的是 AES + BASE64 算法加密~ 网上关于 AES 对称加密的算法介绍看上一篇! ...

  6. 记一次Java AES 加解密 对应C# AES加解密 的一波三折

    最近在跟三方对接 对方采用AES加解密 作为一个资深neter Ctrl CV 是我最大的优点 所以我义正言辞的问他们要了demo java demo代码: public class EncryptD ...

  7. C语言实现AES加解密算法

    C语言实现AES加解密算法 AES加解密 AES加解密 #include <stdio.h> #include <stdint.h> #include <memory.h ...

  8. openssl c++实现bouncycastle中AES加解密

    0x01 为什么要用bouncycastle 先说说JCE(Java Cryptography Extension)是一组包,它们提供用于加密.密钥生成和协商以及 Message Authentica ...

  9. aes加密php源码,AES加解密类源码 · ThinkPHP5高阶实战教程 --诠释为API开发而生 · 看云...

    # AES加解密类源码 > 根据网络整理 ~~~ /** * Created by PhpStorm. * Power by Mikkle * QQ:776329498 * Date: 2017 ...

最新文章

  1. Linux 硬件信息命令
  2. python—多线程之数据混乱问题
  3. 看完这个“秒杀”设计方案!我有点慌了
  4. 字符集ASCII、GBK、UNICODE、UTF在储存字符时的区别
  5. 深度学习福利入门到精通第二讲——AlexNet模型
  6. Apache POI读取Excel
  7. css easyui,对比easyui和jwwui css
  8. 修改系统启动项 grub2配置的方法 ubuntu[转]
  9. Win Server 8中的利器:微软在线备份服务
  10. oracle异步sql,Oracle sqlplus登陆异步io错误
  11. 华为性格测试挂的原因是什么?这局怎么破?
  12. 计算机设备全年销售表,2021年计算机机房设备行业财务部门表格模板汇总 .pdf
  13. netcore 集成 CAP 使用 rabbitMQ集群
  14. 苏州新导_室内定位技术实现停车场下的高精度定位_室内定位技术带你找朋友
  15. 自制汉字字库,识别汉字(一)(数字篇)
  16. 漫威对决同位素实验室怎么玩
  17. 云上部署oracle rac,在青云上部署oracle rac全过程
  18. Nmap学习4 - 主机发现 实验一
  19. 微信开发(一)--分享接口
  20. 原创|干货|长文|264亿件包裹怎么破?闪电式自动化分拣技术 细节大起底!

热门文章

  1. LeetCode笔记:39. Combination Sum
  2. git pull出现错误的解决办法
  3. Best Practices for AWS Security Using CloudCheckr
  4. 【SICP归纳】2 高阶函数和数据抽象
  5. thinkphp中I(parm)用法的注意事项
  6. .net语言中使用MapWinGIS.ocx
  7. 黄聪:C#设置Word中表格某个列宽
  8. flask get和post
  9. python sorted list 包含元组 字典 的多列排序
  10. linux/unix上 printf输出带颜色字体(有意思)-转