当前位置: 首页 > news >正文

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语言封装加解密包&#xff08;AES/DES/RSA&#xff09; 1. Base64编码与解码2. AES加解密3. DES加解密4. RSA加解密5. SHA256哈希6. 单元测试1. AES加解密单元测试2. DES加解密单元测试3. RSA加解密单元测试4. SHA256哈希单元测试测试用例说明 总结 在现代软件开发中&#xf…...

sql server 对 nvarchar 类型的列进行 SUM() 运算

因为 SUM() 是一个数值聚合函数&#xff0c;不能直接应用于字符串类型的数据。为了正确汇总标准数量&#xff0c;你需要确保该列的数据类型是数值类型&#xff0c;如 int、decimal 或 float。 假设要统计数量列的和&#xff0c;由于数量列是 nvarchar 类型&#xff0c;你需要先…...

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原理及配置

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

口碑很好的国产LDO芯片,有哪些?

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

【流程设计】类似钉钉的流程设计功能样式demo

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

ChatGPT入门之文本情绪识别:先了解LSTM如何处理文字序列

文章目录 0. 首先聊聊什么是RNN1. 理解LSTM&#xff0c;从数据如何喂给 LSTM开始2. LSTM每个门是如何处理序列数据的&#xff1f;2.1 遗忘门&#xff08;Forget Gate&#xff09;&#xff1a;该忘掉哪些信息&#xff1f;2.2 输入门&#xff08;Input Gate&#xff09;&#xff…...

测试开发之面试宝典

目录 session和cookie的区别 session和cookie的区别 1.session和cookie都是鍵值对应的 2.session和cookie都是服务器生成的&#xff0c;session的ID&#xff0c;即服各器用来识别读取session对象的一把钥匙 3.session是保存在服各器端&#xff0c;而cookie是返回給客戶端的&…...

399. 除法求值【 力扣(LeetCode) 】

文章目录 零、LeetCode 原题一、题目描述二、测试用例三、解题思路3.1 图的路径搜索3.2 路径压缩 四、参考代码4.1 图的路径搜索4.2 路径压缩 零、LeetCode 原题 399. 除法求值 一、题目描述 给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件&#xff0c;…...

算法日记1:洛谷p2678跳石头(二分答案)

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

Unity shader中真的可以动态关闭Stencil Test吗?

这个问题很多年前就有人问了&#xff1a; https://discussions.unity.com/t/how-to-disable-the-stencil-block-via-shader-properties/600273/1 最后的答案是&#xff1a; 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&#xff08;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP通过多种机制实现可靠传输&#xff0c;这些机制主要包括连接管理、序列号和确认应答机制、重传机制、流量控制、拥塞控制等。 一、连接管理 TCP使用三次握手&#xff0…...

Git版本控制 - 创建使用Repository

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

MySQL —— 在CentOS9下安装MySQL

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

LeetCode 热题 100_腐烂的橘子(52_994_中等_C++)(图;广度优先遍历(队列))

LeetCode 热题 100_腐烂的橘子&#xff08;52_994&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;广度优先遍历&#xff08;队列&#xff09;&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一…...

Nginx 可观测性最佳实践

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

LabVIEW光流跟踪算法

1. 光流跟踪算法的概述 光流&#xff08;Optical Flow&#xff09;是一种图像处理技术&#xff0c;用于估算图像中像素点的运动。通过比较连续帧图像&#xff0c;光流算法可以分析图像中的运动信息&#xff0c;广泛用于目标跟踪、运动检测和视频处理等场景。该示例使用了NI Vi…...

Jira用例自动去除summary重复用例

title: Jira用例自动去除summary重复用例 tags: - jira - python categories: - python一、背景与需求二、解决方案思路三、实施步骤本文永久更新地址: 在使用 Jira 进行项目管理时&#xff0c;测试用例的维护至关重要。随着项目推进&#xff0c;用例数量增多&#xff0c;可能…...

基于openEuler22.03SP4部署Prometheus+Grafana

测试环境 Virtual Box&#xff0c;openEuler-22.03-LTS-SP4-x86_64-dvd.iso&#xff0c;4 vCPU, 8G RAM, 60 vDisk。最小化安装。需联网。 系统环境 关闭防火墙 systemctl stop firewalld systemctl disable firewalld systemctl status firewalld selinux关闭 sed -ri…...

从“摸黑探索”到“撞开大门”,OpenClaw引爆的产业技术路线演变-周红伟

3月的最后一周&#xff0c;OpenClaw的GitHub Issues区格外热闹——只是这一次&#xff0c;报错的不是开发者&#xff0c;而是安全研究员。 蚂蚁AI安全实验室、天融信(7.150, -0.14, -1.92%)、360在一周内密集披露了数十个安全漏洞&#xff0c;涉及远程接管、信息泄露等高风险问…...

OpenClaw技能开发入门:为Qwen3.5-9B定制图片分类插件

OpenClaw技能开发入门&#xff1a;为Qwen3.5-9B定制图片分类插件 1. 为什么需要开发图片分类技能 上周整理手机相册时&#xff0c;我对着3000多张杂乱无章的照片头疼不已——旅行风景、工作截图、宠物照片全都混在一起。手动分类不仅耗时费力&#xff0c;还经常因为主观判断不…...

Kmestepper:单头称重控制系统嵌入式协同驱动框架

1. Kmestepper 库概述&#xff1a;面向单头称重控制系统的嵌入式运动与称重协同驱动框架Kmestepper 是专为 KmeIoT 单头称重设备&#xff08;1-Head Weigher Device&#xff09;设计的嵌入式底层驱动库&#xff0c;其核心定位并非通用步进电机或称重传感器抽象层&#xff0c;而…...

从零到一:基于UTS与原生插件融合的UniApp安卓桌面小部件开发实践

1. 为什么UniApp开发者需要关注安卓桌面小部件&#xff1f; 作为一名长期使用UniApp的开发者&#xff0c;我最近在项目中遇到了一个有趣的需求&#xff1a;为安卓用户开发桌面小部件。你可能和我当初一样&#xff0c;觉得这个小功能可有可无。但当我真正在手机上使用了几款优秀…...

Python高频面试题:python里面模块和包之间有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【Python高频面试题&#xff1a;python里面模块和包之间有什么区别&#xff1f;】面试题 。希望对大家有帮助&#xff1b; Python高频面试题&#xff1a;python里面模块和包之间有什么区别&#xff1f; 在 Python 里&#xff0c;**模…...

4DGL-uLCD-SE:轻量级嵌入式GUI驱动框架

1. 项目概述4DGL-uLCD-SE 是一个面向嵌入式系统设计的轻量级、可移植的图形用户界面&#xff08;GUI&#xff09;驱动框架&#xff0c;专为 4D Systems 公司推出的 uLCD 系列智能显示模块&#xff08;如 uLCD-320GL, uLCD-70DT, uLCD-43PT 等&#xff09;而构建。该库并非直接操…...

VLC安卓版隐藏功能大揭秘:这些options参数让你的播放体验飞起

VLC安卓版隐藏功能大揭秘&#xff1a;这些options参数让你的播放体验飞起 作为安卓平台上最强大的开源播放器&#xff0c;VLC的潜力远不止表面看到的那些基础功能。许多用户不知道的是&#xff0c;通过调整options参数&#xff0c;可以彻底改变播放体验——解决卡顿、优化画质、…...

C++ 与 事务多版本并发控制(MVCC):在 C++ 存储内核中利用时间戳排序实现无锁读写冲突控制

各位开发者、架构师&#xff0c;以及对高性能并发系统充满热情的同仁们&#xff0c;大家好&#xff01;今天&#xff0c;我们将深入探讨一个在现代数据库和存储系统中至关重要的主题&#xff1a;多版本并发控制&#xff08;MVCC&#xff09;&#xff0c;并聚焦于如何在 C 存储内…...

# 005、游戏控制自动化基础:PyAutoGUI模拟键鼠与动作时序设计

昨天深夜调试一个自动打怪脚本时,遇到了诡异的问题——角色总是在释放技能后卡住不动。盯着屏幕看了半小时才发现,原来技能释放动画还没结束,脚本就急吼吼地点击了移动指令,两个事件堆在一起把游戏客户端搞懵了。这种时序问题在游戏自动化里太常见了,今天咱们就聊聊怎么用…...

Dankoe新作《使命与收益》读书笔记11|一人公司,不是找风口,是成为解决问题的人

你有没有过这种感觉—— 市场在变&#xff0c;AI在变&#xff0c;流量规则在变&#xff0c;你每天盯着行业动态&#xff0c;生怕错过什么风口。但越盯越焦虑&#xff0c;越焦虑越没有行动。 Dan Koe在《使命与收益》这最后的一个章节告诉我们一个事实&#xff1a; "有两…...