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;
}
- Java 实现SM2 非对称加密、解密、签名、验签
- 加密解密、签名验签
- 加密解密 签名验签
- 加密 解密 签名 验签
- RSA加密、解密、签名(非对称加密)
- JAVA RSA签名 验签 以及 加密解密
- java使用p12证书签名、验签、加密、解密
- RSA加密、解密、签名、验签 DSA签名、验签
- 加密解密 签名验签学习笔记
- php rsa 加密、解密、签名、验签
- 加密解密 签名验签学习笔记
- 数据加密、解密:签名、验签
- 加密解密 签名验签学习笔记
- 加密解密-签名验签学习笔记
- 加密解密 签名验签学习笔记
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- python实现aes加密解密,RSA签名和验签,RSA加密解密,并调用接口
- Java加密解密之非对称加密
- 图片js切换
- CVS 常用操作命令
- Mac OX 10.10 cocoapods升级步骤
- 保存用户密码的安全方法 .
- eclipse自动提示补全功能
- Java 实现SM2 非对称加密、解密、签名、验签
- MyEclipse Servers 报错Could not create the view: An unexpected exception was thrown
- 快速批量替换文档中的回车符与换行符,包括分节符、分页符的替换
- 猜数游戏
- 关于用什么语言好,什么语言有前途的话题,我觉得可以停止了吧
- MVVM学习
- 用VC进行64位编程
- mysql数据库用户
- Python类 静态成员