Go语言中AES加密算法的实现与应用

news2024/11/20 18:42:55

一、前言

在当今的软件开发领域,数据安全至关重要。加密技术作为保护数据机密性的关键手段,被广泛应用于各个方面。AES(高级加密标准)作为一种对称加密算法,以其高效性和安全性在众多加密场景中占据重要地位。本文将详细介绍在Go语言中如何使用AES加密算法对数据进行加密和解密操作,并深入探讨其实现原理和相关注意事项。

AESs加密

二、AES加密算法概述

AES是一种对称加密算法,即加密和解密使用相同的密钥。它支持多种密钥长度,常见的有128位、192位和256位,分别对应AES - 128、AES - 192和AES - 256。不同的密钥长度在安全性和性能上有所差异,一般来说,密钥长度越长,安全性越高,但加密和解密的计算开销也会相应增加。

三、Go语言中的AES实现

(一)加密函数

以下是一个在Go语言中实现AES加密的函数 Encrypt

// Encrypt 使用 AES 加密明文
func Encrypt(plainText, key string) (string, error) {
    // 创建 AES 密码块
    block, err := aes.NewCipher([]byte(key))
    if err!= nil {
        return "", err
    }

    // 创建保存密文的字节切片,长度为 AES 块大小加明文长度
    ciphertext := make([]byte, aes.BlockSize+len(plainText))
    // iv(初始化向量)是加密的前 aes.BlockSize 个字节
    iv := ciphertext[:aes.BlockSize]
    // 生成随机 iv
    if _, err := io.ReadFull(rand.Reader, iv); err!= nil {
        return "", err
    }

    // 创建 CFB 加密流
    stream := cipher.NewCFBEncrypter(block, iv)
    // 执行加密,将结果放入密文字节切片
    stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(plainText))

    // 返回 Base64 编码的密文字符串
    return base64.URLEncoding.EncodeToString(ciphertext), nil
}

在这个函数中,首先通过 aes.NewCipher([]byte(key)) 根据传入的密钥创建AES密码块。然后创建一个足够长度的字节切片 ciphertext,并取其前 aes.BlockSize 个字节作为初始化向量 iv,使用 io.ReadFull(rand.Reader, iv) 生成随机的 iv。接着创建CFB加密流 stream,并通过 stream.XORKeyStream 对明文进行加密,加密结果存放在 ciphertextaes.BlockSize 开始的部分。最后将整个 ciphertext 进行Base64编码并返回。

(二)解密函数

相应的解密函数 Decrypt 如下:

// Decrypt 使用 AES 解密 Base64 编码的密文
func Decrypt(cryptoText, key string) (string, error) {
    // 解码 Base64 编码的密文
    ciphertext, err := base64.URLEncoding.DecodeString(cryptoText)
    if err!= nil {
        return "", err
    }

    // 创建 AES 密码块
    block, err := aes.NewCipher([]byte(key))
    if err!= nil {
        return "", err
    }

    // 检查密文长度是否足够
    if len(ciphertext) < aes.BlockSize {
        return "", fmt.Errorf("ciphertext too short")
    }

    // 提取 iv(初始化向量)
    iv := ciphertext[:aes.BlockSize]
    // 提取真正的密文
    ciphertext = ciphertext[aes.BlockSize:]

    // 创建 CFB 解密流
    stream := cipher.NewCFBDecrypter(block, iv)
    // 执行解密
    stream.XORKeyStream(ciphertext, ciphertext)

    // 返回解密后的明文
    return string(ciphertext), nil
}

解密函数首先对Base64编码的密文进行解码得到字节切片 ciphertext,然后创建AES密码块。接着从 ciphertext 中提取出 iv 和真正的密文部分,创建CFB解密流 stream,通过 stream.XORKeyStream 对密文进行解密,最后将解密后的字节切片转换为字符串并返回。

四、代码示例与分析

main 函数中可以这样使用上述加密和解密函数:

func main() {
    // 密钥必须是 16, 24, 或 32 字节长(分别对应 AES-128, AES-192, AES-256)
    key := "myverystrongpasswordo32bitlength"
    password := "yourPlatformPassword"

    // 加密密码
    encryptedPassword, err := Encrypt(password, key)
    if err!= nil {
        fmt.Println("加密密码出错:", err)
        return
    }
    fmt.Println("加密后的密码:", encryptedPassword)

    // 解密密码
    decryptedPassword, err := Decrypt(encryptedPassword, key)
    if err!= nil {
        fmt.Println("解密密码出错:", err)
        return
    }
    fmt.Println("解密后的密码:", decryptedPassword)
}

在这个示例中,首先定义了一个32字节长的密钥 key 和一个示例密码 password。然后调用 Encrypt 函数对密码进行加密,并打印加密后的结果。接着调用 Decrypt 函数对加密后的密码进行解密,并打印解密后的结果。可以看到,通过正确的密钥,加密后的数据能够被成功解密还原。

五、注意事项

(一)密钥管理

在实际应用中,密钥的管理至关重要。代码中的密钥是硬编码的,这在实际生产环境中是非常危险的。密钥应该妥善保管,例如存储在安全的配置文件中或通过环境变量等方式获取,避免直接在代码中暴露,防止密钥泄露导致数据安全问题。

(二)随机数生成

在生成初始化向量 iv 时使用的随机数生成器应该是足够安全的。确保每次生成的 iv 都是随机且不可预测的,这有助于增强加密的安全性。如果随机数生成存在漏洞,可能会使攻击者有机会破解加密数据。

六、总结

本文详细介绍了在Go语言中使用AES加密算法进行数据加密和解密的方法,通过代码示例展示了加密和解密的具体实现过程,并深入探讨了相关的注意事项。在实际应用中,开发人员需要充分考虑密钥管理和随机数生成等关键因素,以确保数据加密的安全性和可靠性。AES加密算法在Go语言中的应用为数据安全保护提供了有力的工具,开发人员可以根据具体的业务需求灵活运用,构建更加安全的应用程序。

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

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

相关文章

单片机GPIO中断+定时器 实现模拟串口接收

单片机GPIO中断定时器 实现模拟串口接收 解决思路代码示例 解决思路 串口波特率9600bps,每个bit约为1000000us/9600104.16us&#xff1b; 定时器第一次定时时间设为52us即半个bit的时间&#xff0c;其目的是偏移半个bit时间&#xff0c;之后的每104us采样并读取1bit数据。使得…

近几年新笔记本重装系统方法及一些注意事项

新笔记本怎么重装系统&#xff1f; 近几年的新笔记本默认开启了raid on模式或vmd选项&#xff0c;安装过程中会遇到问题&#xff0c;新笔记本电脑重装自带的系统建议采用u盘方式安装&#xff0c;默认新笔记本有bitlocker加密机制&#xff0c;如果采用一键重装系统或硬盘方式安装…

【支持向量机(SVM)】:算法原理及核函数

文章目录 1 SVM算法原理1.1 目标函数确定1.2 约束条件优化问题转换1.3 对偶问题转换1.4 确定超平面1.5 计算举例1.6 SVM原理小节 2 SVM核函数2.1 核函数的作用2.2 核函数分类2.3 高斯核函数2.3 高斯核函数API2.4 超参数 γ \gamma γ 1 SVM算法原理 1.1 目标函数确定 SVM思想…

自动驾驶系列—告别眩光烦恼:智能大灯如何守护夜间行车安全

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

无插件H5播放器EasyPlayer.js RTSP播放器chrome/edge等浏览器如何使用独立显卡

随着互联网的快速发展和视频内容的日益丰富&#xff0c;HTML5视频播放器已成为网页视频播放的主流技术。EasyPlayer.js播放器视频播放技术不仅支持多种浏览器和设备&#xff0c;还提供了丰富的功能和更好的用户体验。 那么chrome/edge等浏览器如何使用独立显卡&#xff1f; 在…

@Autowired 和 @Resource思考(注入redisTemplate时发现一些奇怪的现象)

1. 前置知识 Configuration public class RedisConfig {Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {RedisTemplate<String, Object> template new RedisTemplate<>();template.setConnectionFactory(facto…

STM32低功耗设计NFC与无线距离感应智能钥匙扣-分享

目录 目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 1.电路图采用Altium Designer进行设计&#xff1a; 2.实物展示图片 三、程序源代码设计 四、获取资料内容 前言 智能钥匙扣作为一种小巧而实用的智能设备&#xff0c;凭借其便携性…

微服务day09

DSL查询 快速入门 GET /items/_search {"query": {"match_all": {}} } 叶子查询 GET /items/_search {"query": {"match_all": {}} }GET /items/_search {"query": {"multi_match": {"query": "脱…

Golang语言整合jwt+gin框架实现token

1.下载jwt go get -u github.com/dgrijalva/jwt-go2.新建生成token和解析token文件 2.1 新建common文件夹和jwtConfig文件夹 新建jwtconfig.go文件 2.2 jwtconfig.go文件代码 /* Time : 2021/8/2 下午3:03 Author : mrxuexi File : main Software: GoLand */ package jwtC…

Orcad 输出有链接属性的PDF

安装adobe pdf安装Ghostscript修改C:\Cadence\SPB_16.6\tools\capture\tclscripts\capUtils\capPdfUtil.tcl ​ 设置默认打印机为 Adobe PDF ​ 将Ghostscript的路径修改正确 打开cadence Orcad &#xff0c;accessories->candece Tcl/Tk Utilities-> Utilities->PD…

Java读取WPS excel.xlsx嵌入图片

1. 背景&原因 经常有读取Excel文件的需求&#xff0c;开发者大多使用apache poi或者基于此的工具进行excel内容读取&#xff0c;前不久遇到了一个需求&#xff0c;读取每一行内容&#xff0c;但每一行都包含图片文件&#xff0c;发现无法通过已封装的工具读取excel的图片内…

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别

Elasticsearch 查询时 term、match、match_phrase、match_phrase_prefix 的区别 keyword 与 text 区别term 查询match 查询match_phrase 查询match_phrase_prefix 查询写在最后 在讲述 es 查询时 term、match、match_phrase、match_phrase_prefix 的区别之前&#xff0c;先来了…

ERROR TypeError: AutoImport is not a function

TypeError: AutoImport is not a function 原因&#xff1a;unplugin-auto-import 插件版本问题 Vue3基于Webpack&#xff0c;在vue.config.js中配置 当unplugin-vue-components版本小于0.26.0时&#xff0c;使用以下写法 const { defineConfig } require("vue/cli-se…

iOS 18 导航栏插入动画会导致背景短暂变白的解决

问题现象 在最新的 iOS 18 系统中,如果我们执行导航栏的插入动画,可能会造成导航栏背景短暂地变为白色: 如上图所示:我们分别向主视图和 Sheet 弹出视图的导航栏插入了消息,并应用了动画效果。可以看到,前者的导航栏背景会在消息插入那一霎那“变白”,而后者则没有任何…

PHP屏蔽海外IP的访问页面(源代码实例)

PHP屏蔽海外IP的访问页面&#xff08;源代码实例&#xff09;&#xff0c;页面禁用境外IP地址访问 <?php/*** 屏蔽海外ip访问* 使用ip2long函数得到ip转为整数的值&#xff0c;判断值是否在任一一个区间中* 以下是所有国内ip段* 调用方法&#xff1a;IschinaIp($ALLIPS)* …

SpringBoot 增量部署发布(第2版)

一、背景介绍 书接上一篇《SpringBoot 增量部署发布_springboot增量部署-CSDN博客》&#xff0c;上一篇内容实现了将静态资源与jar分离&#xff0c;但是即使是打包成**-exec.jar&#xff0c;解压jar文件&#xff0c;可以看到里面包含了static&#xff0c;resource目录&#xf…

单片机智能家居火灾环境安全检测-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 传统的火灾报警系统大多依赖于简单的烟雾探测器或温度传感器&#xff0c;…

C++:指针和引用

指针的基础 数据在内存当中是怎么样被存储的 数据在内存中的存储方式取决于数据的类型和计算机的体系结构 基本数据类型 整数类型&#xff1a;整数在内存中以二进制补码的形式存储。对于有符号整数&#xff0c;最高位为符号位&#xff0c;0 表示正数&#xff0c;1 表示负数。…

MySQL更换瀚高语法更换

MySQL更换瀚高语法更换 一、前言二、语句 一、前言 水一篇,mysql更换瀚高之后&#xff0c;一些需要更换的语法介绍 > 二、语句 MySQL瀚高MySQL用法瀚高用法说明ifnull(x,y)coalesce(x,y)相同相同用于检查两个表达式并返回第一个非空表达式。如果第一个表达式不是 NULL&…

亚马逊云服务器(AWS):功能、优势与使用指南

亚马逊云服务器&#xff08;AWS&#xff09;概述 亚马逊云服务器&#xff08;Amazon Web Services&#xff0c;简称AWS&#xff09;是全球领先的云计算平台&#xff0c;提供一系列强大且灵活的云服务&#xff0c;帮助企业和开发者通过云基础设施实现数据存储、计算、分析和机器…