duanhongyi / gmssl

a python crypto for sm2/sm3/sm4
MIT License
479 stars 140 forks source link

SM2加密出来的数据其他工具解不了 #4

Closed sanderchen closed 4 years ago

sanderchen commented 5 years ago

加密信息:abc 加密后信息:\x16\xfc\xe2<\xd2\xf7 ^\xb7@\xf0#\xa3\x87\xab\xa3\xd2\x18\xe9\xda\x8cJG\xbav;\xdb\xaeeu\xfb:\xcc\x9eT\xd3\xb9\xfc\x0f\x0fH\x8e\xc6'\x7f)\xa8\xab\x92\x82U\xac\x8c\xd2\xae\xf8\x8e@\x16\xea9\xf2\x10\xa4\xb6\xa8,\x90\x92\n\x80\xbb\x9dO\xd0d\t\x97\x10\x18kw.\xd2\xfa,X<\xf9\x9b\x1b\xea_r\xbe\xd4Rp\xa2

这数据是一个怎样数据,我尝试将这数据转换为16进制的数据,然后拿到“SM2算法验证工具”解密,发现解密不了,请问应该如何让其他使用JAVA的服务解密成功呢?

sanderchen commented 5 years ago

用工具加密出来的密文是这样的 306B02206C05563FDDCF5C95724BD652663836CF301C9BD4F1B1AB9E3BA0801BEE4A430C02205E6468B5DF7B1546D7D872BA3AFFDAB9A4660A31ED0C1E45B2AE4397ED8AC66C04206840A6B7B43ED68AD11791D6E349EA5D21C53EAE25C1BC0058431164043EE8BB04037E8FEA

是16进制的数据

duanhongyi commented 5 years ago

@sanderchen

java工具通常为base64

sanderchen commented 5 years ago

那两者之间怎么用python互转呢?

duanhongyi commented 5 years ago

base64.b64encode

sanderchen commented 5 years ago

直接将加密后的数据base64.b64encode编码,得出的数据如下 BjjrL7A6JEYLTrbX9XG8wOlmObbZnzn0KWc1oAzLp7mPbT/dUIG6IPHFBjWfnCBHxSF4/aAXHDxrgbiAPn/RpAd3xqvppndgGF0R11BVW0vfsb0k8VrRCBLoyF4e4GY17I4G 工具接收的解码数据是16进制的数据,因此我又将上述数据转16进制去处理,最后得到的16进制数据用工具解码还是反馈解码失败,上诉过程我是哪一步错了呢?望不吝赐教!

duanhongyi commented 5 years ago

用的哪个java包

sanderchen commented 5 years ago

是直接使用这个工具https://github.com/zweib730/SM9-misc解密的,用python库加密,加密后的数据base64编码,然后再转16进制,得到的16进制数在传到这个工具尝试解密,但是解密失败,不知道是哪一步出错了

duanhongyi commented 5 years ago

是直接使用这个工具https://github.com/zweib730/SM9-misc解密的,用python库加密,加密后的数据base64编码,然后再转16进制,得到的16进制数在传到这个工具尝试解密,但是解密失败,不知道是哪一步出错了

给我一个java的包,我给你看看。

sanderchen commented 5 years ago

是跟我调试的另一方用的是java服务,我这边拿不到他那边的代码,我贴一下我使用gmsll库的python代码

from gmssl import sm2
import base64
private_key = '3C2AD19567B69AA3D64D051AD6CD94A8E2BD604933B21E78E63E18461A93FD92'
public_key = 'F9B6F4D1F95F07DEDD9E182D9506480A7AE4E832BF08A09349420A646BC20A755ADF5B3F041FE664B2B6F32A76C007E961BB0AE06DC51D9DD21F647C39AC3A05'
sm2_crypt = sm2.CryptSM2(public_key=public_key, private_key=private_key) #初试化SM2算法
testMsg = b'abc'
data = sm2_crypt.encrypt(testMsg)  #加密
print(type(data))
print(data)

dataBase64= base64.b64encode(data)
print(dataBase64)

dataHex = dataBase64.hex()
print(dataHex)

然后将dataHex这个参数拷贝到https://github.com/zweib730/SM9-misc 这个工具解密,但是解密失败了

duanhongyi commented 5 years ago

你要确认你这个工具支持SM2,这个库在我们生产环境中就是和java进行通讯的。

sanderchen commented 5 years ago

代码中加密后的data如果要用TCP传输,还需要进行b64encode么?直接进行16进制转换后,是否也可以?

sanderchen commented 5 years ago

工具支持SM2的,里面有个“sm2tool_1.exe”文件,可以用来直接加解密,但是我用gmssl python库解不出来……

sanderchen commented 5 years ago

你好,能将Python库加密后的数据怎么转换为16进制,并通过TCP传给java的代码举例一下么,谢谢!

xinaiwunai commented 4 years ago

我有一个相同的问题。不过我对应的是用微信小程序官方提供的国密包sm-crypto : https://developers.weixin.qq.com/miniprogram/dev/extended/utils/sm-crypto.html 无法完成互相之间的加解密工作。 情况和上面差不多,就是python 的 gmssl 包加密出来的密文是这种格式的: b"\xc9\xec2w\x00\x1f\x1e \x85\xc1'\x1b\x06*W\xb8\xeb\xe3\x8f\x1f\x16;\x8b\x06g\xa6\xa7\xee9d\xc3\xc9&\xe7\x1f'7y`\xcd{f-d\x0f\xbf\x90\xb5^L\xae\xdb\xdc\xf3\xf3G\xb0\x8ao\xc7%\xda\x99\xec\xa4\xa2:?,u\xe6\xd5\x9b\xbc\x84\x97\xdet\x0c\xd3\xfa\xbefQ\xe7\xb8\xda\x8c\x80F\x1d\x9f\x1b\x9e6\x0f\x18^\xdd\x19\xc0p\xefQ\xcc\x07\x0c\xdag\xca\xbb\xec\x92m\xe0=9WE|@\n]PI71\xa6\x93\x88\xb3\x9a\xf3n&-\xees\xb0\xf6\x0c2\xb8\xa8\xb2\xbc@]\xdd\x8f\xa2\xbbqpy\xe5\xab5i\x0f\xaaY\xad\x110'Z}r\xf8\xea#\xc9\xdf;\x1aDZ\xbe\x9e\xc1\xf7\xe3.\x05+\xa6\xbf\xa4\xe8\xad%\xf6\xdc\x1c\x8e\xeaT\x9e\xff\x08\xfc\xed\x15\x95\x1a\xe5\xf4\xb4HF<U\xc1\xb8z\x84\xbd\x84%\x8f#4\xd0Tof}q\xce\xd7\x91G\n\x12U\x02na\x0f\x80" 微信小程序的 sm-crypto 包,加密出来是: 4107ea96e9193f4ccd007ddc6094778f56f3b61d1fcc984316cdf86075b3246223d32c007a4d4bdcb0ffdab9f8a58180fa7f98d3fdb9510906fd253a04f28bbc4f0236359c2c0d3539d842b3de5327ab7007a5cb697f2f44ebf3d5d4b61dc634b7b55e408fdd6d6f2a9e06bf55853e4ae060731f54199fd543daf874e170fc11731abc4908f71913407619678ef72729f7f4dc437659ad03e04336bea97f8fd7596cfafd1f01e91ef32b40189e73efec82829fc11149e9d72146b6985a48b9c3bf80e643c3131046c254eeb61b196450b5427209d5febd2ad6120ac562c19425b4cbb268af81909a774136c1d2942c902e4cd4810bd5

求大佬帮助一下。

xinaiwunai commented 4 years ago

我已经发现问题了。

微信小程序 sm-crypto 加密后的报文 ms,要转bytes类型,在python 3.5 版本之后,使用 ms = bytes.fromhex(ms) #字符串转hex 然后再使用gmssl提供的 sm2_crypt.decrypt( ) 方法进行解密就可。 ms = sm2_crypt.decrypt(ms) #得到明文,格式为bytes ms = v2.decode() # bytes转字符串 ,默认使用‘UTF-8’进行编码

ytt8612 commented 1 year ago

我也遇到同样问题gmsll库的python加密后,解密工具和java sm2 包都无法解密,使用gmsll库的python代码SM2加密,使用java解密的示例可以提供一个么?

Miguitian commented 3 months ago

我遇到的问题为使用java进行的sm2的加密,公钥使用的04开头的公钥,但是在使用gmsll和私钥进行解密时,能解密成功,但是无法转化为utf-8编码,但是使用java解密就可以

fengjing commented 3 months ago

我遇到的问题为使用java进行的sm2的加密,公钥使用的04开头的公钥,但是在使用gmsll和私钥进行解密时,能解密成功,但是无法转化为utf-8编码,但是使用java解密就可以

我也是遇到了同样的问题,python 的sm2 去解密java的东西, 请问 现在解决了吗? 我用了 pk, sk 2个,和 java加密的内容在 https://github.com/44021987/smEncrypt 这个测试 不成功

但是 用 : https://www.zytool.cn/util/SMUtilhttps://the-x.cn/zh-cn/cryptography/Sm2.aspx 在线是测试成功的

我也不知道用什么方法解决了

fengjing commented 3 months ago

我遇到的问题为使用java进行的sm2的加密,公钥使用的04开头的公钥,但是在使用gmsll和私钥进行解密时,能解密成功,但是无法转化为utf-8编码,但是使用java解密就可以

问题解决了 强制 mode=1 感谢你的 issue 截图,提醒了我

Miguitian commented 3 months ago

我遇到的问题为使用java进行的sm2的加密,公钥使用的04开头的公钥,但是在使用gmsll和私钥进行解密时,能解密成功,但是无法转化为utf-8编码,但是使用java解密就可以

问题解决了 强制 mode=1 感谢你的 issue 截图,提醒了我

嗯嗯 我那个issue截图目的就是让作者更改一下错误的注视

fengjing commented 3 months ago

我遇到的问题为使用java进行的sm2的加密,公钥使用的04开头的公钥,但是在使用gmsll和私钥进行解密时,能解密成功,但是无法转化为utf-8编码,但是使用java解密就可以

问题解决了 强制 mode=1 感谢你的 issue 截图,提醒了我

嗯嗯 我那个issue截图目的就是让作者更改一下错误的注视

04开头的要去掉了04