Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang AES 加解密

Golang AES 加解密

作者头像
恋喵大鲤鱼
发布于 2022-05-09 03:15:54
发布于 2022-05-09 03:15:54
1.7K00
代码可运行
举报
文章被收录于专栏:C/C++基础C/C++基础
运行总次数:0
代码可运行

文章目录

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 加解密。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "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)%blockSize
	padtext := 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
}

使用示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func main() {
   	p := []byte("plaintext")
	key := []byte("12345678abcdefgh")
	
	ciphertext, _ := Base64AESCBCEncrypt(p, key)
	fmt.Println(ciphertext)

	plaintext, _ := Base64AESCBCDecrypt(ciphertext, key)
	fmt.Println(string(plaintext))
}

运行输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
A67NhD3RBiNaMgG6HTm8LQ==
plaintext

小结

以上代码已放到开源 Go 工具库 go-huge-util,大家如果需要,可直接通过 go mod 方式进行 import 然后使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 实现原理。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Golang语言 加密系列之AES
加密代码: func Encrypt(plantText, key []byte) ([]byte, error) { block, err := aes.NewCipher(key) //选择加密算法 if err != nil { return nil, err } plantText = PKCS7Padding(plantText, block.BlockSize()) blockModel := cipher.NewCBCEncrypter(block,
李海彬
2018/03/21
1.1K0
golang的AES加密和解密的三种模式实现(CBC/ECB/CFB)「建议收藏」
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/128363.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/31
5.7K0
golang的AES加密和解密的三种模式实现(CBC/ECB/CFB)「建议收藏」
不背锅运维:Go实现aes加密,并带你手撸一个命令行应用程序
本文转载于(喜欢的盆友关注我们):https://mp.weixin.qq.com/s/FsIfvsuu5jh5_yBXZUS7rA
不背锅运维
2023/02/16
4290
不背锅运维:Go实现aes加密,并带你手撸一个命令行应用程序
Go语言 字符串加密
AES加密 CBC模式,最常见的使用方式: package main import ( "bytes" "crypto/aes" "crypto/cipher" "encoding/base64" "fmt" ) func AesEncrypt(str string, key string) string { // 转成字节数组 strData := []byte(str) k := []byte(key) // 分组秘钥
码客说
2022/10/07
9400
Go 语言实现 AES 算法的加解密操作
AES(Advanced Encryption Standard,高级加密标准)是一种对称加密算法,即在加密和解密过程中使用同一个密钥。AES 算法属于分组加密算法,将数据按块处理,每块固定大小。AES 算法的核心思想是在多轮操作中对数据进行替换和置换,从而有效打乱数据,使其无法被破解。
陈明勇
2024/11/15
1810
Go 加密解密算法总结
加密解密在实际开发中应用比较广泛,常用加解密分为:“对称式”、“非对称式”和”数字签名“。
孤烟
2020/09/27
3K0
微信客服接口对接-签名验签-微信客服GET请求回调URL验证解析返回数据-【唯一客服】
微信客服会往URL上get请求数据,要求把GET中的加密参数解析出来,并且原样输出,才能验证成功
唯一Chat
2023/03/18
1.7K0
微信客服接口对接-签名验签-微信客服GET请求回调URL验证解析返回数据-【唯一客服】
Golang里的AES加密、解密,支持AES-ECB-PKCS7Padding等多种加密组合,兼容JAVA、PHP等语言
密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,这个标准用来替代原先的DES。AES加密数据块分组长度必须为128bit,密钥长度可以是128bit、192bit、256bit中的任意一个。
技术圈
2024/06/11
7910
Golang DES 加解密如何实现?
【导读】本文介绍了 DES 加密原理和作用,和 golang 中 DES 加密解密机制的相应实现。
码农编程进阶笔记
2022/08/18
1.9K0
Golang DES 加解密如何实现?
[GO]golang实现AES加解密
AesEncrypt是加密,第二个参数是设置的key,key的长度必须是16、24、32
唯一Chat
2021/07/20
5360
笔记:Go语言中处理字节切片时可能修改传入参数的底层切片序列的问题
笔者在做某项功能特性开发时,需要使用对称加密算法对部分数据做加密,期间将数据以[]byte切片的形式作为入参传入时,发现在加密完成后,原始的明文会发生变化,针对这个问题笔者在 debug 过程中发现是切片与其底层切片变化引起的,于是有了这篇笔记。
bowenerchen
2024/05/24
1692
笔记:Go语言中处理字节切片时可能修改传入参数的底层切片序列的问题
Go语言中的加密和解密是如何实现的?
在Go语言中,加密和解密操作是通过标准库中的一些特定包来实现的。这些包提供了丰富的加密和解密算法,包括对称加密、非对称加密、散列函数、Base64编码与解码等。下面,我们将详细解释这些包和它们的功能,并提供一些具体的示例代码。
阿珍
2025/01/13
980
Go语言中的加密和解密是如何实现的?
Go AES加解密
https://blog.csdn.net/K346K346/article/details/89387460
恋喵大鲤鱼
2019/05/05
12.5K0
通过Go实现AES加密和解密工具
AES( advanced encryption standard)使用相同密钥进行加密和解密,也就是对称加密。其他的对称加密如DES,由于DES密钥长度只有56位如今的算力甚至可以在5分钟内破解,而AES最高级别达到了256位密钥长度,如果采用穷举法,目前来看AES是一种”无法“被破解的加密存在。
你大哥
2022/06/08
3.3K0
通过Go实现AES加密和解密工具
Golang:加密解密算法
在项目开发过程中,当操作一些用户的隐私信息,诸如密码,帐户密钥等数据时,往往需要加密后可以在网上传输.这时,需要一些高效地,简单易用的加密算法加密数据,然后把加密后的数据存入数据库或进行其他操作;当需要读取数据时,把加密后的数据取出来,再通过算法解密.
OwenZhang
2021/12/08
1.8K0
Golang:加密解密算法
主流加密方式
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),对称加密
酷走天涯
2019/05/26
1.3K0
知识分享之Golang——用于在Golang中的加解密工具类,包含MD5、RSA超长字符串、CBC、ECB等算法
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
cn華少
2022/05/13
1.1K0
miniL-web
一个 愉快 的五一假期,总体来说这次minictf就web方向的题目我感觉还是有点难度的,考察范围很广泛,其中两道java相关的也是不知道怎么搞。不过有幸拿到了mini_sql的一血,还是很激动的毕竟第一次在ctf比赛中拿到一血。同时还扩展了一些密码学的东西,比如这个checkin。总之虽然排名并不是很靠前,但学到了很多有用的新姿势,血赚不亏。
pankas
2022/08/10
3400
miniL-web
AES对称加密算法如何用golang语言实现?
数据的加密算法一般都可以分几类,有对称加密,非对称加密,不可逆加密(也叫hash算法或者散列算法)。
公众号-利志分享
2022/04/25
1.4K0
时代新秀golang--golang加密算法之DES
业务需要对接接口, 采用DES加密方式加密, 于是google一下go的DES加密方式,
糖果
2019/11/20
1.8K0
推荐阅读
相关推荐
Golang语言 加密系列之AES
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验