java rsa .net_java与.net rsa加密互通

1 packagecom;2

3 importjava.security.KeyFactory;4 importjava.security.PublicKey;5 importjava.security.interfaces.RSAPrivateCrtKey;6 importjava.security.interfaces.RSAPublicKey;7 importjava.security.spec.PKCS8EncodedKeySpec;8 importjava.security.spec.X509EncodedKeySpec;9 //import org.castor.util.Base64Decoder;10 //import org.castor.util.Base64Encoder;

11

12 public classtest {13

14 public static voidmain(String[] args)15 {16 String tes="MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAL8z2QlXCL6w7rvY0Gbl8ARtQSXY+pEW5hlUHlmspqHt4k8/SkoF796gDqk4yyOcoWhkZWLPPugK35Mn7V+m5Jyfu8C0gVKOfWOA8A0T4hxV2ThAoMUq7QtB2K6s9AoumrxDfAkMBbsXEHYwfD/hxr/3DQ3lUvSFB6BnhiHEOyzpAgMBAAECgYEAol/9qRjorEjF9XEjSr9rHddKxEGIST8RGeF+BNnCiTHkRziQdlykYIO876jzmsKhsG3STB+EZLsXM3ls9RZefcsPF5mLOCSOCow3DikfCtAy4hntsU9JwpuYE0V4A+Sgfd24fatqbu+JxE2nvpSbAPczDOgBFPNfYBkhMiuZ/iECQQDzUeq7lFcIE4uWhRGveVFjNAGuSsW+q9GOwO7tS5YwuAIQ2M+XgYGRFo8xMC6V/9SfqJtmSU1zk72pMlYufIqHAkEAySqkcKbWuobq5I9KSQISq2qCuGKtj/iUFho4PCD1YxhnQ7gcHA4OpS1dRFjtXJYQPTX9be+mmypsCFIyofE5DwJBAPGZ20wahTh9v9Lbmq3z9n5ce3bGxAcJsHDg3d09eooxi8uSnL5BV5frII+k2f0TI9rMnlE4Y/FpN5+zXaOXAi0CQQCs3Aqfjo23jJWtPv/LSo+2YnjfblPMAgNmFrO532xc8axSgZMN/HpTL28UewHD7GMZ5hnWbPcSIFrir5c4luq7AkEAi90WdnZVPxtSTqkkLYbnh4Ro2WhdwRjkfyBxBZZx8hfaM6MfLPi3A0rw9DPOSB4M/BMchtEh3bXuI7bue2tG+A==";17 byte[] temp=b64decode(tes);18 String ver=getRSAPrivateKeyAsNetFormat(temp);//转换私钥

19

20 String tes1="MIGfMA0GCSqGSIb4DQEBAQUAA4GNADCBiQKBgQC/M9kJVwi+sO672NBm5fAEbUEl2PqRFuYZVB5ZrKah7eJPP0pKBe/eoA6pOMsjnKFoZGVizz7oCt+TJ+1fpuScn7vAtIFSjn1jgPANE+IcVdk4QKDFKu0LQdiurPQKLpq8Q3wJDAW7FxB2MHw/4ca/9w0N5VL0hQegZ4YhxDss6QIDAQAB";21 byte[] temp1=b64decode(tes1);22 String ver1=getRSAPublicKeyAsNetFormat(temp1);//转换公钥23 //String temp2= encodePublicKeyToXml(temp1);

24

25 }26

27 private static String getRSAPrivateKeyAsNetFormat(byte[] encodedPrivkey) {28 try{29 StringBuffer buff = new StringBuffer(1024);30

31 PKCS8EncodedKeySpec pvkKeySpec = newPKCS8EncodedKeySpec(32 encodedPrivkey);33 KeyFactory keyFactory = KeyFactory.getInstance("RSA");34 RSAPrivateCrtKey pvkKey =(RSAPrivateCrtKey) keyFactory35 .generatePrivate(pvkKeySpec);36

37 buff.append("");38 buff.append(""

39 +b64encode(removeMSZero(pvkKey.getModulus().toByteArray()))40 + "");41

42 buff.append(""

43 +b64encode(removeMSZero(pvkKey.getPublicExponent()44 .toByteArray())) + "");45

46 buff.append("

"

47 +b64encode(removeMSZero(pvkKey.getPrimeP().toByteArray()))48 + "

");49

50 buff.append(""

51 +b64encode(removeMSZero(pvkKey.getPrimeQ().toByteArray()))52 + "");53

54 buff.append(""

55 +b64encode(removeMSZero(pvkKey.getPrimeExponentP()56 .toByteArray())) + "");57

58 buff.append(""

59 +b64encode(removeMSZero(pvkKey.getPrimeExponentQ()60 .toByteArray())) + "");61

62 buff.append(""

63 +b64encode(removeMSZero(pvkKey.getCrtCoefficient()64 .toByteArray())) + "");65

66 buff.append(""

67 +b64encode(removeMSZero(pvkKey.getPrivateExponent()68 .toByteArray())) + "");69 buff.append("");70

71 return buff.toString().replaceAll("[ \t\n\r]", "");72 } catch(Exception e) {73 System.err.println(e);74 return null;75 }76 }77

78 private static String getRSAPublicKeyAsNetFormat(byte[] encodedPrivkey) {79 try{80 StringBuffer buff = new StringBuffer(1024);81

82 PKCS8EncodedKeySpec pvkKeySpec = newPKCS8EncodedKeySpec(encodedPrivkey);83 KeyFactory keyFactory = KeyFactory.getInstance("RSA");84 RSAPublicKey pukKey=(RSAPublicKey) keyFactory.generatePublic(newX509EncodedKeySpec(encodedPrivkey));85 //RSAPrivateCrtKey pvkKey = (RSAPrivateCrtKey) keyFactory.generatePrivate(pvkKeySpec);86 //PublicKey publicKey =KeyFactory.getInstance("RSA").generatePublic(pvkKeySpec);

87 buff.append("");88 buff.append(""

89 +b64encode(removeMSZero(pukKey.getModulus().toByteArray()))90 + "");91 buff.append(""

92 +b64encode(removeMSZero(pukKey.getPublicExponent()93 .toByteArray())) + "");94 buff.append("");95 return buff.toString().replaceAll("[ \t\n\r]", "");96 } catch(Exception e) {97 System.err.println(e);98 return null;99 }100 }101 public staticString encodePublicKeyToXml(PublicKey key) {102 if (!RSAPublicKey.class.isInstance(key)) {103 return null;104 }105 RSAPublicKey pubKey =(RSAPublicKey) key;106 StringBuilder sb = newStringBuilder();107 sb.append("");108 sb.append("")109 .append(Base64.encode(pubKey.getModulus().toByteArray()))110 .append("");111 sb.append("")112 .append(Base64.encode(pubKey.getPublicExponent()113 .toByteArray())).append("");114 sb.append("");115 returnsb.toString();116 }117

118 private static byte[] removeMSZero(byte[] data) {119 byte[] data1;120 int len =data.length;121 if (data[0] == 0) {122 data1 = new byte[data.length - 1];123 System.arraycopy(data, 1, data1, 0, len - 1);124 } else

125 data1 =data;126 returndata1;127 }128 private static String b64encode(byte[] data) {129

130 String b64str = newString(Base64.encode(data));131 returnb64str;132 }133

134 private static byte[] b64decode(String data) {135 byte[] decodeData =Base64.decode(data);136 returndecodeData;137 }138 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java.NET中,RSA密钥的存储格式不同,因此需要进行格式转换才能实现密钥的交换。下面是Java.NET之间RSA密钥格式转换的详细步骤。 1. 将Java中的公钥格式转换为.NET中的公钥格式: Java中的公钥格式为X.509证书格式,需要将其转换为XML格式。具体步骤如下: ``` KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec); StringWriter sw = new StringWriter(); XmlWriter xw = XmlWriter.Create(sw); RSAParameters parameters = new RSAParameters(); parameters.Modulus = publicKey.getModulus().toByteArray(); parameters.Exponent = publicKey.getPublicExponent().toByteArray(); xw.WriteStartElement("RSAKeyValue"); xw.WriteElementString("Modulus", Convert.ToBase64String(parameters.Modulus)); xw.WriteElementString("Exponent", Convert.ToBase64String(parameters.Exponent)); xw.WriteEndElement(); xw.Flush(); ``` 2. 将Java中的私钥格式转换为.NET中的私钥格式: Java中的私钥格式为PKCS#8格式,需要将其转换为XML格式。具体步骤如下: ``` KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKeyBytes); PrivateKey privateKey = keyFactory.generatePrivate(privateKeySpec); StringWriter sw = new StringWriter(); XmlWriter xw = XmlWriter.Create(sw); RSAParameters parameters = new RSAParameters(); parameters.Modulus = privateKey.getModulus().toByteArray(); parameters.D = privateKey.getPrivateExponent().toByteArray(); parameters.P = privateKey instanceof RSAPrivateCrtKey ? ((RSAPrivateCrtKey)privateKey).getPrimeP().toByteArray() : null; parameters.Q = privateKey instanceof RSAPrivateCrtKey ? ((RSAPrivateCrtKey)privateKey).getPrimeQ().toByteArray() : null; parameters.DP = privateKey instanceof RSAPrivateCrtKey ? ((RSAPrivateCrtKey)privateKey).getPrimeExponentP().toByteArray() : null; parameters.DQ = privateKey instanceof RSAPrivateCrtKey ? ((RSAPrivateCrtKey)privateKey).getPrimeExponentQ().toByteArray() : null; parameters.InverseQ = privateKey instanceof RSAPrivateCrtKey ? ((RSAPrivateCrtKey)privateKey).getCrtCoefficient().toByteArray() : null; xw.WriteStartElement("RSAKeyValue"); xw.WriteElementString("Modulus", Convert.ToBase64String(parameters.Modulus)); xw.WriteElementString("Exponent", Convert.ToBase64String(privateKey.getPublicExponent().toByteArray())); xw.WriteElementString("D", Convert.ToBase64String(parameters.D)); xw.WriteElementString("P", Convert.ToBase64String(parameters.P)); xw.WriteElementString("Q", Convert.ToBase64String(parameters.Q)); xw.WriteElementString("DP", Convert.ToBase64String(parameters.DP)); xw.WriteElementString("DQ", Convert.ToBase64String(parameters.DQ)); xw.WriteElementString("InverseQ", Convert.ToBase64String(parameters.InverseQ)); xw.WriteEndElement(); xw.Flush(); ``` 3. 将.NET中的公钥格式转换为Java中的公钥格式: .NET中的公钥格式为XML格式,需要将其转换为X.509证书格式。具体步骤如下: ``` XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlPublicKey); RSAParameters parameters = new RSAParameters(); parameters.Modulus = Convert.FromBase64String(doc.SelectSingleNode("//Modulus").InnerText); parameters.Exponent = Convert.FromBase64String(doc.SelectSingleNode("//Exponent").InnerText); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(parameters); RSACryptoServiceProvider rsaPublic = new RSACryptoServiceProvider(); rsaPublic.ImportParameters(rsa.ExportParameters(false)); byte[] x509publicKey = rsaPublic.ExportCspBlob(false); ``` 4. 将.NET中的私钥格式转换为Java中的私钥格式: .NET中的私钥格式为XML格式,需要将其转换为PKCS#8格式。具体步骤如下: ``` XmlDocument doc = new XmlDocument(); doc.LoadXml(xmlPrivateKey); RSAParameters parameters = new RSAParameters(); parameters.Modulus = Convert.FromBase64String(doc.SelectSingleNode("//Modulus").InnerText); parameters.D = Convert.FromBase64String(doc.SelectSingleNode("//D").InnerText); parameters.P = Convert.FromBase64String(doc.SelectSingleNode("//P").InnerText); parameters.Q = Convert.FromBase64String(doc.SelectSingleNode("//Q").InnerText); parameters.DP = Convert.FromBase64String(doc.SelectSingleNode("//DP").InnerText); parameters.DQ = Convert.FromBase64String(doc.SelectSingleNode("//DQ").InnerText); parameters.InverseQ = Convert.FromBase64String(doc.SelectSingleNode("//InverseQ").InnerText); RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(parameters); byte[] pkcs8privateKey = rsa.ExportPkcs8PrivateKey(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值