RSA密钥(XML格式)对于.NET兼容密钥、格式、RSA、NET

2023-09-04 13:40:18 作者:浪漫,她,我,爱

如何生成基于XML的RSA密钥(私有,公共),这应该是.NET环境兼容。我试图phpseclib模块在PHP。但它不是为.NET兼容。请给我建议任何方式来生成基于RSA密钥的Java的XML?其实我工作的基于Linux的系统。使用这些按键,我要执行加密和解密操作。 像

 < RSAKeyValue>
    <模量GT; 4hjg1ibWXHIlH ... ssmlBfMAListzrgk =< /模量>
    <指数> AQAB< /指数>
    &其中p为H.; 8QZCtrmJcr9uW7VRex + DIH ... jLHV5StmuBs1 + vZZAQ ==&所述; /差异无显着
    < Q> 8CUvJTv ... yeDszMWNCQ ==< / Q>
    < D​​P> elh2Nv ... cygE3657AQ ==< / DP>
    < D​​Q> MBUh5XC ... + PfiMfX0EQ ==< / DQ>
    < InverseQ> oxvsj4WCbQ .... LyjggXg ==< / InverseQ>
    &其中d取代; KrhmqzAVasx ... uxQ5VGZmZ6yOAE =&其中; / d取代;
< / RSAKeyValue>
 

解决方案

有这种不支持了Java中的方块,但它仍然是相当微不足道。首先,你生成使用JCA 的KeyPairGenerator RSA密钥对。

然后,你需要转换的私有密钥到合适的接口(我们使用 RSAPrivateCrtKey 而不是 RSAPrivateKey 等等我们可以访问CRT部分),并使用Apache共享codeC为Base64编码。

 公共静态无效的主要(字串[] args)抛出异常{
    KeyPairGenerator的keyPairGen = KeyPairGenerator.getInstance(RSA);
    密钥对密钥对= 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的建设者=新的StringBuilder();
    builder.append(< RSAKeyValue> \ N);
    写(建设者,模,N);
    写(建设者,指数,E);
    写(建设者,P,P);
    写(建造者,Q,Q);
    写(建设者,DP,DP);
    写(建设者,DQ,DQ);
    写(建设者,InverseQ,inverseQ);
    写(建设者,D,D);
    builder.append(&所述; / RSAKeyValue>中);

    的System.out.println(builder.toString());
}

私有静态无效写入(StringBuilder的建设者,字符串变量,BigInteger的BIGINT){
    builder.append(\ T<);
    builder.append(标签);
    builder.append(>中);
    builder.append(EN code(BIGINT));
    builder.append(&所述; /);
    builder.append(标签);
    builder.append(> \ N);
}

私有静态字符串连接code(BigInteger的BIGINT){
    返回新的String(Base64.en codeInteger(BIGINT),ASCII);
}
 

您可以用适当的XML API,如果你愿意,但我觉得没有令人信服的理由不使用的StringBuilder 在这种情况下。此外,随意内联的BigInteger 实例。我声明他们作为变量,以使Java方法和XML元素之间的映射更加明显。

移动勒索软件 又双叒叕 来了

How to generate xml based RSA keys ( private ,public ) which should be compatible for .NET environment. I tried phpseclib module in PHP. But it is not compatible for .NET. Please suggest me any way to generate the xml based RSA keys in Java ? Actually I am working on linux based system. Using these keys I am going to perform encryption and decryption operation. Like

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

解决方案

There's no support for this out of the box in Java, but it's still fairly trivial. First off, you generate an RSA key pair using the JCA KeyPairGenerator.

Then, you need to cast the private key to the appropriate interface (we use RSAPrivateCrtKey instead of RSAPrivateKey so we can access the CRT parts), and using Apache Commons Codec for Base64 encoding.

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

You can use a proper XML API if you're so inclined, but I felt no compelling reason not to use StringBuilder in this case. Also, feel free to inline the BigInteger instances. I declared them as variables to make the mapping between Java methods and XML elements more obvious.