Go语言封装加解密包(AES/DES/RSA)
Go语言封装加解密包(AES/DES/RSA)
- 1. Base64编码与解码
- 2. AES加解密
- 3. DES加解密
- 4. RSA加解密
- 5. SHA256哈希
- 6. 单元测试
- 1. AES加解密单元测试
- 2. DES加解密单元测试
- 3. RSA加解密单元测试
- 4. SHA256哈希单元测试
- 测试用例说明
- 总结
在现代软件开发中,加解密技术是保障数据安全和隐私的重要手段。Go语言作为一门高效的编程语言,提供了丰富的加解密库,能够满足不同场景下的需求。本文将通过一个简单的crypt包,介绍Go语言如何实现常见的加解密算法,包括Base64编码、AES、DES、RSA加解密,以及SHA256哈希等。
1. Base64编码与解码
Base64是一种常见的编码方式,通常用于在网络中传输二进制数据。例如,在电子邮件和HTTP请求中,Base64编码可以将二进制数据转换为文本字符串,方便传输和存储。
Base64编码
// Base64Encode 编码数据为Base64格式
func Base64Encode(data []byte) string {return base64.StdEncoding.EncodeToString(data)
}
Base64解码
// Base64Decode 解码Base64格式数据
func Base64Decode(data string) ([]byte, error) {return base64.StdEncoding.DecodeString(data)
}
示例
data := []byte("Hello, World!")
encoded := Base64Encode(data)
fmt.Println("Encoded:", encoded)decoded, err := Base64Decode(encoded)
if err != nil {fmt.Println("Error decoding:", err)
} else {fmt.Println("Decoded:", string(decoded))
}
2. AES加解密
AES(Advanced Encryption Standard)是一种对称加密算法,广泛应用于数据加密。AES加密和解密使用相同的密钥,因此它是一种非常高效的加解密方式。
AES加密
// AESEncrypt 使用AES算法加密明文
func AESEncrypt(plaintext, key string) (string, error) {block, err := aes.NewCipher([]byte(key))if err != nil {return "", err}// 生成随机的IVciphertext := make([]byte, aes.BlockSize+len(plaintext))iv := ciphertext[:aes.BlockSize]_, err = io.ReadFull(rand.Reader, iv)if err != nil {return "", err}// 使用CFB模式进行加密stream := cipher.NewCFBEncrypter(block, iv)stream.XORKeyStream(ciphertext[aes.BlockSize:], []byte(plaintext))return Base64Encode(ciphertext), nil
}
AES解密
// AESDecrypt 使用AES算法解密密文
func AESDecrypt(ciphertext, key string) (string, error) {data, err := Base64Decode(ciphertext)if err != nil {return "", err}block, err := aes.NewCipher([]byte(key))if err != nil {return "", err}if len(data) < aes.BlockSize {return "", errors.New("ciphertext too short")}iv := data[:aes.BlockSize]data = data[aes.BlockSize:] // 移除IV// 使用CFB模式解密stream := cipher.NewCFBDecrypter(block, iv)stream.XORKeyStream(data, data)return string(data), nil
}
3. DES加解密
DES(Data Encryption Standard)是另一种对称加密算法,虽然由于密钥较短(56位),它现在已经不再被推荐用于新的系统中,但它仍然可以作为学习加密算法的一个例子。
DES加密
// DesEncrypt 使用DES算法加密明文
func DesEncrypt(plaintext, key string) (string, error) {block, err := des.NewCipher([]byte(key))if err != nil {return "", err}// 生成随机的IVciphertext := make([]byte, des.BlockSize+len(plaintext))iv := ciphertext[:des.BlockSize]_, err = io.ReadFull(rand.Reader, iv)if err != nil {return "", err}// 使用CFB模式进行加密stream := cipher.NewCFBEncrypter(block, iv)stream.XORKeyStream(ciphertext[des.BlockSize:], []byte(plaintext))return Base64Encode(ciphertext), nil
}
DES解密
// DesDecrypt 使用DES算法解密密文
func DesDecrypt(ciphertext, key string) (string, error) {data, err := Base64Decode(ciphertext)if err != nil {return "", err}block, err := des.NewCipher([]byte(key))if err != nil {return "", err}if len(data) < des.BlockSize {return "", errors.New("ciphertext too short")}iv := data[:des.BlockSize]data = data[des.BlockSize:] // 移除IV// 使用CFB模式解密stream := cipher.NewCFBDecrypter(block, iv)stream.XORKeyStream(data, data)return string(data), nil
}
4. RSA加解密
RSA是一种非对称加密算法,广泛用于数据传输的加密。它使用公钥加密,私钥解密。RSA密钥对是由公钥和私钥组成,具有非常高的安全性。
RSA加密
// RsaEncrypt 使用RSA公钥加密明文
func RsaEncrypt(plaintext string, publicKey string) (string, error) {block, _ := pem.Decode([]byte(publicKey))if block == nil {return "", errors.New("public key error")}pub, err := x509.ParsePKCS1PublicKey(block.Bytes)if err != nil {return "", err}ciphertext, err := rsa.EncryptPKCS1v15(rand.Reader, pub, []byte(plaintext))if err != nil {return "", err}return Base64Encode(ciphertext), nil
}
RSA解密
// RsaDecrypt 使用RSA私钥解密密文
func RsaDecrypt(ciphertext string, privateKey string) (string, error) {block, _ := pem.Decode([]byte(privateKey))if block == nil {return "", errors.New("private key error")}priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {return "", err}data, err := Base64Decode(ciphertext)if err != nil {return "", err}decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, priv, data)if err != nil {return "", err}return string(decryptedBytes), nil
}
生成密钥对
// RsaDecrypt 使用RSA私钥解密密文
func RsaDecrypt(ciphertext string, privateKey string) (string, error) {block, _ := pem.Decode([]byte(privateKey))if block == nil {return "", errors.New("private key error")}priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {return "", err}data, err := Base64Decode(ciphertext)if err != nil {return "", err}decryptedBytes, err := rsa.DecryptPKCS1v15(rand.Reader, priv, data)if err != nil {return "", err}return string(decryptedBytes), nil
}
5. SHA256哈希
SHA256是一种常见的哈希算法,广泛用于数据完整性验证。它将任意长度的数据映射为256位的哈希值。
// SHA256Hash 返回SHA256哈希值
func SHA256Hash(data string) string {hash := sha256.New()hash.Write([]byte(data))return Base64Encode(hash.Sum(nil))
}
6. 单元测试
1. AES加解密单元测试
func TestAES(t *testing.T) {key := "1234567890123456" // AES要求16字节密钥plaintext := "This is a secret message."// 加密ciphertext, err := AESEncrypt(plaintext, key)if err != nil {t.Fatalf("AES encryption failed: %v", err)}t.Logf("Encrypted AES: %s", ciphertext)// 解密decryptedText, err := AESDecrypt(ciphertext, key)if err != nil {t.Fatalf("AES decryption failed: %v", err)}if decryptedText != plaintext {t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)}t.Logf("Decrypted AES: %s", decryptedText)
}
2. DES加解密单元测试
func TestDES(t *testing.T) {key := "12345678" // DES要求8字节密钥plaintext := "This is another secret message."// 加密ciphertext, err := DesEncrypt(plaintext, key)if err != nil {t.Fatalf("DES encryption failed: %v", err)}t.Logf("Encrypted DES: %s", ciphertext)// 解密decryptedText, err := DesDecrypt(ciphertext, key)if err != nil {t.Fatalf("DES decryption failed: %v", err)}if decryptedText != plaintext {t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)}t.Logf("Decrypted DES: %s", decryptedText)
}
3. RSA加解密单元测试
func TestRSA(t *testing.T) {// 生成RSA密钥对privateKey, publicKey, err := GenerateRSAKeyPair(2048)if err != nil {t.Fatalf("RSA key pair generation failed: %v", err)}assert.NotNil(t, privateKey)assert.NotNil(t, publicKey)t.Logf("Private Key: %s", privateKey)t.Logf("Public Key: %s", publicKey)plaintext := "Sensitive information"// 使用公钥加密encryptedText, err := RsaEncrypt(plaintext, publicKey)if err != nil {t.Fatalf("RSA encryption failed: %v", err)}t.Logf("Encrypted RSA: %s", encryptedText)// 使用私钥解密decryptedText, err := RsaDecrypt(encryptedText, privateKey)if err != nil {t.Fatalf("RSA decryption failed: %v", err)}if decryptedText != plaintext {t.Fatalf("Expected %s, but got %s", plaintext, decryptedText)}t.Logf("Decrypted RSA: %s", decryptedText)
}
4. SHA256哈希单元测试
func TestSHA256(t *testing.T) {data := "Some important data"hash := SHA256Hash(data)t.Logf("SHA256 Hash: %s", hash)
}
测试用例说明
- AES和DES加解密:测试首先会对输入的明文进行加密,然后尝试解密密文,确保解密后的结果与原始明文一致。通过这种方式,验证加密和解密过程的正确性。
- RSA加解密:在测试RSA加解密时,首先生成一对公私钥,然后用公钥加密数据,再用私钥解密。解密后的数据应与原始明文相同。
- SHA256哈希:通过生成一个字符串的SHA256哈希值并打印,验证哈希函数的正确性。
- 运行测试:go test -v
总结
通过封装常见的加解密算法,Go语言为我们提供了丰富的工具来保护数据的隐私和完整性。从Base64编码到对称加密(AES、DES),再到非对称加密(RSA)和哈希(SHA256),我们可以根据实际需求选择合适的算法进行数据保护。
本示例展示了如何使用Go语言的标准库和一些常见的加解密算法来实现数据加解密操作。对于需要更高安全性的应用,建议使用更长的密钥、更新的算法(如AES-GCM)以及合适的加密模式。
相关文章:
Go语言封装加解密包(AES/DES/RSA)
Go语言封装加解密包(AES/DES/RSA) 1. Base64编码与解码2. AES加解密3. DES加解密4. RSA加解密5. SHA256哈希6. 单元测试1. AES加解密单元测试2. DES加解密单元测试3. RSA加解密单元测试4. SHA256哈希单元测试测试用例说明 总结 在现代软件开发中…...
sql server 对 nvarchar 类型的列进行 SUM() 运算
因为 SUM() 是一个数值聚合函数,不能直接应用于字符串类型的数据。为了正确汇总标准数量,你需要确保该列的数据类型是数值类型,如 int、decimal 或 float。 假设要统计数量列的和,由于数量列是 nvarchar 类型,你需要先…...
java中json字符串键值获取
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.83</version> </dependency>使用fastjson依赖 JSONObject jsonObject JSON.parseObject(s); 这个jsonObject本质就是一个map&…...

MPLS原理及配置
赶时间可以只看实验部分 由来:90年代中期,互联网流量的快速增长。传统IP报文依赖路由器查询路由表转发,但由于硬件技术存在限制导致转发性能低,查表转发成为了网络数据转发的瓶颈。 因此,旨在提高路由器转发速度的MPL…...

口碑很好的国产LDO芯片,有哪些?
在几乎任何一个电路设计中,都可能会使用LDO(低压差线性稳压器)这个器件。 虽然LDO不是什么高性能的IC,但LDO芯片市场竞争异常激烈。最近几年,诞生了越来越多的精品国产LDO,让人看得眼花缭乱。 业内人士曾经…...

【流程设计】类似钉钉的流程设计功能样式demo
对于一些审批流程,可能会用到这个功能,通过这样一层层的加下来,弄一个审批流程的数组,然后根据这个来审核是否都通过审批,这里是简单的弄一个样式的demo,功能自由发挥 <!DOCTYPE html> <html>…...

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列
文章目录 0. 首先聊聊什么是RNN1. 理解LSTM,从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的?2.1 遗忘门(Forget Gate):该忘掉哪些信息?2.2 输入门(Input Gate)ÿ…...
测试开发之面试宝典
目录 session和cookie的区别 session和cookie的区别 1.session和cookie都是鍵值对应的 2.session和cookie都是服务器生成的,session的ID,即服各器用来识别读取session对象的一把钥匙 3.session是保存在服各器端,而cookie是返回給客戶端的&…...
399. 除法求值【 力扣(LeetCode) 】
文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路3.1 图的路径搜索3.2 路径压缩 四、参考代码4.1 图的路径搜索4.2 路径压缩 零、LeetCode 原题 399. 除法求值 一、题目描述 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,…...

算法日记1:洛谷p2678跳石头(二分答案)
1、题目 二、题解: 2.1解题思路: 1.题目要求求出最小值最大,明显的二分答案题目,所以我们可以二分可以跳跃距离int l-1,rL1; 2.此时我们思考lmid和rmid的处理,当我们的check(mid)为true时候 表明我们此时的mid是符合要求的, 那么…...

Unity shader中真的可以动态关闭Stencil Test吗?
这个问题很多年前就有人问了: https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是: set [_StencilComp] to CompareFunction.Disabled to disable the Stencil Op completely. 但是我测试…...

YOLOv9改进,YOLOv9自研检测头融合HyCTAS的Self_Attention自注意力机制,2024,适合目标检测、分割任务
摘要 论文提出了一种新的搜索框架,名为 HyCTAS,用于在给定任务中自动搜索高效的神经网络架构。HyCTAS框架结合了高分辨率表示和自注意力机制,通过多目标优化搜索,找到了一种在性能和计算效率之间的平衡。 # 理论介绍 自注意力(Self-Attention)机制是HyCTAS框架中的一个…...

计算机网络 (36)TCP可靠传输的实现
前言 TCP(传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输,这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手࿰…...

Git版本控制 - 创建使用Repository
Git版本控制 – 创建使用Repository Version Control with Git - Create and Use Repository By JacksonML 上文提到,Git是一种分布式版本控制系统。作为全球范围内广泛使用的工具,如何将项目分步骤运用到其中呢? 本文简要介绍如何用Git工…...

MySQL —— 在CentOS9下安装MySQL
MySQL —— 在CentOS9下安装MySQL 1.查看自己操作系统的版本2.找到对应的安装源3.上传我们在windows下,下载的文件,解压4.执行rpm命令,启用MySQL8仓库5.执行dnf install -y mysql-community-server6.设置开机自启动7.获得初始密码8.登录MySQL…...

LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))
LeetCode 热题 100_腐烂的橘子(52_994) 题目描述:输入输出样例:题解:解题思路:思路一(广度优先遍历(队列)): 代码实现代码实现(思路一…...

Nginx 可观测性最佳实践
Nginx 介绍 Nginx 是一个开源、轻量级、高性能的 HTTP 和反向代理服务器,也可以用于 IMAP/POP3 代理服务器。Nginx 因其采用的异步非阻塞工作模型,使其具备高并发、低资源消耗的特性。高度模块化设计也使得 Nginx 具备很好的扩展性,在处理静…...

LabVIEW光流跟踪算法
1. 光流跟踪算法的概述 光流(Optical Flow)是一种图像处理技术,用于估算图像中像素点的运动。通过比较连续帧图像,光流算法可以分析图像中的运动信息,广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…...
Jira用例自动去除summary重复用例
title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时,测试用例的维护至关重要。随着项目推进,用例数量增多,可能…...
基于openEuler22.03SP4部署Prometheus+Grafana
测试环境 Virtual Box,openEuler-22.03-LTS-SP4-x86_64-dvd.iso,4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 sed -ri…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...