I am new to RSA and cryptography, and I need to encrypt and decrypt data using RSA, I have a Java program that generates a pair of keys and saves them in .key files with XML format (this is absolutely normal and this has been verified with using encryption and decryption of data), then I want to use them in a .NET application, I import the keys that will be used for encryption and decryption. The public key is in order and encryption is performed without problems, but with the private key Import ends with an exception message
Bad data (CryptographicException.ThrowCryptogaphicException(Int32 hr))
This is a coded public key:
<RSAKeyValue> <Modulus>iFouk9viRs5dcvJCvDM1vXC4sBuSB9SPcdJhRyFLoNW/pka6MNAiu4cOksFRejiuM1ZswyJMy+ow lmLflJ/XrfnUQxLwLp61oij4CrzHKl9jjHorqIA7uEQKY8RBiUjZ7kbO5nFaIWs1NWMVks8Srdhv 8pVd1sLKKUs66c/ndAk=</Modulus> <Exponent>AQAB</Exponent> </RSAKeyValue>
and this is a coded public key:
<RSAKeyValue> <Modulus>iFouk9viRs5dcvJCvDM1vXC4sBuSB9SPcdJhRyFLoNW/pka6MNAiu4cOksFRejiuM1ZswyJMy+ow lmLflJ/XrfnUQxLwLp61oij4CrzHKl9jjHorqIA7uEQKY8RBiUjZ7kbO5nFaIWs1NWMVks8Srdhv 8pVd1sLKKUs66c/ndAk=</Modulus> <Exponent>AQAB</Exponent> <P>AO9WnDNOt9Xewnoy8KTed56Z+3Nfto6J8wCXKzX3LhuuiKNUBe8qFoinrteQJq/9NAEXnNCafxDW ThIkr9GtMxE=</P> <Q>AJHYMk0bOEGZlQbaJk3VDovvOJuRt5NI3WtXWl1v5VUW6aQQO3rV3+3GSN6Xa3hTKXtCVVL26Awy OkDykUPjQXk=</Q> <DP>KIHsJfLowlXVbIE6oWzVqg49tKU6bJ2Ed1Eeix+uuhisH5iU+ImTDsXynaFUKu0b5CNu8w9y+hKL XB7BcydxQQ==</DP> <DQ>di267NIersF1idzhZvY62FdbBmx4VaeYi+93sPkH2wA7CI+CsxF1Z6XhzETkd9bjaRaiLx0VgTR+ Eby8y0bt+Q==</DQ> <InverseQ>HYF8gahVyzsz0IotzKI2Oh53sJMZWVxsvzkhqGlDtY1THFGZE5j8kl/UK0+FSN6yOYxBIuKNZ7om MgLQEMK1PQ==</InverseQ> <D>DERQvGyjxsr6DUVOS7AvvYNOmklgseOlpA/RQJz2ONoCC+uBBLM07LoRzZImymAfC+9SiZukXRQM mvr6MlzPAm04NWyZNzbjhLvmn1gmvDclDZ9X9bhYp8MBftPWU5PFBALOjVpD+mlbI2lTYCugf6pJ MHEMe17mNJ0eWCerfAE=</D> </RSAKeyValue>
Please help me understand what is happening and what is wrong with the private key.
this is the code that works fine after solving the problem:
private String getPublicKeyXml(RSAPublicKey pk) throws UnsupportedEncodingException { StringBuilder builder = new StringBuilder(); builder.append("<RSAKeyValue>\n"); byte[] m = pk.getModulus().toByteArray(); byte[] mm = stripLeadingZeros(m); write(builder, "Modulus", mm); write(builder, "Exponent", pk.getPublicExponent()); builder.append("</RSAKeyValue>"); return builder.toString(); } private String getPrivateKeyXml(PrivateKey pk) throws UnsupportedEncodingException { RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) pk; BigInteger n = privKey.getModulus(); BigInteger e = privKey.getPublicExponent(); BigInteger d = privKey.getPrivateExponent(); BigInteger p = privKey.getPrimeP(); BigInteger q = privKey.getPrimeQ(); BigInteger dp = privKey.getPrimeExponentP(); BigInteger dq = privKey.getPrimeExponentQ(); BigInteger inverseQ = privKey.getCrtCoefficient(); StringBuilder builder = new StringBuilder(); builder.append("<RSAKeyValue>\n"); write(builder, "Modulus", stripLeadingZeros(n.toByteArray())); write(builder, "Exponent", stripLeadingZeros(e.toByteArray())); write(builder, "P", stripLeadingZeros(p.toByteArray())); write(builder, "Q", stripLeadingZeros(q.toByteArray())); write(builder, "DP", stripLeadingZeros(dp.toByteArray())); write(builder, "DQ", stripLeadingZeros(dq.toByteArray())); write(builder, "InverseQ", stripLeadingZeros(inverseQ.toByteArray())); write(builder, "D", stripLeadingZeros(d.toByteArray())); builder.append("</RSAKeyValue>"); return builder.toString(); } private void write(StringBuilder builder, String tag, byte[] bigInt) throws UnsupportedEncodingException { builder.append("\t<"); builder.append(tag); builder.append(">"); builder.append(encode(bigInt).trim()); builder.append("</"); builder.append(tag); builder.append(">\n"); } private void write(StringBuilder builder, String tag, BigInteger bigInt) throws UnsupportedEncodingException { builder.append("\t<"); builder.append(tag); builder.append(">"); builder.append(encode(bigInt)); builder.append("</"); builder.append(tag); builder.append(">\n"); } private static String encode(BigInteger bigInt) throws UnsupportedEncodingException { return new String(new sun.misc.BASE64Encoder().encode(bigInt.toByteArray())); } private static String encode(byte[] bigInt) throws UnsupportedEncodingException { return new String(new sun.misc.BASE64Encoder().encode(bigInt)); } private byte[] stripLeadingZeros(byte[] a) { int lastZero = -1; for (int i = 0; i < a.length; i++) { if (a[i] == 0) { lastZero = i; } else { break; } } lastZero++; byte[] result = new byte[a.length - lastZero]; System.arraycopy(a, lastZero, result, 0, result.length); return result; }