Andru
2023-10-23 6b479c5774ed3d6e2dc92693ddeda3e7ad1494db
src/main/java/com/hx/util/rsa/RSASignature.java
@@ -1,13 +1,22 @@
package com.hx.util.rsa;
import com.hx.util.StringUtils;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
@@ -49,6 +58,43 @@
        }
        return null;
    }
    /**
     * RSA签名Pkcs1ToPkcs8
     * @param rawKey 商户私钥
     * @return 签名值
     */
    public static String formatPkcs1ToPkcs8(String rawKey) {
        if (!StringUtils.isEmpty(rawKey)) {
            try {
                //将BASE64编码的私钥字符串进行解码
                byte[] encodeByte = Base64.decode(rawKey);
                AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(PKCSObjectIdentifiers.pkcs8ShroudedKeyBag);
                PrivateKeyInfo privKeyInfo = new PrivateKeyInfo(algorithmIdentifier, ASN1ObjectIdentifier.fromByteArray(encodeByte));
                return Base64.encode(privKeyInfo.getEncoded());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * RSA签名Pkcs8ToPkcs1
     * @param rawKey 商户私钥
     * @return 签名值
     */
    public static String formatPkcs8ToPkcs1(String rawKey){
        try {
            byte[] encodeByte = Base64.decode(rawKey);
            PrivateKeyInfo pki = PrivateKeyInfo.getInstance(encodeByte);
            ASN1Encodable asn = pki.parsePrivateKey();
            ASN1Primitive primitive = asn.toASN1Primitive();
            return Base64.encode(primitive.getEncoded());
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    public static String createSign(String content, String privateKey) {
@@ -121,4 +167,29 @@
        return false;
    }
    /**
     * ASCII码递增排序(剔除空值)
     * @param params
     * @return
     */
    public static String getSignCheckContent(Map<String, String> params) {
        if (params == null) {
            return null;
        } else {
            StringBuilder content = new StringBuilder();
            List<String> keys = new ArrayList(params.keySet());
            Collections.sort(keys);
            for(int i = 0; i < keys.size(); ++i) {
                String key = (String)keys.get(i);
                Object value = params.get(key);
                if(value == null || StringUtils.isEmpty(value.toString())){
                    continue;
                }
                content.append(i == 0 ? "" : "&").append(key).append("=").append(value);
            }
            return content.toString();
        }
    }
}