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

1、背景:

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

2、密钥分析:

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

公钥转码分析:

私钥转码分析:

加解密注意事项:

<

### 使用Hutool实现SM2加密解密 #### 密钥生成管理 为了确保PythonJava平台之间的互通性,在使用Hutool进行SM2加解密时,需注意密钥长度差异。通常情况下,SM2公钥由两个64字节的分量组成(x,y),而私钥则为32字节[^1]。然而,当涉及到特定框架如Hutool时,可能会遇到不同寻常的情况——即生成的私钥长度超过预期。 针对这种情况,建议开发者仔细核对所使用的版本以及官方文档说明,确认是否存在特殊处理逻辑或额外参数设置影响了最终输出的结果形式。对于跨语言环境下的应用开发而言,保持一致性的关键是遵循标准协议并充分理解各端的具体实现细节。 #### 加密过程示例 下面展示了一个简单的例子来说明如何利用Hutool中的`SmUtil`类来进行字符串级别的SM2加密: ```java import cn.hutool.crypto.asymmetric.SM2; import cn.hutool.crypto.KeyType; public class SM2Example { public static void main(String[] args){ String publicKey = "your_public_key_here"; // 创建SM2实例,并指定仅加载公钥用于加密操作 SM2 sm2Encrypter = new SM2(null, publicKey); try{ byte[] encryptedData = sm2Encrypter.encryptBcd("待加密的数据".getBytes(), KeyType.PublicKey); System.out.println("Encrypted Data: "+new String(encryptedData)); }catch(Exception e){ e.printStackTrace(); } } } ``` 此段代码展示了通过传入预定义好的十六进制表示法编码后的公钥字符串创建一个新的`SM2`对象,并调用其方法完成对明文消息的BCD格式化加密工作[^2]。 #### 解密过程示例 同样地,这里也给出了解码已加密信息的方法: ```java import cn.hutool.crypto.asymmetric.SM2; import cn.hutool.crypto.KeyType; public class SM2DecryptExample { public static void main(String[] args){ String privateKey = "your_private_key_here"; String cipherText = "the_encrypted_data_from_previous_step"; // 创建SM2实例,并指定仅加载私钥用于解密操作 SM2 sm2Decryptor = new SM2(privateKey,null); try{ byte[] decryptedBytes = sm2Decryptor.decryptHex(cipherText.getBytes(),KeyType.PrivateKey); System.out.println("Decrypted Message:"+new String(decryptedBytes)); } catch (Exception e) { e.printStackTrace(); } } } ``` 上述程序片段中,先初始化包含私钥信息的对象,接着执行反向转换流程恢复原始文本内容。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzl640

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值