繁体   English   中英

RSA密钥对导入私钥时的异常

[英]RSA Key pair Exception on importing the private key

我是RSA和Cryptography的新手,我需要使用RSA加密和解密数据,我有一个java程序,它生成一个密钥对并将它们保存在XML格式的.key文件中(绝对可以,它通过加密测试)和解密数据),然后我想在.NET应用程序中使用它们,我正在导入用于加密和解密的密钥。 公钥正常,加密完成没有问题,但私钥导入失败,出现以下异常消息

Bad data (CryptographicException.ThrowCryptogaphicException(Int32 hr))

这是编码的公钥:

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

这是编码的公钥:

<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>

请帮助我了解私钥发生了什么以及发生了什么问题。

这是解决问题后正常工作的代码:

 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;
}

公钥正常,加密完成没有问题,但私钥导入失败,出现以下异常消息

错误的数据(CryptographicException.ThrowCryptogaphicException(Int32 hr))

请查看“常见错误”部分下的“ 加密互操作性:密钥 ”。 仍然留在我心中的那些:

  • KeyNumber或KeyUsage错误
  • 错误的加密服务提供商
  • 正确的加密服务提供程序,错误的ProviderType
  • 加密服务提供商不支持密钥大小
  • 在字节数组中使用0,使得数组有一个太多的八位字节

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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