需求:使用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()