Java 实现SM2 非对称加密、解密、签名、验签

来源:互联网 发布:虚空假面 jb脸 知乎 编辑:程序博客网 时间:2024/05/29 12:19

研究国密也有一段时间了,下面放出Java实现代码,由于代码较多,放出一部分,要源码的朋友可以访问我的博客留言www.sitcoder.com,或者加我QQ956959099


签名代码:

public String Sm2Sign(byte[] md, byte[] pk, byte[] privatekey) {
SM3Digest sm3 = new SM3Digest();


byte[] pkX = subByte(pk, 0, 32);
byte[] pkY = subByte(pk, 32, 32);


byte[] z = sm3.getSM2Za(pkX, pkY, PRECASystemConstants.ACTIVE_CODE_SM2_ECC_UID.getBytes());


sm3.update(z, 0, z.length);


byte[] p = md;
sm3.update(p, 0, p.length);


byte[] hashData = new byte[32];
sm3.doFinal(hashData, 0);


// e
BigInteger e = new BigInteger(1, hashData);
// k
BigInteger k = null;
BigInteger r = null;
BigInteger s = null;
BigInteger userD = null;
BigInteger x = new BigInteger(1, pkX);
BigInteger pr = new BigInteger(1, privatekey);
do {
do {


// keypair
k = pr;
// ecpriv.getD().toString(16);//私钥


userD = pr;


// r
r = e.add(x);
r = r.mod(ECC_N);
} while (r.equals(BigInteger.ZERO) || r.add(k).equals(ECC_N));


// (1 + dA)~-1
BigInteger da_1 = userD.add(BigInteger.ONE);
da_1 = da_1.modInverse(ECC_N);
// s
s = r.multiply(userD);
s = k.subtract(s).mod(ECC_N);
s = da_1.multiply(s).mod(ECC_N);
} while (s.equals(BigInteger.ZERO));


byte[] btRS = {};
byte[] rArray = r.toByteArray();
byte[] sArray = s.toByteArray();
System.out.println(rArray.length);
System.out.println(sArray.length);
System.out.println("\n");
System.out.println("\n");
System.out.println(printHexString(rArray));
System.out.println("\n");
System.out.println(printHexString(sArray));
System.out.println("\n");


byte[] btR = new byte[32];
if (rArray.length <=31) {
System.arraycopy(rArray, 0, btR, 0, rArray.length);
} else if (rArray[0] == 0x00 && rArray.length != 32) {
System.arraycopy(rArray, 1, btR, 0, btR.length);
} else {
System.arraycopy(rArray, 0, btR, 0, btR.length);
}
byte[] btS = new byte[32];
if (sArray.length <= 31) {
System.arraycopy(sArray, 0, btS, 0, sArray.length);
} else if (sArray[0] == 0x00 && sArray.length != 32) {
System.arraycopy(sArray, 1, btS, 0, btS.length);
} else {
System.arraycopy(sArray, 0, btS, 0, btS.length);
}


btRS = BaseCertUtil.byteMerger(btR, btS);
String signdata = printHexString(btRS);
System.out.println(signdata);
return signdata;
}

0 0
原创粉丝点击