交通部互通互联二维码之发卡机构公钥证书

201 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情

背景

随话说的好啊,好比不如烂笔头,之前开发联调OK后,闲置了半年,结果今天再去搞公钥,发现完全忘记了生成规则。

特此,记录一下我们的过程,以便后面再出现这种情况好快速生成发卡机构公钥。

什么是SM2

SM2是国家密码管理局于2010年12月17日发布的椭圆曲线公钥密码算法。SM2算法是一种更先进安全的算法,在我们国家商用密码体系中被用来替换RSA算法。

SM2生成密钥对

SM2KeyPair sm2KeyPair = sm02.generateKeyPair();
// generateKeyPair的核心代码就是下面这一行大吗
SM2KeyPair keyPair = new SM2KeyPair(G.multiply(d).normalize(), d);

获取公钥、私钥证书

从下图我们可以看到通过 ConversionUtils.byteToHex方法获取到了公钥和私钥证书内容字符串 image.png

签名

签名代码如下:这里实现我们的SM2的具体签名逻辑(直接贴出了部分代码)

/**
 * 签名
 * 
 * @param M    签名信息
 * @param IDA  签名方唯一标识
 * @param keyPair  签名方密钥对
 * @return 签名
 */
public Signature sign(String M, String IDA, SM2KeyPair keyPair) {
   byte[] ZA = ZA(IDA, keyPair.getPublicKey());
   byte[] M_ = join(ZA,ConversionUtils.hexToByte(M));
   BigInteger e = new BigInteger(1, sm3hash(M_));
   BigInteger k;
   BigInteger r;
   do {
      k = random(n);
      ECPoint p1 = G.multiply(k).normalize();
      BigInteger x1 = p1.getXCoord().toBigInteger();
      r = e.add(x1);
      r = r.mod(n);
   } while (r.equals(BigInteger.ZERO) || r.add(k).equals(n));

   BigInteger s = ((keyPair.getPrivateKey().add(BigInteger.ONE).modInverse(n))
         .multiply((k.subtract(r.multiply(keyPair.getPrivateKey()))))).mod(n);
   return new Signature(r, s);
}

生成公钥证书拼接串拼接规则

将 记录头、服务标识、中心CA公钥索引 作为第一部分拼接,将下图中红框中作为第二部分拼接,将下图红框第三部分拼接。然后第一、第二、第三部分拼接到一起形成一个字符串,这就是我们索要提供的公钥证书字符串了。

image.png

好了,今天的发卡机构公钥证书,拼接字符串就先聊到这!如果有感兴趣的朋友可以留言或者私信我!

想要完整代码的朋友也可以留言私信我!

欢迎大家关注我的公众号《coder练习生》