java - 兼容 .Net 的 RSA key (XML 格式)

标签 java .net encryption rsa

如何生成应与 .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/

相关文章:

.net - GAC 中程序集的配置文件

php - 无法使密码加密工作 PHP

php - 在 PHP 中需要一个简单的散列

.NET - 当引用的 DLL 是项目引用时,将它们嵌入到 EXE 中

c# - C#获取登录SID的方法

Java加密: What seed to use in my AES/CBC/PKCS5Padding scenario

java - 将 EJB 3 session bean 注入(inject) struts 2 操作类

java - 在 Java 中验证日期字符串时出现异常

java - 在 Java 中向列表中添加值是否会复制数据或创建引用?

java - 如何比较存储在链表中的整数 - Java