Bootstrap

sm2: Python encrypt and Java decrypt

需求:使用Python模拟原Java代码的sm2加密过程。

Java:

        使用Java实现sm2加密,这类代码网上比较多,一般是基于bouncycastle或者hutool,在此不做赘述。本次需求要模拟的Java实现使用非对称加密中的椭圆曲线加密,基于bouncycastle。该Java实现的步骤是构造ECC曲线并提取公钥点,进而构造sm2Engine,进行加密,该过程只用到公钥。

Python:

        Python的替代方式本来比较简单,但是需要注意两个关键点:

1、Python需要输入公钥和私钥,并且与要替代的Java代码公钥私钥一致;

2、Python加密后的内容需要在前面加上‘04’,原因在于使用Java加密时,密文均以04开头,看到有网页上写密文的第一个字节 0x04 表示不对 C1 进行点压缩,但未考证过;

        在别的网页上看到还有一个注意点是密文模式要一致,但本次实现没遇到这个问题,没做过多研究。

python代码的例子:

from gmssl import sm2
import base64

public_key = "041111111111111111111111111111"
private_key = "222222222"
def encrypt_data(data):
    cipher = sm2.CryptSM2(public_key=public_key, private_key=private_key)
    base64_data = base64.b64encode(bytes(data.encode("UTF-8")))
    return '04' + cipher.encrypt(base64_data).hex()

;