【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 【Golang】国密SM2公钥私钥序列化到redis中并加密解密实战_sm2反编(1)
redisTemplate.Set(context.Background(), “privateKey”, privateKeyToString, g.OneDayDuration)
return
}
③测试用例
func TestSM2_Local_GenerateKeyPair(t *testing.T) {
// 生成密钥对
publicKeyObj, privateKeyObj := generateLoc()
// 输出公钥和私钥字符串
t.Log(“公钥字符串:”, PublicKeyToString(publicKeyObj))
// 040a5cccc33685eade33b0a1a40f1eea0f86ae93bd3cbb9f88fa466ca49a87bdbcd1ab65c9cb9f587a3b1f6d143f964acab78a23c2c37b1c16e2d16b796861f7bf
t.Log(“私钥字符串:”, PrivateKeyToString(privateKeyObj))
// 5b8037839b43ee13804e4c9fb3626b8949f0f58729547f0da4e8415481243b03
}
打印结果:
=== RUN TestSM2_Local_GenerateKeyPair
sm2_test.go:14: 公钥字符串:040a5cccc33685eade33b0a1a40f1eea0f86ae93bd3cbb9f88fa466ca49a87bdbcd1ab65c9cb9f587a3b1f6d143f964acab78a23c2c37b1c16e2d16b796861f7bf
sm2_test.go:16: 私钥字符串:5b8037839b43ee13804e4c9fb3626b8949f0f58729547f0da4e8415481243b03
— PASS: TestSM2_Local_GenerateKeyPair (0.00s)
PASS

2.使用公钥加密

①需求描述

要使用上面生成并缓存在redis中的公钥字符串,对内容进行加密.

②编写代码

将公钥字符串反序列化转为公钥对象:

// StringToPublicKey 公钥字符串还原为 sm2.PublicKey 对象(与java中org.bouncycastle.crypto生成的公私钥完全互通使用)
func StringToPublicKey(publicKeyStr string) (*sm2.PublicKey, error) {
publicKeyBytes, err := hex.DecodeString(publicKeyStr)
if err != nil {
return nil, err
}
// 提取 x 和 y 坐标字节切片
curve := sm2.P256Sm2().Params()
byteLen := (curve.BitSize + 7) / 8
xBytes := publicKeyBytes[1 : byteLen+1]
yBytes := publicKeyBytes[byteLen+1 : 2*byteLen+1]
// 将字节切片转换为大整数
x := new(big.Int).SetBytes(xBytes)
y := new(big.Int).SetBytes(yBytes)
// 创建 sm2.PublicKey 对象
publicKey := &sm2.PublicKey{
Curve: curve,
X: x,
Y: y,
}
return publicKey, nil
}
使用公钥对象加密字符串:
// publicKeyStr 公钥字符串, text 待加密明文字符串
func encryptLoc(publicKeyStr, text string) (string, error) {
publicKey, err := StringToPublicKey(publicKeyStr)
if err != nil {
return “”, err
}
encryptStr, _ := sm2.Encrypt(publicKey, []byte(text), rand.Reader, sm2.C1C2C3)
encodeToString := hex.EncodeToString(encryptStr)
fmt.Println(“加密后的字符串:”, encodeToString)
return strings.ToUpper(encodeToString), nil
}
从redis取公钥并加密明文, 将上面两个函数整合:
// SM2_Encrypt_Local sm2 本地加密
//
// @version latest
func SM2_Encrypt_Local(text string) (string, error) {
// 先检测redis中是否缓存有密钥
redisTemplate := redis.RedisTemplate// 你自己的redis客户端获取方式
publicKeyStr, _ := redisTemplate.Get(context.Background(), “publicKey”).Result()
publicKey := strings.ReplaceAll(publicKeyStr, “”", “”)
if publicKey == “” {
// 重新生成密钥
publicKey, _ = SM2_GenerateKeyPair_Local()
}
encrypt, err := encryptLoc(publicKey, text)
if err != nil {
return “”, err
}
return encrypt, nil
}
③测试用例
将字符串 ABC123加密
func TestSM2_Local_Encrypt(t *testing.T) {
publicKeyStr := “040a5cccc33685eade33b0a1a40f1eea0f86ae93bd3cbb9f88fa466ca49a87bdbcd1ab65c9cb9f587a3b1f6d143f964acab78a23c2c37b1c16e2d16b796861f7bf”
publicKey, _ := StringToPublicKey(publicKeyStr)
encryptStr, _ := sm2.Encrypt(publicKey, []byte(“ABC123”), rand.Reader, sm2.C1C2C3)
encodeToString := hex.EncodeToString(encryptStr)
t.Log(“加密后的字符串:”, encodeToString)
}
打印结果:
=== RUN TestSM2_Local_Encrypt
sm2_test.go:25: 加密后的字符串: 04d5bfb00dff8607a07337ff5999cbad8713a286c2655797148211dbf315b616faad48999428faf1597413d5d1cd81a425ccf192783c28cccd7a00ce618c759e29b82e5a34af99c34b0792d81026a6ca16317e76e11190c6564810a0737ceebb26a555498b23e0
— PASS: TestSM2_Local_Encrypt (0.00s)
PASS

3.使用私钥解密

①需求描述

要使用上面生成并缓存在redis中的私钥字符串,对加密的字符串进行解密

②编写代码
将私钥字符串反序列化转为私钥对象:
// StringToPrivateKey 私钥还原为 sm2.PrivateKey对象(与java中org.bouncycastle.crypto生成的公私钥完全互通使用)
func StringToPrivateKey(privateKeyStr string, publicKey *sm2.PublicKey) (*sm2.PrivateKey, error) {
privateKeyBytes, err := hex.DecodeString(privateKeyStr)
if err != nil {
return nil, err
}
// 将字节切片转换为大整数
d := new(big.Int).SetBytes(privateKeyBytes)
// 创建 sm2.PrivateKey 对象
privateKey := &sm2.PrivateKey{
PublicKey: *publicKey,
D: d,
}
return privateKey, nil
}
使用私钥对象解密密文字符串:
func decryptLoc(publicKeyStr, privateKeyStr, cipherText string) (string, error) {
publicKeyObj, err := StringToPublicKey(publicKeyStr)
if err != nil {
fmt.Println(err)
}
privateKeyObj, err := StringToPrivateKey(privateKeyStr, publicKeyObj)
if err != nil {
fmt.Println(err)
}
decodeString, err := hex.DecodeString(cipherText)
decrypt, err := sm2.Decrypt(privateKeyObj, decodeString, sm2.C1C2C3)
if err != nil {
fmt.Println(err)
}
resultStr := string(decrypt)
fmt.Println(“解密后的字符串:”, resultStr)
return resultStr, nil
}
从redis取私钥字符串并解密密文, 将上面两个函数整合:
// SM2_Decrypt_Local sm2 本地解密
//
// @version latest


相关文章
|
5天前
|
JavaScript 前端开发 安全
js逆向实战之烯牛数据请求参数加密和返回数据解密
【9月更文挑战第20天】在JavaScript逆向工程中,处理烯牛数据的请求参数加密和返回数据解密颇具挑战。本文详细分析了这一过程,包括网络请求监测、代码分析、加密算法推测及解密逻辑研究,并提供了实战步骤,如确定加密入口点、逆向分析算法及模拟加密解密过程。此外,还强调了法律合规性和安全性的重要性,帮助读者合法且安全地进行逆向工程。
31 11
|
3天前
|
JSON 缓存 NoSQL
redis序列化数据时,如何包含clsss类型信息?
通过配置 `com.fasterxml.jackson.databind.ObjectMapper` 的 `enableDefaultTyping` 方法,可以使序列化后的 JSON 包含类信息。
20 2
|
15天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
33 8
|
28天前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。
|
28天前
|
运维 安全 应用服务中间件
自动化运维的利器:Ansible入门与实战网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第30天】在当今快速发展的IT时代,自动化运维已成为提升效率、减少错误的关键。本文将介绍Ansible,一种流行的自动化运维工具,通过简单易懂的语言和实际案例,带领读者从零开始掌握Ansible的使用。我们将一起探索如何利用Ansible简化日常的运维任务,实现快速部署和管理服务器,以及如何处理常见问题。无论你是运维新手还是希望提高工作效率的资深人士,这篇文章都将为你开启自动化运维的新篇章。
|
29天前
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
57 1
|
24天前
|
SQL 安全 网络安全
网络安全之盾:漏洞防御与加密技术的实战应用
【9月更文挑战第2天】在数字时代的浪潮中,网络安全成为保护个人隐私和企业资产的坚固盾牌。本文深入探讨了网络安全的两个核心要素:防御漏洞和加密技术。我们将从基础概念入手,逐步剖析常见的网络攻击手段,并分享如何通过实践加强安全意识。同时,提供代码示例以增强理解,旨在为读者构建一道坚不可摧的网络安全防线。
|
27天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
33 0
|
27天前
|
SQL 安全 网络安全
网络防御前线:漏洞识别与加密技术的实战应用
【8月更文挑战第31天】在数字化浪潮下,网络安全成为守护数据资产的盾牌。本文深入浅出地探讨了网络安全漏洞的成因与对策,并结合实例展示了加密技术的应用。通过提升安全意识与实践操作,我们能够有效防范网络威胁,保护个人与企业的信息不受侵害。
|
27天前
|
安全 算法 网络安全
网络安全之盾:漏洞防护与加密技术的实战解析
【8月更文挑战第31天】本文将通过浅显易懂的方式,带领读者了解网络安全的基石——漏洞防护和加密技术。我们将从基础概念入手,逐步深入到实际应用,不仅分享理论知识,更提供代码示例,帮助读者构建起自己的网络安全防线。无论你是初学者还是有一定基础的技术人员,这篇文章都将为你的安全知识库添砖加瓦。