Java 中没有开箱即用的支持,但它仍然相当微不足道。首先,您使用 JCA 生成一个 RSA 密钥对KeyPairGenerator
。
然后,您需要将私钥转换为适当的接口(我们使用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 元素之间的映射更加明显。