背景
随话说的好啊,好比不如烂笔头,之前开发联调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练习生》