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

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)

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

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

相关文章

网络富集显著性检验NEST(?)

https://doi.org/10.1002/hbm.26714 背景 一般情况下,研究者通过评估统计量较大的脑区与功能网络重叠的情况,或者计算网络的体素占比,来确定行为和功能网络的相关性。NEST能检测行为表型和大脑表型的相关性是否富集在特定的功能网络中。例如下…

Golang | Leetcode Golang题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; func fractionToDecimal(numerator, denominator int) string {if numerator%denominator 0 {return strconv.Itoa(numerator / denominator)}s : []byte{}if numerator < 0 ! (denominator < 0) {s append(s, -)}// 整数部分numer…

食谱API

在当今追求健康与美味完美结合的时代&#xff0c;获取准确而丰富的食品和营养信息变得至关重要。无论是热衷于探索世界各地美食的烹饪爱好者&#xff0c;还是对自身饮食营养严格把控的健康追求者&#xff0c;都离不开可靠的资源。幸运的是&#xff0c;现在有诸如 TheMealDB 和 …

win10环境配置ollama-ui运行llama3模型

先说我的笔记本电脑配置intel-i7-11390h,4核8处理器&#xff0c;内存16G。显卡NVIDA GeFroce MX450&#xff0c;2G显存&#xff0c;这是一台5000元左右的电脑。 我用它跑roop、sd1.5、ffusion2、ChatTTs还有pythonpytorch的自定义模型&#xff0c;现在用来跑llama3。当然&…

新手(初学者)学R语言第一课,从学正确导入数据开始

初看题目好像我在教你怎么导入数据&#xff0c;不不不&#xff0c;我是在教你正确的导入数据&#xff0c;不是说数据导入R就叫正确导入数据了。本章为新手教程&#xff0c;老手可以跳过。 这个内容早就想写了&#xff0c;今天有点空和大家聊一下。为什么R语言对于新手而言不太友…

【Autoware】Autoware.universe安装过程与问题记录

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Autoware.universe安装过程与问题记录。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下…

基于MYSQL的JAVA初级优化措施

世界是草台班子,这句话视乎很流行! 经历过几家创业公司的项目优化,以及大公司项目. 很多优化非常初级,用心点都能自己找出来! 其实主要原因当初是为了赶进度,能省则省.什么设计啊? 什么性能压测啊. 都省掉吧! 质量都要靠测试人员帮忙找出来,更何况是性能问题呢! 那怕是配齐了…

临时关闭Windows安全中心

在使用WindowsOS是&#xff0c;微软安全中心是我们必不可少的安全防护&#xff0c;但有时我们也会产生想要将其关闭的需求&#xff0c;下面将要介绍如何临时关闭Windows的安全中心 一、打开安全中心、选择“病毒与威胁防护”&#xff0c;点击“管理设置” 之后将其实时保护关闭…

Vue3中的常见组件通信(超详细版)

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…

M12单端I/O预铸法兰插座A-code

M12单端I/O预铸法兰插座A-code概述 M12单端I/O预铸连接器A-code是一种常用于工业自动化领域的连接器件&#xff0c;主要用于传感器和执行器之间的信号传输。它的设计遵循国际标准IEC 61076-2-101&#xff0c;具有良好的防水防尘性能&#xff0c;通常达到IP67的保护等级。M12连…

自学鸿蒙HarmonyOS的ArkTS语言<一>基本语法

一、一个ArkTs的目录结构 二、一个页面的结构 A、装饰器 Entry 装饰器 : 标记组件为入口组件&#xff0c;一个页面由多个自定义组件组成&#xff0c;但是只能有一个组件被标记 Component : 自定义组件, 仅能装饰struct关键字声明的数据结构 State&#xff1a;组件中的状态变量…

【Linux硬盘读取】Windows下读取Linux系统的文件解决方案:Linux Reader4.5 By DiskInternals

前言 相信做机器视觉相关的很多人都会安装 Windows 和 Linux 双系统。在 Linux 下&#xff0c;我们可以很方便的访问Windows的磁盘&#xff0c;反过来却不行。但是这又是必须的。通过亲身体验&#xff0c;向大家推荐这么一个工具&#xff0c;可以让 Windows 方便的访问 Ext 2/3…

机器学习课程复习——逻辑回归

1. 激活函数 Q:激活函数有哪些? SigmoidS型函数Tanh 双曲正切函数

SpringBoot+Maven项目的配置构建

文章目录 1、application.properties2、pom.xml 1、application.properties 也可使用yml yaml #静态资源 spring.mvc.static-path-pattern/images/** #上传文件大小设置 spring.http.multipart.max-file-size10MB spring.http.multipart.max-request-size10MBspring.mvc.path…

50万定律:任何单位和任何职业,只要工资年收入大于50万,基本上都要牺牲个人生活,无论是医生还是教师...

“我今年30岁&#xff0c;在北京&#xff0c;年薪50万&#xff0c;但我一点也不快乐……” 朋友圈看到朋友的感慨&#xff0c;配图是深夜加班的CBD夜景&#xff0c;评论区不出所料&#xff0c;一半是羡慕&#xff0c;一半是“凡尔赛”。 年薪50万&#xff0c;在很多人眼里&am…

Spring的启动扩展点机制详解

在Java的世界中&#xff0c;我们知道Spring是当下最主流的开发框架&#xff0c;没有之一。而在使用Dubbo、Mybatis等开源框架时&#xff0c;我们发现可以采用和Spring完全一样的使用方式来使用它们。 可能你在平时的使用过程中并没有意识到这一点&#xff0c;但仔细想一想&…

NUC 14 Pro+:解锁AI前沿,体验科技之美

NUC 14 Pro不仅是一台迷你主机&#xff0c;更是生活品质的体现。如果你也是细节控&#xff0c;那这篇文章或许是你需要的。 超小体积 造型精致 NUC 14 Pro作为迷你PC拥有约0.66L的超小体积&#xff0c;如果你对升没有概念&#xff0c;那你可以想象&#xff1a;它的机箱面积144…

御道源码(ruoyi-vue-pro)个人使用小结

御道源码&#xff08;ruoyi-vue-pro&#xff09;个人使用小结 一、Git地址 1、平台项目简介及地址 2、开发指南&#xff0c;如图所示&#xff0c;部分功能需要收费&#xff0c;可自行了解 二、项目文件夹结构示例&#xff1a; 三、技术介绍 1.基于 Spring Boot MyBatis P…

解锁空间数据奥秘:ArcGIS Pro与Python双剑合璧,处理表格数据、矢量数据、栅格数据、点云数据、GPS数据、多维数据以及遥感云平台数据等

ArcGISPro提供了用户友好的图形界面&#xff0c;适合初学者快速上手进行数据处理和分析。它拥有丰富的工具和功能&#xff0c;支持各种数据格式的处理和分析&#xff0c;适用于各种规模的数据处理任务。ArcGISPro在地理信息系统&#xff08;GIS&#xff09;领域拥有广泛的应用&…

编程书籍的枯燥真相:你也有同样的感受吗?

讲动人的故事,写懂人的代码 我得实话实说,你可能已经发现市面上的大部分编程入门书籍有些枯燥。这个问题的根源在于许多作者把本应该充满乐趣和吸引力的入门指南,写得就像一本沉闷的参考手册。这就好比把一本充满冒险和乐趣的旅行日记,写成了一本单调乏味的字典。 我完全理…