简体   繁体   中英

RSA Key pair Exception on importing the private key

I am new to RSA and Cryptography and i need to encrypt and decrypt data using RSA, I have a java program which generates a key pair and save them in a .key files with XML format (It is absolutely OK and it was tested by encrypting and decrypting data ), then I want to use them in .NET application , I am importing the keys to be used for encrypt and decrypt. The public key is OK and encryption getting done without problem but the private key Import fails with the following exception message

Bad data (CryptographicException.ThrowCryptogaphicException(Int32 hr))

This is the encoded public key:

<RSAKeyValue>
<Modulus>iFouk9viRs5dcvJCvDM1vXC4sBuSB9SPcdJhRyFLoNW/pka6MNAiu4cOksFRejiuM1ZswyJMy+ow
lmLflJ/XrfnUQxLwLp61oij4CrzHKl9jjHorqIA7uEQKY8RBiUjZ7kbO5nFaIWs1NWMVks8Srdhv
8pVd1sLKKUs66c/ndAk=</Modulus>
<Exponent>AQAB</Exponent>
</RSAKeyValue>

and this is the encoded 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 to understand what is happening and what's wrong with the private key.

this is the code that is working ok 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;
}

The public key is OK and encryption getting done without problem but the private key Import fails with the following exception message

Bad data (CryptographicException.ThrowCryptogaphicException(Int32 hr))

Take a look at Cryptographic Interoperability: Keys under "Common Errors" sections. The ones that still remain engrained in my mind:

  • Wrong KeyNumber or KeyUsage
  • Wrong Cryptographic Service Provider
  • Correct Cryptographic Service Provider, wrong ProviderType
  • Cryptographic Service Provider does not support the key size
  • Leaging 0's in the byte array such that the array has one too many octets

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM