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

一、前言

在当今的软件开发领域,数据安全至关重要。加密技术作为保护数据机密性的关键手段,被广泛应用于各个方面。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语言中的应用为数据安全保护提供了有力的工具,开发人员可以根据具体的业务需求灵活运用,构建更加安全的应用程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS 语法规范

基本语法结构 CSS 的基本语法结构包含 选择器 和 声明块,两者共同组成 规则集。规则集可以为 HTML 元素设置样式,使页面结构和样式实现分离,便于网页的美化和布局调整。 CSS 规则集的结构如下: selector {property: value; }选择器(Selector) 选择器用于指定需要应用…

JavaScript 变量:理解基元和引用类型

两种基本类型的数据存储在 javascript 中的变量中&#xff1a;基元 和 引用类型。了解这两种类型之间的区别对于内存管理以及调节数据的共享、存储和更改至关重要。本文深入探讨了它们之间的区别&#xff0c;提供了现实世界的示例&#xff0c;并研究了有效处理这两种类型的方法…

【C++】—— stack和queue的模拟实现

前言 ​ stack 和 queue使用起来都非常简单&#xff0c;现在来模拟实现一下&#xff0c;理解其底层的原理。 ​ 在实现之前&#xff0c;应该知道&#xff0c;stack 和 queue 都是容器适配器&#xff0c;通过看官网文件也可以看出来&#xff1b;其默认的容器都是deque&#xff…

MuMu模拟器安卓12安装Xposed 框架

MuMu模拟器安卓12安装Xposed 框架 当开启代理后,客户端会对代理服务器证书与自身内置证书展开检测,只要检测出两者存在不一致的情况,客户端就会拒绝连接。正是这个原因,才致使我们既没有网络,又抓不到数据包。 解决方式: 通过xposed框架和trustmealready禁掉app里面校验…

Linux网络:守护进程

Linux网络&#xff1a;守护进程 会话进程组会话终端 守护进程setsiddaemon 在创建一个网络服务后&#xff0c;往往这个服务进程是一直运行的。但是对于大部分进程来说&#xff0c;如果退出终端&#xff0c;这个终端上创建的所有进程都会退出&#xff0c;这就导致进程的生命周期…

丹摩征文活动|丹摩平台一日游

目录 一.引言 二.平台简介 三.体验过程 1.注册与登录 (1).注册 (2).登录 2.界面介绍 (1).主界面 (2).任务监控界面 3.功能体验 (1).数据存储与管理 (2).数据预处理 (3).模型训练 (4).模型评估与优化 4.例子 (1).创建一个实例 (2).选择类型 1.实例配置 2.选择…

计算机网络中的数据包传输机制详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

普通用户切换到 root 用户不需要输入密码配置(Ubuntu20)

在 Ubuntu 系统中&#xff0c;允许一个普通用户切换到 root 用户而不需要输入密码&#xff0c;可以通过以下步骤配置 sudo 设置来实现。 步骤&#xff1a; 打开 sudoers 文件进行编辑&#xff1a; 在终端中&#xff0c;输入以下命令来编辑 sudoers 文件&#xff1a; sudo visu…

入侵检测算法平台部署LiteAIServer视频智能分析平台行人入侵检测算法:科技守护安全的新篇章

在现代化城市快速发展的背景下&#xff0c;安全防范已成为城市管理与社会生活中不可或缺的一环。随着人工智能、大数据、物联网等技术的飞速发展&#xff0c;智能化安防系统正逐步改变着传统的安全防护模式&#xff0c;特别是在行人入侵检测领域&#xff0c;视频智能分析平台Li…

20.UE5UI预构造,开始菜单,事件分发器

2-22 开始菜单、事件分发器、UI预构造_哔哩哔哩_bilibili 目录 1.UI预构造 2.开始菜单和开始关卡 2.1开始菜单 2.2开始关卡 2.3将开始菜单展示到开始关卡 3.事件分发器 1.UI预构造 如果我们直接再画布上设计我们的按钮&#xff0c;我们需要为每一个按钮进行编辑&#x…

GoFly框架使用vue flow流程图组件说明

Vue Flow组件库是个高度可定制化的流程图组件&#xff0c;可用于工作流设计、流程图及图表编辑器、系统架构展示。可以根据自己的需求&#xff0c;设计独特的节点和边&#xff0c;实现个性化的流程图展示。这不仅增强了应用的视觉效果&#xff0c;也使得用户交互更为直观和流畅…

小白投资理财 - 看懂随机指标 KDJ

小白投资理财 - 看懂随机指标 KDJ 什么是 KDJKDJ 的组成计算 RSV计算 K 值计算 D 值J 值KDJ 的解读 KDJ 使用方式首先是 KD 线适合超买和超卖KD 线的黄金交叉线和死亡交叉线J 线J 线捉低点 KDJ 线注意点总结 身边总会有一位朋友在做选择上总是摇摆不定&#xff0c;做一个选择也…

Charles抓https包-配置系统证书(雷电)

1、导出证书 2、下载 主页上传资源中有安装包&#xff0c;免费的 openssl 安装教程自己搜 openssl x509 -subject_hash_old -in charles.pem 3、修改证书名、后缀改成点0 雷电打开root和磁盘写入 4、导入雷电证书根目录 证书拖进去&#xff0c;基本就完成了&#xff…

SobarQube实现PDF报告导出

文章目录 前言一、插件配置二、使用步骤1.新生成一个Token2.将拷贝的Token加到上文中执行的命令中3.查看报告 三、友情提示总结 前言 这篇博文是承接此文 .Net项目在Windows中使用sonarqube进行代码质量扫描的详细操作配置 描述如何导出PDF报告 众所周知&#xff0c;导出PDF功…

大数据实验9:Spark安装和编程实践

实验九&#xff1a;Spark基础编程1 一、实验目的 通过实验掌握基本的Spark编程方法&#xff1b;掌握用Spark解决一些基本的数据处理和统计分析&#xff0c;去重、排序等&#xff1b; 二、实验要求 掌握Spark相关shell命令的使用&#xff1b;完成下面的实验内容&#xff0c;…

主界面获取个人信息客户端方

主界面获取个人信息客户端方 前言 上一集我们完成了websocket身份验证的内容&#xff0c;那么这一集开始我们将要配合MockServer来完成主界面获取个人信息的内容。 需求分析 我们这边是完成客户端那方的内容&#xff0c;当客户端登录成功之后&#xff0c;我们就要从服务器获…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

极氪交付与整车营收双创新高,极氪汽车怎么做的?

在当前的新能源汽车市场上&#xff0c;新能源汽车的竞争已经白热化&#xff0c;各家新能源车企都面临巨大的压力&#xff0c;就在最近极氪的财报公布&#xff0c;交付与整车营收双创新高&#xff0c;极氪汽车是怎么做到的&#xff1f;极氪的未来我们又该怎么分析&#xff1f; 一…

HarmonyOS ArkUI(基于ArkTS) 开发布局 (上)

一 ArkUI(基于ArkTS)概述 基于ArkTS的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的UI开发框架&#xff0c;提供了构建应用UI所必需的能力 点击详情 特点 开发效率高&#xff0c;开发体验好 代码简洁&#xff1a;通过接近自然语义的方式描述UI&#x…

UE5 材质里面画圆锯齿严重的问题

直接这么画圆会带来锯齿&#xff0c;我们对锯齿位置进行模糊 可以用smoothstep&#xff0c;做值的平滑过渡&#xff08;虽然不是模糊&#xff0c;但是类似&#xff09;