如何生成应与 .NET 环境兼容的基于 xml 的 RSA key (私有(private)、公共(public))。我在 PHP 中尝试了 phpseclib 模块。但它与 .NET 不兼容。请建议我用 Java 生成基于 xml 的 RSA key 的任何方法?实际上我正在研究基于 linux 的系统。我将使用这些 key 执行加密和解密操作。 喜欢
<RSAKeyValue>
<Modulus>4hjg1ibWXHIlH...ssmlBfMAListzrgk=</Modulus>
<Exponent>AQAB</Exponent>
<P>8QZCtrmJcr9uW7VRex+diH...jLHV5StmuBs1+vZZAQ==</P>
<Q>8CUvJTv...yeDszMWNCQ==</Q>
<DP>elh2Nv...cygE3657AQ==</DP>
<DQ>MBUh5XC...+PfiMfX0EQ==</DQ>
<InverseQ>oxvsj4WCbQ....LyjggXg==</InverseQ>
<D>KrhmqzAVasx...uxQ5VGZmZ6yOAE=</D>
</RSAKeyValue>
最佳答案
在 Java 中没有开箱即用的支持,但它仍然相当微不足道。首先,您使用 JCA KeyPairGenerator
生成一个 RSA key 对。
然后,您需要将私钥转换为适当的接口(interface)(我们使用 RSAPrivateCrtKey
而不是 RSAPrivateKey
以便我们可以访问 CRT 部分),并使用 Apache Commons Base64编码的编解码器。
public static void main(String[] args) throws Exception {
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
KeyPair keyPair = keyPairGen.genKeyPair();
RSAPrivateCrtKey privKey = (RSAPrivateCrtKey) keyPair.getPrivate();
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", n);
write(builder, "Exponent", e);
write(builder, "P", p);
write(builder, "Q", q);
write(builder, "DP", dp);
write(builder, "DQ", dq);
write(builder, "InverseQ", inverseQ);
write(builder, "D", d);
builder.append("</RSAKeyValue>");
System.out.println(builder.toString());
}
private static void write(StringBuilder builder, String tag, BigInteger bigInt) {
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) {
return new String(Base64.encodeInteger(bigInt), "ASCII");
}
如果您愿意,可以使用适当的 XML API,但我觉得在这种情况下没有不使用 StringBuilder
的令人信服的理由。此外,您可以随意内联 BigInteger
实例。我将它们声明为变量,以使 Java 方法和 XML 元素之间的映射更加明显。
关于java - 兼容 .Net 的 RSA key (XML 格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12512455/