背景
随话说的好啊,好比不如烂笔头,之前开发联调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方法获取到了公钥和私钥证书内容字符串
签名
签名代码如下:这里实现我们的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公钥索引 作为第一部分拼接,将下图中红框中作为第二部分拼接,将下图红框第三部分拼接。然后第一、第二、第三部分拼接到一起形成一个字符串,这就是我们索要提供的公钥证书字符串了。

好了,今天的发卡机构公钥证书,拼接字符串就先聊到这!如果有感兴趣的朋友可以留言或者私信我!
想要完整代码的朋友也可以留言私信我!
欢迎大家关注我的《coder练习生》



















