【Go】使用Go语言实现AES CBC No Padding加密和解密


冷雨悄悄停吧
天真的心因为你
那管多风雨天仍和你一起
告诉你我其实多么的想你
其实我我真的爱着你
                     🎵 蒋明周《真的爱着你》


引言

高级加密标准(AES)是一种广泛使用的加密算法。它可以工作在多种模式下,最常用的一种是CBC(Cipher Block Chaining)模式。本文将介绍如何使用Go语言实现AES CBC No Padding加密和解密。

什么是AES CBC No Padding?

AES(Advanced Encryption Standard)是一种对称加密算法,意味着加密和解密使用相同的密钥。CBC(Cipher Block Chaining)是一种工作模式,它将每个明文块与前一个密文块进行异或(XOR)操作后再进行加密。No Padding表示数据块必须是加密算法所要求的固定大小,不足时不会自动填充。

准备工作

在开始编写代码之前,请确保已安装Go语言环境。可以从 Go语言官方网站 下载并安装。

代码实现

下面是完整的代码实现,包括加密和解密函数。

package mainimport ("bytes""crypto/aes""crypto/cipher""encoding/hex""fmt""log"
)// AES加密函数
func aesEncrypt(plaintext, key, iv []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}if len(plaintext)%aes.BlockSize != 0 {return nil, fmt.Errorf("plaintext is not a multiple of the block size")}ciphertext := make([]byte, len(plaintext))mode := cipher.NewCBCEncrypter(block, iv)mode.CryptBlocks(ciphertext, plaintext)return ciphertext, nil
}// AES解密函数
func aesDecrypt(ciphertext, key, iv []byte) ([]byte, error) {block, err := aes.NewCipher(key)if err != nil {return nil, err}if len(ciphertext)%aes.BlockSize != 0 {return nil, fmt.Errorf("ciphertext is not a multiple of the block size")}plaintext := make([]byte, len(ciphertext))mode := cipher.NewCBCDecrypter(block, iv)mode.CryptBlocks(plaintext, ciphertext)return plaintext, nil
}func main() {key := []byte("0123456789abcdef") // 16字节的密钥iv := []byte("abcdef9876543210")  // 16字节的初始向量plaintext := []byte("Hello, AES CBC No Padding!") // 明文// 补充明文,使其长度为块大小的倍数if len(plaintext)%aes.BlockSize != 0 {padding := aes.BlockSize - len(plaintext)%aes.BlockSizeplaintext = append(plaintext, bytes.Repeat([]byte{byte(padding)}, padding)...)}fmt.Printf("原始明文: %s\n", plaintext)// 加密ciphertext, err := aesEncrypt(plaintext, key, iv)if err != nil {log.Fatalf("加密失败: %v", err)}fmt.Printf("密文: %s\n", hex.EncodeToString(ciphertext))// 解密decryptedText, err := aesDecrypt(ciphertext, key, iv)if err != nil {log.Fatalf("解密失败: %v", err)}fmt.Printf("解密后的明文: %s\n", decryptedText)
}

代码说明

导入必要的包:我们使用crypto/aes和crypto/cipher包来处理AES加密和解密。

AES加密函数:

创建一个新的AES密码块。
检查明文长度是否为块大小的倍数,如果不是,则返回错误。
使用CBC加密模式进行加密。

AES解密函数:

创建一个新的AES密码块。
检查密文长度是否为块大小的倍数,如果不是,则返回错误。
使用CBC解密模式进行解密。

主函数:

定义密钥和初始向量(IV)。
补充明文,使其长度为块大小的倍数。
执行加密和解密操作,并输出结果。

运行代码

将上述代码保存为main.go,然后在终端中运行:

go run main.go

结论

本文介绍了如何使用Go语言实现AES CBC No Padding加密和解密。我们讨论了AES CBC模式的基本概念,并提供了完整的代码示例。希望这篇文章能帮助你更好地理解AES CBC加密和解密的实现。如果你有任何问题或建议,请在评论中告诉我们。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Cesium4Unreal - # 009 直接加载显示shapefile

文章目录 直接加载显示shapefile1 思路2 步骤2.1 下载shapelib2.2 添加依赖模块2.3 创建Actor2.3.1 MyShapeLoaderActor.h2.3.2 MyShapeLoaderActor.cpp2.3 蓝图代码直接加载显示shapefile 1 思路 在Unreal Engine中加载显示shapefile无非就是从shapefile中读取几何数据,并且…

【车载音视频电脑】嵌入式AI分析车载DVR,支持8路1080P

产品特点 采用H.265 & H.264编解码,节约存储空间、传输流量; 高分辨率:支持8路1080P*15FPS/4路1080P*30FPS、720P、D1等编解码; 支持1张SATA硬盘,取用方便,满足大容量存储要求; 支持1个…

ChatGPT中文镜像网站分享

ChatGPT 是什么? ChatGPT 是 OpenAI 开发的一款基于生成预训练变换器(GPT)架构的大型语言模型。主要通过机器学习生成文本,能够执行包括问答、文章撰写、翻译等多种文本生成任务。截至 2023 年初,ChatGPT 的月活跃用户…

神经网络介绍及教程案例

神经网络介绍及教程&案例 神经网络(Neural Networks)是机器学习和人工智能中的一种关键技术,模仿了人类大脑的工作方式,能够处理复杂的数据和任务。以下是神经网络的一些基础介绍: 基本概念 神经元(N…

12.实战私有数据微调ChatGLM3

实战私有数据微调ChatGLM3 实战私有数据微调ChatGLM3实战构造私有的微调数据集基于 ChatGPT 设计生成训练数据的 Prompt使用 LangChain GPT-3.5-Turbo 生成训练数据样例训练数据解析、数据增强和持久化存储自动化批量生成训练数据集流水线提示工程(Prompt Engineer…

OpenCV读取图片

import cv2 as cv # 读取图像 image cv.imread(F:\\mytupian\\xihuduanqiao.jpg) # 创建窗口 cv.namedWindow(image, cv.WINDOW_NORMAL) #显示图像后,允许用户随意调整窗口大小 # 显示图像 cv.imshow(image, image) cv.waitKey(0)import cv2 as cv srccv.imread(…

Java常用的设计模式,如单例模式、工厂模式、观察者模式等

设计模式是软件工程中的一种解决方案,用于应对常见的设计问题和挑战。它们提供了一种标准化的方式来解决设计难题,使代码更加灵活、可扩展和易于维护。 单例模式(Singleton Pattern) 概述 单例模式确保一个类只有一个实例&…

代码随想录算法训练营第37天 [ 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 ]

代码随想录算法训练营第37天 [ 435. 无重叠区间 763.划分字母区间 56. 合并区间 738.单调递增的数字 ] 一、435. 无重叠区间 链接: 代码随想录. 思路&#xff1a;更新区间的值 做题状态&#xff1a;看解析后做出来了 class Solution { public:static bool cmp(vector<int>…

Java——LinkedList

1、链表 1.1 链表的概念及结构 链表在逻辑层面上是连续的&#xff0c;在物理层面上不一定是连续的 链表结构可分为&#xff0c;单向或双向、带头或不带头、循环或非循环&#xff0c;组合共计8种 重点&#xff1a;无头单向非循环链表、无头双向链表 1.2 模拟实现无头单向非…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中&#xff0c;开源文化不仅催生了无数创新技术&#xff0c;也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生&#xff0c;就是在这样的背景下&#xff0c;通过开源活动不断探索、学习并实现自我…

数据分析常用6种分析思路(下)

作为一名数据分析师&#xff0c;你又没有发现&#xff0c;自己经常碰到一些棘手的问题就没有思路&#xff0c;甚至怀疑自己究竟有没有好好学过分析&#xff1f; 在上篇文章里&#xff0c;我们讲到了数据分析中的流程、分类、对比三大块&#xff0c;今天&#xff0c;我们继续讲…

【ElasticSearch】windows server 2019安装ES8.9.1 + kibana8.9.1 + IK分词器

目录 准备工作 ES Kibana IK 安装 es es访问测试 将es安装为系统服务 Kibana 配置es 运行kibana 访问测试 IK 补充 准备工作 ES8.9.1 kibana8.9.1 IK的版本最好要对应上&#xff01;&#xff01;&#xff01; ES es8.9.1&#xff1a; https://artifa…

笔记 | 用go写个docker

仅作为自己学习过程的记录&#xff0c;不具备参考价值 前言 看到一段非常有意思的话&#xff1a; 很多人刚接触docker的时候就会感觉非常神奇&#xff0c;感觉这个技术非常新颖&#xff0c;其实并不然&#xff0c;docker使用到的技术都是之前已经存在过的&#xff0c;只不过旧…

vxe-table展开行嵌套子表,每个子表的数据都是接口获取,每次展开的子表的数据都不同。

我开始是这么写的 <vxe-tableref"tableRef"...:data"data">...<vxe-column type"expand" title"展开行" width"120"><template #content"{ row }"><div class"expand-wrapper"&g…

操作系统——信号

将信号分为以上四个阶段 1.信号注册&#xff1a;是针对信号处理方式的规定&#xff0c;进程收到信号时有三种处理方式&#xff1a;默认动作&#xff0c;忽略&#xff0c;自定义动作。如果不是自定义动作&#xff0c;这一步可以忽略。这个步骤要使用到signal/sigaction接口 2.…

5. 条件和递归

5. 条件和递归 本章主要话题是if表达式, 它根据程序的状态执行不同的代码. 但首先介绍两个操作符号: 向下取整除法操作符和求模操作符.5.1 向下取整除法操作符和求模操作符 向下取整除法操作符(//)对两个数除法运算, 并向下取整得到一个整数. 假设, 一个电影的播放时长为105分…

Vim 常用指令

Vim 是一款功能强大且高度可定制的文本编辑器。其高效的编辑方式使其成为许多程序员和系统管理员的首选。 1. Vim 的基本模式 Vim 具有以下几种基本模式&#xff1a; 正常模式&#xff08;Normal mode&#xff09;&#xff1a;用于浏览和编辑文本&#xff08;按 ESC 进入&am…

Java | Leetcode Java题解之第150题逆波兰表达式求值

题目&#xff1a; 题解&#xff1a; class Solution {public int evalRPN(String[] tokens) {int n tokens.length;int[] stack new int[(n 1) / 2];int index -1;for (int i 0; i < n; i) {String token tokens[i];switch (token) {case "":index--;stack…

react:handleEdit={() => handleEdit(user)} 和 handleEdit={handleEdit(user)}有啥区别

handleEdit{() > handleEdit(user)} 和 handleEdit{handleEdit(user)} 之间的区别在于它们在调用函数时的行为方式不同&#xff0c;尤其是处理函数参数和立即调用方面&#xff1a; ### 1. handleEdit{() > handleEdit(user)} - **行为**: 这是一个箭头函数&#xff0c;…

vi/vim使用命令

你是否在编辑文件时以为键盘坏了&#xff0c;为什么不能删除呢&#xff0c;为什么不能敲代码呢&#xff0c;等你初识vi&#xff0c;会觉得这个东西为什么设计得这么难用&#xff0c;这篇教程带你熟练得用上这款经典的工具 Vi 是在 Unix 系统上广泛使用的编辑器&#xff0c;Vim …