美文网首页
Java与C#秘钥之间的转换

Java与C#秘钥之间的转换

作者: 风静花犹落 | 来源:发表于2018-08-07 23:20 被阅读0次

    C#的秘钥与Java秘钥的区别

    C#使用的是标准的RSA格式,然后将其中的数字base64编码后,生成XML进行存储。

    Java中使用的是pkcs8、X.509的公私钥语法,存储的都是相应的JAVA类自动生成的base64字符串

    C#私钥样式:

    <RSAKeyValue>
      <Modulus>pJlJIR0+G/vs7mhycs0Zd5DbWokMCsLX7Ih373+ljlteRmTm8IHj0Sl8zA26Qu/oAmqh9OFk806zW3TXl90RghSeQhzZBXFHBrTFN4U/o3wPhZBdFazh80bbskrmQ/jmz70qUm3HmGzsb3toxzN6Ehakdo7qP2Kc6aOVTyXrYpk=</Modulus>
      <Exponent>AQAB</Exponent>
      <P>1WKkFg6jlS2eZSVLiH1CK4b9uhr7qE1/L+tPqKQs+PzHX4eiZXnyAlQ+kgGmL7n1wR1RWNuiYnDZUetmTogaDQ==</P>
      <Q>xXhsuEnNJNQcQHEVTPZoulbMbTV1VZIDQ1zjG8fvu8sv6IBYcR5+EsC8n3/6RkW8/iCJDzxE++VHzhoSQSoDvQ==</Q>
      <DP>zr/rcn+umd0Aisnu/Ik48smxz39TdIfaAwkBPsoL1Re+6V2WyLG1/fG4SmmUpsuMRRdt+SWdmbnzpr7peo++hQ==</DP>
      <DQ>MWi2W04sBEEGaKFi4QTuo2FAeTrdBvIn2t0M/lCCjYyDijtC5drpVKvhBk+xQZAFf9iIMsWzxQtTciBX3PI0SQ==</DQ>
      <InverseQ>wGEfA3LWM4NHgRnXDqwwOUs3OtqWK0tsJPPcFMci+Bcgy96JpFTCr7bubXHMu14bdopCWUann2d3UuwEpvP+</InverseQ>
      <D>mK3TRtMwRJb33OGnn9OeFumYfy92qxi3X6Hq1o6qDBW2qkd4bImfv+ni6AinyOVuaadt2Y+lq4dKGcCVJzoZvPm1VKxD2y7xKa8/vEbPRiRTt0qnPq9T7UJkpDsiXf/zOMfWdjc3uA1bPnQ65RWHSJ7zAE+Gd7xnyCE5MEyijLE=</D>
    </RSAKeyValue>
    

    C#公钥样式:

    <RSAKeyValue>
     <Modulus>pJlJIR0+G/vs7mhycs0Zd5DbWokMCsLX7Ih373+ljlteRmTm8IHj0Sl8zA26Qu/oAmqh9OFk806zW3TXl90RghSeQhzZBXFHBrTFN4U/o3wPhZBdFazh80bbskrmQ/jmz70qUm3HmGzsb3toxzN6Ehakdo7qP2Kc6aOVTyXrYpk=</Modulus>
      <Exponent>AQAB</Exponent>
    </RSAKeyValue>
    

    Java私钥样式:

    -----BEGIN PRIVATE KEY-----
    MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKCl0l2qYgZfZX38
    IX3B8ejhX1cno4uIjOweCgVbf6cPQziB0Ov9jqgaiWX0W1rakqlrAITJmGk+q0XS
    RisPx+vhNOxO8vKE0kTOlQapIaNHhJ11Ziq5ovmFzlTLkcFX0oNggunyOF7VN1FJ
    Ifw0j7jQtIcFWpiNw3Qb6w+t3EdvAgMBAAECgYEAgl1udEIzIBbEJtO3XfVIWYKi
    uvhY2H+sVGQgH67bzXcuRqnaH9f4r2QxgcIlbHoZMFC78AYkn6uSk6uK86Dvy6q4
    WlhbDEhzjl1I6oRkFl+qazO8heBdkjMAVla4bK5wbo1WpihPJcbrEeFylpEHIlh6
    l5IUESrG7ur24eY9CPECQQDVejq0ypAUSNbiZ5bxVufBl4J3Q2dCP8wlVafcFrRm
    sCbkeJfIDVBFMLxoMNnhElIhnyPwMTk6E60LwMFYf6iHAkEAwKWq84PTJtZJ3C4+
    ++B+6+hOlDgoKq+Ujse3rdgPqsTZHlkaLGonGNet2pJCMth9xE/KMhkDwlcoDV6Z
    65pr2QJBAK3DhT+d1jM8qvS0/y9I3vI8gizTx5wsU95b33uNW6BuZ+n2ow1qkNkQ
    93sTsHW8tO+7GsSrPHqig2uapYaEuscCQAokLn2nQORYf4bhwFsOFGBi2FAhLKwi
    lhV2GgtCxoBc4Hkig6g25lv+bp6E+IsormY5NRGyE2qVn/wkMMIgXPECQQC6GnPc
    ryNA5yzu+bdu+DTTt3uh/XmDRw9xIfPKHTFHGWHnaCf3TFU2qk8HMPSQN2nIYrZs
    5b2Guhxsb+dcNuHC
    -----END PRIVATE KEY-----
    

    Java公钥样式:

    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCgpdJdqmIGX2V9/CF9wfHo4V9X
    J6OLiIzsHgoFW3+nD0M4gdDr/Y6oGoll9Fta2pKpawCEyZhpPqtF0kYrD8fr4TTs
    TvLyhNJEzpUGqSGjR4SddWYquaL5hc5Uy5HBV9KDYILp8jhe1TdRSSH8NI+40LSH
    BVqYjcN0G+sPrdxHbwIDAQAB
    -----END PUBLIC KEY-----
    
    

    Java代码实现秘钥之间的转化

    import java.math.BigInteger;
    import java.nio.charset.Charset;
    import java.security.KeyFactory;
    import java.security.PrivateKey;
    import java.security.PublicKey;
    import java.security.interfaces.RSAPrivateCrtKey;
    import java.security.interfaces.RSAPublicKey;
    import java.security.spec.RSAPrivateCrtKeySpec;
    import java.security.spec.RSAPublicKeySpec;
    import java.util.Base64;
    
    /**
     * C#秘钥与Java互转
     */
    public class CSharpOrJavaUtil {
    
        /**
         * C#私钥转换成java私钥
         */
        public static String privateKeyFromXml(String privateKeyXml) {
            privateKeyXml = privateKeyXml.replaceAll("\r", "").replaceAll("\n", "");
    
            KeyFactory keyFactory;
            try {
                String modulusXml = privateKeyXml.substring(privateKeyXml.indexOf("<Modulus>") + 9, privateKeyXml.indexOf("</Modulus>"));
                BigInteger modulus = new BigInteger(1, Base64.getDecoder().decode(modulusXml));
    
                String publicExponentXml = privateKeyXml.substring(privateKeyXml.indexOf("<Exponent>") + 10, privateKeyXml.indexOf("</Exponent>"));
                BigInteger publicExponent = new BigInteger(1, Base64.getDecoder().decode(publicExponentXml));
    
                String privateExponentXml = privateKeyXml.substring(privateKeyXml.indexOf("<D>") + 3, privateKeyXml.indexOf("</D>"));
                BigInteger privateExponent = new BigInteger(1, Base64.getDecoder().decode(privateExponentXml));
    
                String primePXml = privateKeyXml.substring(privateKeyXml.indexOf("<P>") + 3, privateKeyXml.indexOf("</P>"));
                BigInteger primeP = new BigInteger(1, Base64.getDecoder().decode(primePXml));
    
                String primeQXml = privateKeyXml.substring(privateKeyXml.indexOf("<Q>") + 3, privateKeyXml.indexOf("</Q>"));
                BigInteger primeQ = new BigInteger(1, Base64.getDecoder().decode(primeQXml));
    
                String primeExponentPXml = privateKeyXml.substring(privateKeyXml.indexOf("<DP>") + 4, privateKeyXml.indexOf("</DP>"));
                BigInteger primeExponentP = new BigInteger(1, Base64.getDecoder().decode(primeExponentPXml));
    
                String primeExponentQXml = privateKeyXml.substring(privateKeyXml.indexOf("<DQ>") + 4, privateKeyXml.indexOf("</DQ>"));
                BigInteger primeExponentQ = new BigInteger(1, Base64.getDecoder().decode(primeExponentQXml));
    
                String crtCoefficientXml = privateKeyXml.substring(privateKeyXml.indexOf("<InverseQ>") + 10, privateKeyXml.indexOf("</InverseQ>"));
                BigInteger crtCoefficient = new BigInteger(1, Base64.getDecoder().decode(crtCoefficientXml));
    
                RSAPrivateCrtKeySpec rsaPriKey = new RSAPrivateCrtKeySpec(modulus, publicExponent, privateExponent, primeP, primeQ, primeExponentP, primeExponentQ, crtCoefficient);
    
                keyFactory = KeyFactory.getInstance("RSA");
                PrivateKey privateKey = keyFactory.generatePrivate(rsaPriKey);
                byte[] bytes = Base64.getEncoder().encode(privateKey.getEncoded());
                return new String(bytes, Charset.forName("utf-8"));
            } catch (Exception e) {
                System.err.println(e.toString());
            }
            return null;
        }
    
        /**
         * C#公钥转换成java公钥
         */
        public static String publicKeyFromXml(String publicKeyXml) {
            KeyFactory keyFactory;
            publicKeyXml = publicKeyXml.replaceAll("\r", "").replaceAll("\n", "");
            try {
                String modulusXml = publicKeyXml.substring(publicKeyXml.indexOf("<Modulus>") + 9, publicKeyXml.indexOf("</Modulus>"));
                BigInteger modulus = new BigInteger(1, Base64.getDecoder().decode(modulusXml));
    
                String exponentXml = publicKeyXml.substring(publicKeyXml.indexOf("<Exponent>") + 10, publicKeyXml.indexOf("</Exponent>"));
                BigInteger publicExponent = new BigInteger(1, Base64.getDecoder().decode(exponentXml));
    
                RSAPublicKeySpec rsaPubKey = new RSAPublicKeySpec(modulus, publicExponent);
                keyFactory = KeyFactory.getInstance("RSA");
                PublicKey publicKey = keyFactory.generatePublic(rsaPubKey);
                byte[] bytes = Base64.getEncoder().encode(publicKey.getEncoded());
                return new String(bytes, Charset.forName("utf-8"));
            } catch (Exception e) {
                System.err.println(e.toString());
                return null;
            }
        }
    
        /**
         * java私钥转换成C#私钥
         */
        public static String privateKeyToXml(RSAPrivateCrtKey privateKey) {
    
            String modulusBase64 = Base64.getEncoder().encodeToString(privateKey.getModulus().toByteArray());
            String modulus = modulusBase64.replace("\r", "").replace("\n", "");
    
            String exponentBase64 = Base64.getEncoder().encodeToString(privateKey.getPublicExponent().toByteArray());
            String exponent = exponentBase64.replace("\r", "").replace("\n", "");
    
            String pBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeP().toByteArray());
            String p = pBase64.replace("\r", "").replace("\n", "");
    
            String qBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeQ().toByteArray());
            String q = qBase64.replace("\r", "").replace("\n", "");
    
            String dpBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeExponentP().toByteArray());
            String dp = dpBase64.replace("\r", "").replace("\n", "");
    
            String dqBase64 = Base64.getEncoder().encodeToString(privateKey.getPrimeExponentQ().toByteArray());
            String dq = dqBase64.replace("\r", "").replace("\n", "");
    
            String dBase64 = Base64.getEncoder().encodeToString(privateKey.getPrivateExponent().toByteArray());
            String d = dBase64.replace("\r", "").replace("\n", "");
            
            String inverseQBase64 = Base64.getEncoder().encodeToString(privateKey.getCrtCoefficient().toByteArray());
            String inverseQ = inverseQBase64.replace("\r", "").replace("\n", "");
    
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("<RSAKeyValue>\n");
            stringBuilder.append("<Modulus>").append(modulus).append("</Modulus>\n");
            stringBuilder.append("<Exponent>").append(exponent).append("</Exponent>\n");
            stringBuilder.append("<P>").append(p).append("</P>\n");
            stringBuilder.append("<Q>").append(q).append("</Q>\n");
            stringBuilder.append("<DP>").append(dp).append("</DP>\n");
            stringBuilder.append("<DQ>").append(dq).append("</DQ>\n");
            stringBuilder.append("<InverseQ>").append(inverseQ).append("</InverseQ>\n");
            stringBuilder.append("<D>").append(d).append("</D>\n");
            stringBuilder.append("</RSAKeyValue>");
            return stringBuilder.toString();
        }
    
        /**
         * java公钥转换成C#公钥
         */
        public static String publicKeyToXml(RSAPublicKey publicKey) {
            String modulusBase64 = Base64.getEncoder().encodeToString(publicKey.getModulus().toByteArray());
            String modulus = modulusBase64.replace("\r", "").replace("\n", "");
    
            String exponentBase64 = Base64.getEncoder().encodeToString(publicKey.getPublicExponent().toByteArray());
            String exponent = exponentBase64.replace("\r", "").replace("\n", "");
    
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("<RSAKeyValue>\n");
            stringBuilder.append("<Modulus>").append(modulus).append("</Modulus>\n");
            stringBuilder.append("<Exponent>").append(exponent).append("</Exponent>\n");
            stringBuilder.append("</RSAKeyValue>");
            return stringBuilder.toString();
        }
    
        public static void main(String[] args) {
            String privateXml =
                    "<RSAKeyValue>\n" +
                    "  <Modulus>pJlJIR0+G/vs7mhycs0Zd5DbWokMCsLX7Ih373+ljlteRmTm8IHj0Sl8zA26Qu/oAmqh9OFk806zW3TXl90RghSeQhzZBXFHBrTFN4U/o3wPhZBdFazh80bbskrmQ/jmz70qUm3HmGzsb3toxzN6Ehakdo7qP2Kc6aOVTyXrYpk=</Modulus>\n" +
                    "  <Exponent>AQAB</Exponent>\n" +
                    "  <P>1WKkFg6jlS2eZSVLiH1CK4b9uhr7qE1/L+tPqKQs+PzHX4eiZXnyAlQ+kgGmL7n1wR1RWNuiYnDZUetmTogaDQ==</P>\n" +
                    "  <Q>xXhsuEnNJNQcQHEVTPZoulbMbTV1VZIDQ1zjG8fvu8sv6IBYcR5+EsC8n3/6RkW8/iCJDzxE++VHzhoSQSoDvQ==</Q>\n" +
                    "  <DP>zr/rcn+umd0Aisnu/Ik48smxz39TdIfaAwkBPsoL1Re+6V2WyLG1/fG4SmmUpsuMRRdt+SWdmbnzpr7peo++hQ==</DP>\n" +
                    "  <DQ>MWi2W04sBEEGaKFi4QTuo2FAeTrdBvIn2t0M/lCCjYyDijtC5drpVKvhBk+xQZAFf9iIMsWzxQtTciBX3PI0SQ==</DQ>\n" +
                    "  <InverseQ>wGEfA3LWM4NHgRnXDqwwOUs3OtqWK0tsJPPcFMci+Bcgy96JpFTCr7bubXHMu14bdopCWUann2d3UuwEpvP+</InverseQ>\n" +
                    "  <D>mK3TRtMwRJb33OGnn9OeFumYfy92qxi3X6Hq1o6qDBW2qkd4bImfv+ni6AinyOVuaadt2Y+lq4dKGcCVJzoZvPm1VKxD2y7xKa8/vEbPRiRTt0qnPq9T7UJkpDsiXf/zOMfWdjc3uA1bPnQ65RWHSJ7zAE+Gd7xnyCE5MEyijLE=</D>\n" +
                    "</RSAKeyValue>";
            System.out.println(privateKeyFromXml(privateXml));
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Java与C#秘钥之间的转换

          本文链接:https://www.haomeiwen.com/subject/owmzvftx.html