Java 中没有开箱即用的支持,但它仍然相当简单。首先,您使用 JCA KeyPairGenerator 生成一个 RSA 密钥对。
然后,您需要将私钥转换为适当的接口(我们使用RSAPrivateCrtKey 而不是RSAPrivateKey,因此我们可以访问 CRT 部分),并使用 Apache Commons Codec 进行 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 元素之间的映射更加明显。