国密改造-数字签名-SM2,SM4

一. 请求报文变更

请求xml报文结构包含:

1. head报文

2. 业务报文

3. 其他报文

国密改造后,1和3不变,2主要是2个字段:

MsgBody:  SM4加密的原业务节点

Sign:对MsgBody 进行SM2签名

二. 关于秘钥

SM4 秘钥: 32位字符,我方告知银行,用于信息的对称加解密

SM2 :

我方:私钥,64位,用于签名; 公钥,130位(含04)给银行。另外P10文件(输入SM2公私钥、DN串,用工具生成)也要给银行,用于制作证书。

银行方: 公钥,130位(含04)字符,会给到我们,另外,公钥相对应的证书也会给我方。

准备4个方法: SM4加密,SM4解密, SM2签名,SM2验签。 

三. 关于证书

证书,对公钥的认证,防止合作方抵赖或者坏人对公钥的伪造。

证书越权威,安全性越高;

证书链为NORMAL_CERT(银行方) -> CCAS_COR_CERT(中间证书) -> CCAS_ROOT_CERT(根证书)

校验证书

1. 时间有效性: CertHelper.certDateValidate(SM.NORMAL_CERT, new Date());

2. 证书有效性: 一层一层往上校验,

CertHelper.certSignatureValidate(SM.NORMAL_CERT, Base64.decode(SM.CCAS_COR_CERT));  //校验银行方和中间证书

CertHelper.certSignatureValidate(Base64.decode(SM.CCAS_COR_CERT), Base64.decode(SM.CCAS_ROOT_CERT)); //校验中间证书和根证书

3. 校验签名

signer.verifyWithCert(SM.NORMAL_CERT, signData, response.SIGN.getBytes());

//signData: 需验签的报文(SM4加密) ;   response.SIGN: 签名

可以看出,上面解签并没有用到银行给的公钥,走的是证书线路。

其实,证书和公钥是一一对应的。SM.NORMAL_CERT,是打开证书后,你可以看到的几百位的base64后的字符(直接双击打开cer证书,在上方三个tab中点击
详细信息->复制到文件->下一页->选择Base64)。

当然,你忽略证书线路,用公钥也是可以解签的:

 /**
	  * 功能:报文验签
	  * 输入:  msg-需验签的报文、signBase64-签名、 bankPublicKey-银行公钥
	  * 输出:是否验签通过
	  */
	 public static boolean verifySign(String msg, String signBase64, String bankPublicKey) {
	  byte[] signature = Base64.decode(signBase64);
	  byte[] sigSrcData = msg.getBytes();
	  Signature dv = Signature.getInstance(AlgorithmConstants.SM3withSM2); //验签
	  ClearKeyParameter privateKey = ClearKeyFunction.loadClear(bankPublicKey, "SM2public");
	  return dv.verify(privateKey, sigSrcData, signature);
	 }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国密SM2是中国自主研发的一种椭圆曲线公钥密码算法,广泛应用于数字签名、密钥交换、加密等领域。下面简单介绍一下基于国密SM2数字签名技术。 数字签名是一种用于保证数字信息真实性、完整性和不可抵赖性的技术。基于国密SM2数字签名技术采用了非对称加密算法,即使用一对公钥和私钥进行加密和解密。具体流程如下: 1. 密钥生成 首先,签名方需要生成一对公钥和私钥。公钥可以公开,私钥必须保密。在国密SM2算法中,公钥的长度为256位,私钥的长度为256位,其中一部分为随机数。 2. 数字签名 数字签名的过程可以分为四步: (1)计算消息的摘要值。使用SHA-256算法计算出消息的摘要值,摘要值的长度为256位。 (2)随机数生成。生成一个随机数k,保证其在区间[1,n-1]之间,n为SM2算法中的一个大素数。 (3)计算椭圆曲线上的点。根据摘要值和随机数k计算出椭圆曲线上的点R,其中R = [k]G,G为椭圆曲线上的基点。 (4)计算数字签名。根据摘要值、随机数k、私钥d和点R计算数字签名S,其中S = (hash(m) + x(R)*d)/(1+k)^(-1) mod n,x(R)表示点R的x坐标。 3. 数字签名验证 数字签名验证也可以分为四步: (1)计算消息的摘要值。使用SHA-256算法计算出消息的摘要值,摘要值的长度为256位。 (2)计算椭圆曲线上的点。根据签名中的点R和数字签名S计算出椭圆曲线上的点V,其中V = [h]P + [s]Q,h为摘要值的哈希值,P为公钥,Q为点R。 (3)验证数字签名。如果V的x坐标等于R的x坐标,则认为数字签名有效,否则认为数字签名无效。 (4)安全性检查。如果验证通过,还需要进行安全性检查,检查签名是否被篡改或重放攻击。 基于国密SM2数字签名技术具有高强度、高安全性、高效率等优点,广泛应用于电子商务、金融支付、政府机构等领域。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值