把Java生成的RSA公钥、私钥转换成.NET使用的XML格式详解编程语言

测试代码:

PrivateKey privateKey=RSAUtils.getRSAPrivateKeyBybase64(savePrivateKey); 
PublicKey publicKey=RSAUtils.getRSAPublidKeyBybase64(savePublicKey); 
String publicKeyXml = getRSAPublicKeyAsNetFormat(publicKey.getEncoded()); 
String privateKeyXml = getRSAPrivateKeyAsNetFormat(privateKey.getEncoded());
import java.security.KeyFactory; 
import java.security.interfaces.RSAPrivateCrtKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.PKCS8EncodedKeySpec; 
import java.security.spec.X509EncodedKeySpec;
 1  private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) { 
 2         try { 
 3             StringBuffer buff = new StringBuffer(1024); 
 4  
 5             PKCS8EncodedKeySpec pvkKeySpec = new PKCS8EncodedKeySpec( 
 6                     encodedPrivkey); 
 7             KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
 8             RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory 
 9                     .generatePrivate(pvkKeySpec); 
10  
11             buff.append("<RSAKeyValue>"); 
12             buff.append("<Modulus>" 
13                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getModulus().toByteArray())) 
14                     + "</Modulus>"); 
15  
16             buff.append("<Exponent>" 
17                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPublicExponent() 
18                     .toByteArray())) + "</Exponent>"); 
19  
20             buff.append("<P>" 
21                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeP().toByteArray())) 
22                     + "</P>"); 
23  
24             buff.append("<Q>" 
25                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeQ().toByteArray())) 
26                     + "</Q>"); 
27  
28             buff.append("<DP>" 
29                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeExponentP() 
30                     .toByteArray())) + "</DP>"); 
31  
32             buff.append("<DQ>" 
33                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPrimeExponentQ() 
34                     .toByteArray())) + "</DQ>"); 
35  
36             buff.append("<InverseQ>" 
37                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getCrtCoefficient() 
38                     .toByteArray())) + "</InverseQ>"); 
39  
40             buff.append("<D>" 
41                     + CodeUtils.base64Encode(removeMSZero(pvkKey.getPrivateExponent() 
42                     .toByteArray())) + "</D>"); 
43             buff.append("</RSAKeyValue>"); 
44  
45             return buff.toString().replaceAll("[ /t/n/r]", ""); 
46         } catch (Exception e) { 
47             System.err.println(e); 
48             return null; 
49         } 
50     } 
51  
52     private static String getRSAPublicKeyAsNetFormat(byte[] encodedPublicKey) { 
53         try { 
54  
55             KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
56             RSAPublicKey pukKey = (RSAPublicKey) keyFactory.generatePublic(new X509EncodedKeySpec(encodedPublicKey)); 
57  
58             StringBuffer buff = new StringBuffer(1024); 
59             buff.append("<RSAKeyValue>"); 
60             buff.append("<Modulus>" 
61                     + CodeUtils.base64Encode(removeMSZero(pukKey.getModulus().toByteArray())) 
62                     + "</Modulus>"); 
63             buff.append("<Exponent>" 
64                     + CodeUtils.base64Encode(removeMSZero(pukKey.getPublicExponent().toByteArray())) + "</Exponent>"); 
65             buff.append("</RSAKeyValue>"); 
11 
 
 
66             return buff.toString().replaceAll("[ /t/n/r]", ""); 
67         } catch (Exception e) { 
68             System.err.println(e); 
69             return null; 
70         } 
71     }
    private static byte[] removeMSZero(byte[] data) { 
        byte[] data1; 
        int len = data.length; 
        if (data[0] == 0) { 
            data1 = new byte[data.length - 1]; 
            System.arraycopy(data, 1, data1, 0, len - 1); 
        } else 
            data1 = data; 
 
        return data1; 
    }

 RSAUtils.java

// 
// Source code recreated from a .class file by IntelliJ IDEA 
// (powered by Fernflower decompiler) 
// 
 
package com.union.pufa; 
 
import java.math.BigInteger; 
import java.security.Key; 
import java.security.KeyFactory; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.NoSuchAlgorithmException; 
import java.security.PrivateKey; 
import java.security.Provider; 
import java.security.PublicKey; 
import java.security.SecureRandom; 
import java.security.Signature; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import java.security.spec.InvalidKeySpecException; 
import java.security.spec.PKCS8EncodedKeySpec; 
import java.security.spec.RSAKeyGenParameterSpec; 
import java.security.spec.RSAPrivateKeySpec; 
import java.security.spec.RSAPublicKeySpec; 
import java.security.spec.X509EncodedKeySpec; 
import javax.crypto.Cipher; 
import org.apache.commons.codec.binary.Hex; 
import org.apache.commons.lang.StringUtils; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
 
public abstract class RSAUtils { 
    private static final Logger LOGGER = LoggerFactory.getLogger(RSAUtils.class); 
    private static final String ALGORITHOM = "RSA"; 
    private static final Provider DEFAULT_PROVIDER = new BouncyCastleProvider(); 
    private static final String SIGNATURE_MD5WITHRSA = "MD5withRSA"; 
    private static final String SIGNATURE_SHA1WITHRSA = "SHA1withRSA"; 
    private static final String SIGNATURE_ALGORITHM_DEFAULT = "NONEwithRSA"; 
    private static final String CIPHER_TRANSFORMATION_DEFAULT = "RSA/ECB/PKCS1Padding"; 
    private static final String HASHID_SHA1 = "01"; 
    private static final String HASHID_MD5 = "02"; 
    private static KeyPairGenerator keyPairGen = null; 
    private static KeyFactory keyFactory = null; 
 
    static { 
        try { 
            keyPairGen = KeyPairGenerator.getInstance("RSA", DEFAULT_PROVIDER); 
            keyFactory = KeyFactory.getInstance("RSA", DEFAULT_PROVIDER); 
        } catch (NoSuchAlgorithmException var1) { 
            LOGGER.error(var1.getMessage()); 
        } 
 
    } 
 
    private RSAUtils() { 
    } 
 
    public static synchronized KeyPair generateRSAKeyPair(int keysize, BigInteger publicExponent) { 
        try { 
            keyPairGen.initialize(new RSAKeyGenParameterSpec(keysize, publicExponent), new SecureRandom()); 
            return keyPairGen.generateKeyPair(); 
        } catch (Exception var3) { 
            LOGGER.error("生成模长 =" + keysize + ",指数=" + publicExponent + "的RSA密钥对失败", var3); 
            return null; 
        } 
    } 
 
    public static PrivateKey getRSAPrivateKey(String hexModulus, String hexPrivateExponent) { 
        if(!StringUtils.isBlank(hexModulus) && !StringUtils.isBlank(hexPrivateExponent)) { 
            BigInteger mbig = new BigInteger(hexModulus, 16); 
            BigInteger ebig = new BigInteger(hexPrivateExponent, 16); 
            RSAPrivateKeySpec prispec = new RSAPrivateKeySpec(mbig, ebig); 
 
            try { 
                return keyFactory.generatePrivate(prispec); 
            } catch (InvalidKeySpecException var6) { 
                LOGGER.error("hexModulus or hexPrivateExponent value is invalid. return null(RSAPrivateKey)."); 
                return null; 
            } 
        } else { 
            if(LOGGER.isDebugEnabled()) { 
                LOGGER.debug("hexModulus and hexPrivateExponent cannot be empty. RSAPrivateKey value is null to return."); 
            } 
 
            return null; 
        } 
    } 
 
    public static PublicKey getRSAPublidKey(String hexModulus, String hexPublicExponent) { 
        if(!StringUtils.isBlank(hexModulus) && !StringUtils.isBlank(hexPublicExponent)) { 
            BigInteger mbig = new BigInteger(hexModulus, 16); 
            BigInteger ebig = new BigInteger(hexPublicExponent, 16); 
            RSAPublicKeySpec pubspec = new RSAPublicKeySpec(mbig, ebig); 
 
            try { 
                return keyFactory.generatePublic(pubspec); 
            } catch (InvalidKeySpecException var6) { 
                LOGGER.error("hexModulus or hexPublicExponent value is invalid. return null(RSAPublicKey)."); 
                return null; 
            } 
        } else { 
            if(LOGGER.isDebugEnabled()) { 
                LOGGER.debug("hexModulus and hexPublicExponent cannot be empty. return null(RSAPublicKey)."); 
            } 
 
            return null; 
        } 
    } 
 
    public static String getBase64CodeKey(Key key) { 
        return CodeUtils.base64Encode(key.getEncoded()); 
    } 
 
    public static String getNakedPublicKey(RSAPublicKey key) { 
        return key.getModulus().toString(16).toUpperCase(); 
    } 
 
    private static byte[] getAsn1Len(int len) { 
        int ret = false; 
        byte[] buff = new byte[10]; 
        byte[] asn1Len = (byte[])null; 
        if(len > '/uffff') { 
            return null; 
        } else { 
            byte ret; 
            if(len > 255) { 
                buff[0] = -126; 
                buff[1] = (byte)((len & '/uff00') >> 8); 
                buff[2] = (byte)(len & 255); 
                ret = 3; 
            } else if((len & 128) != 0) { 
                buff[0] = -127; 
                buff[1] = (byte)len; 
                ret = 2; 
            } else { 
                buff[0] = (byte)len; 
                ret = 1; 
            } 
 
            asn1Len = new byte[ret]; 
            System.arraycopy(buff, 0, asn1Len, 0, ret); 
            return asn1Len; 
        } 
    } 
 
    public static byte[] getDerPK(byte[] pkModule, byte[] exp) { 
        byte[] buff = new byte[4096]; 
        byte[] tbuff = new byte[4096]; 
        byte[] tmp = (byte[])null; 
        byte[] derPK = (byte[])null; 
        int offset = false; 
        int len = false; 
        int lenOfPkModule = pkModule.length; 
        int lenOfExp = exp.length; 
        if(pkModule != null && exp != null) { 
            int offset = 0; 
            tbuff[offset] = 2; 
            int offset = offset + 1; 
            tmp = getAsn1Len(lenOfPkModule + 1); 
            System.arraycopy(tmp, 0, tbuff, offset, tmp.length); 
            offset += tmp.length; 
            tbuff[offset] = 0; 
            ++offset; 
            System.arraycopy(pkModule, 0, tbuff, offset, lenOfPkModule); 
            offset += lenOfPkModule; 
            tbuff[offset] = 2; 
            ++offset; 
            tmp = getAsn1Len(lenOfExp); 
            System.arraycopy(tmp, 0, tbuff, offset, tmp.length); 
            offset += tmp.length; 
            System.arraycopy(exp, 0, tbuff, offset, lenOfExp); 
            offset += lenOfExp; 
            int len = offset; 
            offset = 0; 
            buff[offset] = 48; 
            offset = offset + 1; 
            tmp = getAsn1Len(len); 
            System.arraycopy(tmp, 0, buff, offset, tmp.length); 
            offset += tmp.length; 
            System.arraycopy(tbuff, 0, buff, offset, len); 
            offset += len; 
            derPK = new byte[offset]; 
            System.arraycopy(buff, 0, derPK, 0, offset); 
            return derPK; 
        } else { 
            return null; 
        } 
    } 
 
    public static String getDerPKWithAscHex(String pkModule, String exp) { 
        return pkModule != null && exp != null?CodeUtils.byte2hex(getDerPK(CodeUtils.hex2byte(pkModule), CodeUtils.hex2byte(exp))):null; 
    } 
 
    public static PublicKey getPKfromDerPK(String racalPK) { 
        byte[] racalPKStr = (byte[])null; 
        if(racalPK == null) { 
            return null; 
        } else { 
            racalPKStr = CodeUtils.hex2byte(racalPK); 
            int offset = 0; 
            if(racalPKStr[offset] != 48) { 
                return null; 
            } else { 
                int offset = offset + 1; 
                int i; 
                int lenOfNextPart; 
                int bitsOfLenFlag; 
                if((racalPKStr[offset] & 255) <= 128) { 
                    lenOfNextPart = racalPKStr[offset] & 255; 
                    ++offset; 
                } else { 
                    bitsOfLenFlag = (racalPKStr[offset] & 255) - 128; 
                    ++offset; 
                    i = 0; 
 
                    for(lenOfNextPart = 0; i < bitsOfLenFlag; ++offset) { 
                        lenOfNextPart += racalPKStr[offset] & 255; 
                        ++i; 
                    } 
                } 
 
                if((racalPKStr[offset] & 255) != 2) { 
                    return null; 
                } else { 
                    ++offset; 
                    --lenOfNextPart; 
                    int lenOfPK = false; 
                    int lenOfPK; 
                    if((racalPKStr[offset] & 255) <= 128) { 
                        lenOfPK = racalPKStr[offset] & 255; 
                        ++offset; 
                    } else { 
                        bitsOfLenFlag = (racalPKStr[offset] & 255) - 128; 
                        ++offset; 
                        i = 0; 
 
                        for(lenOfPK = 0; i < bitsOfLenFlag; ++offset) { 
                            lenOfPK += racalPKStr[offset] & 255; 
                            ++i; 
                        } 
                    } 
 
                    while(lenOfPK % 8 != 0) { 
                        if((racalPKStr[offset] & 255) != 0) { 
                            return null; 
                        } 
 
                        ++offset; 
                        --lenOfPK; 
                    } 
 
                    byte[] LPk = new byte[lenOfPK]; 
                    System.arraycopy(racalPKStr, offset, LPk, 0, lenOfPK); 
                    String pk = CodeUtils.byte2hex(LPk); 
                    offset += lenOfPK; 
                    int lenOfEval = false; 
                    if(racalPKStr[offset] != 2) { 
                        return null; 
                    } else { 
                        ++offset; 
                        int lenOfEval = racalPKStr[offset]; 
                        ++offset; 
                        byte[] LPkEval = new byte[lenOfEval]; 
                        System.arraycopy(racalPKStr, offset, LPkEval, 0, lenOfEval); 
                        return getRSAPublidKey(pk, CodeUtils.byte2hex(LPkEval)); 
                    } 
                } 
            } 
        } 
    } 
 
    public static RSAPublicKey getRSAPublidKeyBybase64(String base64s) { 
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(CodeUtils.base64Decode(base64s)); 
        RSAPublicKey publicKey = null; 
 
        try { 
            publicKey = (RSAPublicKey)keyFactory.generatePublic(keySpec); 
        } catch (InvalidKeySpecException var4) { 
            LOGGER.error("base64编码=" + base64s + "转RSA公钥失败", var4); 
        } 
 
        return publicKey; 
    } 
 
    public static RSAPrivateKey getRSAPrivateKeyBybase64(String base64s) { 
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(CodeUtils.base64Decode(base64s)); 
        RSAPrivateKey privateKey = null; 
 
        try { 
            privateKey = (RSAPrivateKey)keyFactory.generatePrivate(keySpec); 
        } catch (InvalidKeySpecException var4) { 
            LOGGER.error("base64编码=" + base64s + "转RSA私钥失败", var4); 
        } 
 
        return privateKey; 
    } 
 
    public static byte[] encrypt(Key key, byte[] data) throws Exception { 
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", DEFAULT_PROVIDER); 
        cipher.init(1, key); 
        return cipher.doFinal(data); 
    } 
 
    public static byte[] decrypt(Key key, byte[] data) throws Exception { 
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", DEFAULT_PROVIDER); 
        cipher.init(2, key); 
        return cipher.doFinal(data); 
    } 
 
    public static String encryptString(Key key, String plaintext) { 
        if(key != null && plaintext != null) { 
            byte[] data = plaintext.getBytes(); 
 
            try { 
                byte[] en_data = encrypt(key, data); 
                return new String(Hex.encodeHex(en_data)); 
            } catch (Exception var4) { 
                LOGGER.error(var4.getCause().getMessage()); 
                return null; 
            } 
        } else { 
            return null; 
        } 
    } 
 
    public static String encryptStr4essc(Key key, String plaintext, String accNo, String encType) { 
        if(key != null && plaintext != null) { 
            if("1".equals(encType)) { 
                plaintext = CodeUtils.paddingRightStr(plaintext, 'F', 16); 
            } else if("0".equals(encType)) { 
                plaintext = CodeUtils.asc2ascInt2hexasc(CodeUtils.paddingRightStr(plaintext, 'F', 16)); 
            } 
 
            byte[] data = CodeUtils.hex2byte(plaintext); 
 
            try { 
                byte[] en_data = encrypt(key, data); 
                return (new String(Hex.encodeHex(en_data))).toUpperCase(); 
            } catch (Exception var6) { 
                LOGGER.error(var6.getCause().getMessage()); 
                return null; 
            } 
        } else { 
            return null; 
        } 
    } 
 
    public static String decryptString(Key key, String encrypttext) { 
        if(key != null && !StringUtils.isBlank(encrypttext)) { 
            try { 
                byte[] en_data = Hex.decodeHex(encrypttext.toCharArray()); 
                byte[] data = decrypt(key, en_data); 
                return new String(data); 
            } catch (Exception var4) { 
                LOGGER.error(String.format("/"%s/" Decryption failed. Cause: %s", new Object[]{encrypttext, var4.getCause().getMessage()})); 
                return null; 
            } 
        } else { 
            return null; 
        } 
    } 
 
    public static String sign(RSAPrivateKey privatekey, String dataFillMode, String hashID, String data) throws Exception { 
        Signature signature = Signature.getInstance("NONEwithRSA"); 
        if("01".equals(hashID)) { 
            data = CodeUtils.sha1String(data).toUpperCase(); 
        } else if("02".equals(hashID)) { 
            data = CodeUtils.md5String(data).toUpperCase(); 
        } 
 
        signature.initSign(privatekey); 
        signature.update(data.getBytes()); 
        return CodeUtils.byte2hex(signature.sign()).toUpperCase(); 
    } 
 
    public static boolean verifySign(PublicKey publicKey, String dataFillMode, String hashID, String data, String sign) throws Exception { 
        Signature signature = Signature.getInstance("NONEwithRSA"); 
        if("01".equals(hashID)) { 
            data = CodeUtils.sha1String(data).toUpperCase(); 
        } else if("02".equals(hashID)) { 
            data = CodeUtils.md5String(data).toUpperCase(); 
        } 
 
        signature.initVerify(publicKey); 
        signature.update(data.getBytes()); 
        return signature.verify(CodeUtils.hex2byte(sign.toUpperCase())); 
    } 
}

 

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/15851.html

(0)
上一篇 2021年7月19日 18:49
下一篇 2021年7月19日 18:49

相关推荐

发表回复

登录后才能评论