mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-07-21 15:09:48 +08:00
add method
This commit is contained in:
@@ -16,6 +16,8 @@ import org.bouncycastle.asn1.DERSequence;
|
||||
import org.bouncycastle.asn1.gm.GMNamedCurves;
|
||||
import org.bouncycastle.crypto.digests.SM3Digest;
|
||||
import org.bouncycastle.crypto.params.ECDomainParameters;
|
||||
import org.bouncycastle.crypto.signers.DSAEncoding;
|
||||
import org.bouncycastle.crypto.signers.StandardDSAEncoding;
|
||||
import org.bouncycastle.util.Arrays;
|
||||
import org.bouncycastle.util.encoders.Hex;
|
||||
|
||||
@@ -193,6 +195,35 @@ public class SmUtil {
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* 将sm2签名结果解码为R和S值
|
||||
*
|
||||
* @param encoding {@link DSAEncoding}
|
||||
* @param rsDer 签名结果的DER表示形式
|
||||
* @return R和S值,结果为64位,前32位为R,后32为为S
|
||||
* @since 5.5.9
|
||||
*/
|
||||
public static byte[] decode(DSAEncoding encoding, byte[] rsDer){
|
||||
if(null == encoding){
|
||||
encoding = StandardDSAEncoding.INSTANCE;
|
||||
}
|
||||
|
||||
final BigInteger[] decode;
|
||||
try {
|
||||
decode = encoding.decode(SM2_DOMAIN_PARAMS.getN(), rsDer);
|
||||
} catch (IOException e) {
|
||||
throw new IORuntimeException(e);
|
||||
}
|
||||
|
||||
byte[] r = bigIntToFixedLengthBytes(decode[0]);
|
||||
byte[] s = bigIntToFixedLengthBytes(decode[1]);
|
||||
byte[] result = new byte[RS_LEN * 2];
|
||||
System.arraycopy(r, 0, result, 0, r.length);
|
||||
System.arraycopy(s, 0, result, RS_LEN, s.length);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/**
|
||||
* BC的SM3withSM2签名得到的结果的rs是asn1格式的,这个方法转化成直接拼接r||s<br>
|
||||
* 来自:https://blog.csdn.net/pridas/article/details/86118774
|
||||
|
@@ -62,8 +62,8 @@ public class SM2 extends AbstractAsymmetricCrypto<SM2> {
|
||||
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
|
||||
*
|
||||
* @param privateKeyStr 私钥Hex或Base64表示
|
||||
* @param publicKeyStr 公钥Hex或Base64表示
|
||||
* @param privateKeyStr 私钥Hex或Base64表示,必须使用PKCS#8规范
|
||||
* @param publicKeyStr 公钥Hex或Base64表示,必须使用X509规范
|
||||
*/
|
||||
public SM2(String privateKeyStr, String publicKeyStr) {
|
||||
this(SecureUtil.decode(privateKeyStr), SecureUtil.decode(publicKeyStr));
|
||||
@@ -74,8 +74,8 @@ public class SM2 extends AbstractAsymmetricCrypto<SM2> {
|
||||
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
|
||||
*
|
||||
* @param privateKey 私钥
|
||||
* @param publicKey 公钥
|
||||
* @param privateKey 私钥,必须使用PKCS#8规范
|
||||
* @param publicKey 公钥,必须使用X509规范
|
||||
*/
|
||||
public SM2(byte[] privateKey, byte[] publicKey) {
|
||||
this(//
|
||||
@@ -135,8 +135,8 @@ public class SM2 extends AbstractAsymmetricCrypto<SM2> {
|
||||
* 私钥和公钥同时为空时生成一对新的私钥和公钥<br>
|
||||
* 私钥和公钥可以单独传入一个,如此则只能使用此钥匙来做加密或者解密
|
||||
*
|
||||
* @param privateKeyParams 私钥
|
||||
* @param publicKeyParams 公钥
|
||||
* @param privateKeyParams 私钥,可以为null
|
||||
* @param publicKeyParams 公钥,可以为null
|
||||
*/
|
||||
public SM2(ECPrivateKeyParameters privateKeyParams, ECPublicKeyParameters publicKeyParams) {
|
||||
super(ALGORITHM_SM2, null, null);
|
||||
|
Reference in New Issue
Block a user