| | |
| | | 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; |
| | | |
| | | |
| | | /** |
| | |
| | | } |
| | | |
| | | 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) { |
| | |
| | | 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(); |
| | | } |
| | | } |
| | | |
| | | } |