最近在做对接医保接口的项目,入参要求进行SM2签名(注意:是签名而非加密,开始理解成加密研究了一堆加密源码,使用提供的私钥也会报错,后面才发现SM2有专门的签名方法,而接口调用签名也就是SM2签名而非加密)
下面是说明适用于2022年云南省医保平台相关项目:
SM2签名入参有私钥,加密内容,用户id,一定要注意平台下发的加密工具或者demo,加密规则一定要和平台一致,不然签名验签会一直验签失败,以下是我发现的问题及处理(平台下发demo签名时入参给了3个,实际使用只用了两个,userid签名加密时没有使用,替换的是一个随机数;之前一直验签失败就是我给的3个入参都参与了加密签名,所以就会失败):
public static byte[] SignSm3WithSm2Asn1Rs(byte[] msg, byte[] userId, AsymmetricKeyParameter privateKey)
{
try
{
SM2Param sM2Param = new SM2Param();
ISigner signer = SignerUtilities.GetSigner("SM3withSM2");
ICipherParameters cp = new ParametersWithRandom(privateKey);
//userid不参与签名加密
//signer.Init(true, new ParametersWithID(privateKey, userId));
signer.Init(true, cp);
signer.BlockUpdate(msg, 0, msg.Length);
byte[] sig = signer.GenerateSignature();
return sig;
}
catch (Exception e)
{
log.Error("SignSm3WithSm2Asn1Rs error: " + e.Message, e);
return null;
}
}