Python3简单实现与Java的Hutool库SM2的加解密互通

news2024/10/7 20:30:37

1、背景:

因业务需求,需要与某平台接口对接。平台是Java基于Hutool库实现的SM2加密解密,研究了下SM2的加解密算法,网上找的资料,都是说SM2【椭圆曲线】 公钥长【x,y分量 64字节】,私钥短【32字节】;而平台给的Hutool生成的密钥对,私钥反而比公钥更长,直接用Pyhton做SM2加解密,难以实现数据的互通。后多方查找资料,几经测试终于弄成,其他编程语言亦可参考,现分享如下。

2、密钥分析:

主要参考资料,引用自:https://juejin.cn/post/6981721907653509128

公钥转码分析:

私钥转码分析:

加解密注意事项:

Python Demo 代码:

#!/usr/bin/python3
#coding=utf-8

#用Python实现与Java Hutool库  SM2加密、解密 互通
#重要参考资料 引用 https://juejin.cn/post/6981721907653509128

from gmssl import sm2
from base64 import b64encode, b64decode
import requests

# 常量定义 用Java Hutool库 实现的SM2加密、解密的接口 【密钥格式:Base64, 密文格式:Hex字符串,大写】
JAVA_HUTOOL_ENCRYPT_URL = 'http://127.0.0.1:8384/publicKeyEncrypt'
JAVA_HUTOOL_DECRYPT_URL = 'http://127.0.0.1:8384/privateKeyDecrypt'

def sm2_key_pair_java_hutool_to_python(public_sm2_key_base64, private_sm2_key_base64):
    """
    将Java Hutool生成的SM2公钥和私钥转换为Python中使用的格式
    
    Args:
        public_sm2_key_base64 (str): Java Hutool生成的SM2公钥的Base64编码字符串
        private_sm2_key_base64 (str): Java Hutool生成的SM2私钥的Base64编码字符串

    Returns:
        tuple: 包含两个元素的元组,分别为:
        - str: 截取后的SM2公钥(大写的Hex字符串)
        - str: 截取后的SM2私钥(大写的Hex字符串)
    """
    public_sm2_key_bin = b64decode(public_sm2_key_base64)
    private_sm2_key_bin = b64decode(private_sm2_key_base64)
    public_sm2_key_hex = ''.join(format(x, '02X') for x in public_sm2_key_bin)
    private_sm2_key_hex = ''.join(format(x, '02X') for x in private_sm2_key_bin)
    sm2_public_key = public_sm2_key_hex[-128:]
    sm2_private_key = private_sm2_key_hex[72:72+64]
    return sm2_public_key, sm2_private_key

def encrypt(message, sm2_crypt):
    """
    使用SM2加密消息
    
    Args:
        message (str): 要加密的消息
        sm2_crypt (sm2.CryptSM2): SM2加密对象

    Returns:
        str: 加密后的Hex字符串
    """
    try:
        byte_array = sm2_crypt.encrypt(message.encode(encoding="utf-8"))
        encode_info = '04' + ''.join(format(x, '02X') for x in byte_array)
        return encode_info
    except Exception as e:
        print(f"Encryption error: {e}")
        return None

def decrypt(hex_string, sm2_crypt):
    """
    使用SM2解密Hex字符串
    
    Args:
        hex_string (str): 要解密的Hex字符串
        sm2_crypt (sm2.CryptSM2): SM2加密对象

    Returns:
        str: 解密后的明文信息
    """
    try:
        if hex_string.startswith("04"):
            hex_string = hex_string[2:]
        byte_array = bytes.fromhex(hex_string)
        decode_info = sm2_crypt.decrypt(byte_array).decode(encoding="utf-8")
        return decode_info
    except Exception as e:
        print(f"Decryption error: {e}")
        return None

def encrypt_java_hutool(message, public_key_base64):
    """
    使用Java Hutool加密消息
    
    Args:
        message (str): 要加密的消息
        public_key_base64 (str): Java Hutool生成的公钥的Base64编码字符串

    Returns:
        str: 加密后的字符串
    """
    try:
        data = {
            'publicKey': public_key_base64,
            'plainTxt': message
        }
        response = requests.post(url=JAVA_HUTOOL_ENCRYPT_URL, data=data)
        return response.json()['data']
    except Exception as e:
        print(f"Java Hutool Encryption error: {e}")
        return None

def decrypt_java_hutool(cipher, private_key_base64):
    """
    使用Java Hutool解密消息
    
    Args:
        cipher (str): 要解密的Hex字符串
        private_key_base64 (str): Java Hutool生成的私钥的Base64编码字符串

    Returns:
        str: 解密后的明文信息
    """
    try:
        data = {
            'privateKey': private_key_base64,
            'ciphertext': cipher
        }
        response = requests.post(url=JAVA_HUTOOL_DECRYPT_URL, data=data)
        return response.json()['data']
    except Exception as e:
        print(f"Java Hutool Decryption error: {e}")
        return None

if __name__ == "__main__":
    # JavaHutool 生成的公钥私钥对
    public_sm2_key_base64 = 'MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAErcXffRE7psQ7xTkrxEBzH3VQVviZ/pd1HBDFTfUwOmqx5n4zNjqJfDzS7yvFCfAmehoejdeE2UTecJgb72dtDQ=='
    private_sm2_key_base64 = 'MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgXFpB6hO0RjwT7UhFkqBX85/hclTf45nPZ8ljuANGTu+gCgYIKoEcz1UBgi2hRANCAAStxd99ETumxDvFOSvEQHMfdVBW+Jn+l3UcEMVN9TA6arHmfjM2Ool8PNLvK8UJ8CZ6Gh6N14TZRN5wmBvvZ20N'
    
    sm2_public_key, sm2_private_key = sm2_key_pair_java_hutool_to_python(public_sm2_key_base64, private_sm2_key_base64)
    
    sm2_crypt = sm2.CryptSM2(
        public_key=sm2_public_key, 
        private_key=sm2_private_key
    )

    message = "呵呵呵1234567890123abc"
    print("原始内容为: " + message)

    cipher = encrypt(message, sm2_crypt)
    print("Python加密结果为: " + cipher)

    java_hutool_message = decrypt_java_hutool(cipher, private_sm2_key_base64)
    print("Java Hutool解密结果为: " + java_hutool_message)

    java_hutool_cipher = encrypt_java_hutool(message, public_sm2_key_base64)
    print("Java Hutool加密结果为: " + java_hutool_cipher)

    python_message = decrypt(java_hutool_cipher, sm2_crypt)
    print("Python解密结果为: " + python_message)

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

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

相关文章

ChatTTS增强版V3【已开源】,长文本修复,中英混读,导入音色,批量SRT、TXT

ChatTTS增强版V3来啦!本次更新增加支持导入SRT、导入音色等功能。结合上次大家反馈的问题,修复了长文本、中英混读等问题。 项目已开源(https://github.com/CCmahua/ChatTTS-Enhanced) 项目介绍 V3 ChatTTS增强版V3,长文本修复&#xff0c…

拔河【码蹄杯】/二分

拔河 二分 思路&#xff1a;二分平均力量值&#xff0c;并在check中利用前缀和判断。 #include<bits/stdc.h> using namespace std; typedef long long ll; ll a[100005]; double sum[100005]; ll f,n; bool check(double x) {double dx;double mn0;for(int i1;i<n;…

【MySQL进阶之路 | 高级篇】InnoDB存储结构

1. 数据库的存储结构 : 页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的.确切说是存储在页结构中.另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;MySQL服务器上的存储引擎负责对表中数据的读取和写入操作.不同的存…

助力数据跨境,最新政策解读与应用实践分享

6月13日&#xff0c;VERYCLOUD睿鸿股份联合深数所企业数据合规服务南山工作站、亚马逊云科技&#xff0c;在深圳南山区共同主办了一场关于《数据出境合规之路——法规解析与实践探索》研讨会。 VERYCLOUD睿鸿股份是南山大数据产业协会的副会长单位。南山大数据产业协会作为深圳…

Python二级考试试题

1. 关于数据的存储结构&#xff0c;以下选项描述正确的是 A 数据所占的存储空间量 B 数据在计算机中的顺序存储方式 C 数据的逻辑结构在计算机中的表示 D 存储在外存中的数据 正确答案&#xff1a; C 2. 关于线性链表的描述&#xff0c;以下选项中正确的是 A 存储空…

CSDN低质量分文章自动化获取

1. 背景 最近粉丝终于达到了5K&#xff0c;可是仍然无法通过优质作者申请&#xff0c;原来是平均质量分较低&#xff0c;优化了一些文章后分数提高仍然较慢&#xff0c;所以需要批量获取低质量文章&#xff0c;重点优化 2. 目标效果 3. 核心代码 其中的Cookie可以根据浏览器…

Ubuntu系统通过GRUB引导菜单进入恢复模式修改账户密码

当在Ubuntu系统中忘记了账户密码时&#xff0c;有几种方法可以破解或重置密码。 本指引文档方法&#xff1a;通过GRUB引导菜单进入恢复模式 实践环境为&#xff1a;20.04.6 LTS (Focal Fossa) 1. 重启Ubuntu系统&#xff1a;首先&#xff0c;你需要重启你的Ubuntu系统。 2. …

【PyTorch】【机器学习】图片张量、通道分解合成和裁剪

一、导入所需库 from PIL import Image import torch import numpy as np import matplotlib.pyplot as plt二、读取图片 pic np.array(Image.open(venice-boat.jpg))上述代码解释&#xff1a;先用Image.open()方法读取jpg格式图片&#xff0c;再用np.array()方法将图片转成…

图解Transformer

图解Transformer Transformer模型是在论文《Attention is All You Need》中提出的。它的TensorFlow实现作为Tensor2Tensor包的一部分是可用的。哈佛大学的自然语言处理小组创建了一个指南&#xff0c;用PyTorch实现对论文进行了注释。在这篇文章中&#xff0c;我们将尝试简化一…

基于CST的连续域束缚态(BIC)设计与机制研究

关键词&#xff1a;太赫兹&#xff0c;超表面&#xff0c;连续域束缚态&#xff0c;CST&#xff0c;高Q 束缚态的概念最先出现于量子力学中&#xff0c;当粒子被势场约束在特定的区域内运动&#xff0c;即在无限远处波函数等于零的态叫束缚态&#xff0c;例如势阱中的粒子就处…

MySQL操作语句练习【经典20题】

emp 表视图 dept 表视图 题目 1.请从表EMP中查找工种是职员CLERK或经理MANAGER的雇员姓名、工资。 2.请在EMP表中查找部门号在10&#xff0d;30之间的雇员的姓名、部门号、工资、工作。 3.请从表EMP中查找姓名以J开头所有雇员的姓名、工资、职位。 4.请从表EMP中查找工资低…

EM算法数学推导

EM算法可以看李航老师的《机器学习方法》、机器学习白板推导、EM算法及其推广进行学习。下文的数学推导出自“南瓜书”&#xff0c;记录在此只为方便查阅。

qt 简单实验 读取json格式的配置文件

1.概要 2.代码 //#include "mainwindow.h"#include <QApplication> #include <QFile> #include <QJsonDocument> #include <QJsonObject> #include <QDebug> //读取json数据的配置文件QJsonObject readJsonConfigFile(const QString …

python-邮票组合问题

[题目描述] 某人有四张3分的邮票和三张5分的邮票&#xff0c;用这些邮票中的一张或若干张可以得到多少种不同的邮资&#xff1f;输入格式&#xff1a; 此题无输入。输出格式&#xff1a; 输出可以得到不同邮资的数量。 样例输入 无样例输出 19数据范围&#xff1a; 对于100%的…

Stable Diffusion 3 文本生成图像 在线体验 原理分析

前言 本文分享使用Stable Diffusion 3实现文本生成图像&#xff0c;可以通过在线网页中免费使用的&#xff0c;也有API等方式访问。 同时结合论文和开源代码进行分析&#xff0c;理解其原理。 Stable Diffusion 3是Stability AI开发的最新、最先进的文本生成图像模型&#x…

Linux常用命令(16)—awk命令(有相关截图)

写在前面&#xff1a; 最近在学习Linux命令&#xff0c;记录一下学习Linux常用命令的过程&#xff0c;方便以后复习。仅供参考&#xff0c;若有不当的地方&#xff0c;恳请指正。如果对你有帮助&#xff0c;欢迎点赞&#xff0c;关注&#xff0c;收藏&#xff0c;评论&#xf…

秋招突击——6/21——新作{两两交换链表中的节点,K个一组反转链表}

文章目录 引言新做删除有序数组中的重复项个人实现 K 个一组翻转链表个人实现参考代码 总结 引言 上午完全去听讲座了&#xff0c;听了三场&#xff0c;拿了三个讲座单&#xff0c;从九点一直到十二点。笔记本电脑插电才能用&#xff0c;就没带&#xff0c;所以没有进行复习。…

GIT回滚

1. 使用 git revert git revert 命令会创建一个新的提交&#xff0c;这个提交会撤销指定提交的更改。这通常用于公共分支&#xff08;如 main 或 master&#xff09;&#xff0c;因为它不会重写历史。 git revert HEAD # 撤销最近的提交 # 或者指定一个特定的提交哈希值 …

一句话、10秒,我用Claude 3.5 Sonnet生成了完整的俄罗斯方块!

大家好&#xff0c;我是木易&#xff0c;一个持续关注AI领域的互联网技术产品经理&#xff0c;国内Top2本科&#xff0c;美国Top10 CS研究生&#xff0c;MBA。我坚信AI是普通人变强的“外挂”&#xff0c;所以创建了“AI信息Gap”这个公众号&#xff0c;专注于分享AI全维度知识…

大模型项目落地时,该如何估算模型所需GPU算力资源

近期公司有大模型项目落地。在前期沟通时,对于算力估算和采购方案许多小伙伴不太了解,在此对相关的算力估算和选择进行一些总结。 不喜欢过程的可以直接 跳到HF上提供的模型计算器 要估算大模型的所需的显卡算力,首先要了解大模型的参数基础知识。 大模型的规模、参数的理解…