当前位置: 首页 > 面试题库 >

将.Net RSA xml密钥移植到Java

邵诚
2023-03-14
问题内容

我有.Net系统中xml格式的私钥和公钥。我必须使用此密钥在Java中执行加密/解密。有什么办法吗?

公钥看起来像这样:

<RSAKeyValue>
    <Modulus>jHIxcGzzpByFv...pvhxFnP0ssmlBfMALis</Modulus>
    <Exponent>AQAB</Exponent>
</RSAKeyValue>

私钥:

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

我已经写了一些代码来加密数据,但是我不确定它是否正确。

        Element modulusElem = root.getChild("Modulus");
        Element exponentElem = root.getChild("Exponent");

        byte[] expBytes = decoder.decodeBuffer(exponentElem.getText().trim());
        byte[] modBytes = decoder.decodeBuffer(modulusElem.getText().trim());

        RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(1, modBytes), new BigInteger(1, expBytes));
        KeyFactory fact = KeyFactory.getInstance("RSA");
        PublicKey pubKey = fact.generatePublic(keySpec);

如何从xml制作私钥以解密数据?


问题答案:

decoder在您的示例中,这是进行Base64解码吗?看起来您可能正在依赖sun.misc.BASE64Decoder它,并且依赖那些内部类通常不是一个好主意(例如,其他JVM不会拥有它)。您可以使用具有Base64类进行解码的Apache
Commons Codec
。这是RSA加密和解密所需要的其余内容:

byte[] expBytes = Base64.decodeBase64(exponentElem.getText().trim()));
byte[] modBytes = Base64.decodeBase64(modulusElem.getText().trim());
byte[] dBytes = Base64.decodeBase64(dElem.getText().trim());

BigInteger modules = new BigInteger(1, modBytes);
BigInteger exponent = new BigInteger(1, expBytes);
BigInteger d = new BigInteger(1, dBytes);

KeyFactory factory = KeyFactory.getInstance("RSA");
Cipher cipher = Cipher.getInstance("RSA");
String input = "test";

RSAPublicKeySpec pubSpec = new RSAPublicKeySpec(modules, exponent);
PublicKey pubKey = factory.generatePublic(pubSpec);
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] encrypted = cipher.doFinal(input.getBytes("UTF-8"));
System.out.println("encrypted: " + new String(encrypted));

RSAPrivateKeySpec privSpec = new RSAPrivateKeySpec(modules, d);
PrivateKey privKey = factory.generatePrivate(privSpec);
cipher.init(Cipher.DECRYPT_MODE, privKey);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println("decrypted: " + new String(decrypted));


 类似资料:
  • 想要在java中使用生成的RSA公钥,在c#函数中加密数据并在Java解密函数中解密。 生成的Java公钥已被替换为c#中的模数标记: C#加密功能: Java解密函数: 第一个问题:在c#XML字符串中替换模数标记中的Java公钥正确吗?指数标签呢?我用了AQAB值。 第二个问题:为什么在解密Java得到这个错误: 经过一些研究,我发现这是一个普遍的错误,什么原因会导致这种错误?

  • 这里是一个JavaScript部分,它用AES加密解码字符串 我试图用python编写一个类似的解码函数,并导入AES。 谁能帮我做这个吗。我无法找出js到python的所有等效代码。 我查了这个页面Python AES解密例程(代码帮助)和 AES-加密与加密(node-js)/解密与Pycrypto(python) 不确定他们的代码是否与我这里的js相似 这在python中是什么意思 我从另一

  • null Edit2:为了一致性和正确性,将填充重命名为iVector。

  • 问题内容: 我已经尝试将invRegex.py移植到node.js实现了一段时间,但是我仍然在努力。多亏了ret.js标记生成器,我已经有了正则表达式分析树,并且运行良好,但是以内存高效的方式实际生成和连接所有不同元素对我来说是非常具有挑战性的。为简单起见,可以说我有以下正则表达式: 喂养到产生下列输出( tabbified 取更小的空间): 考虑到我能够获取每个单独的令牌并产生所有有效的单独输出

  • 问题内容: SqlCommand.ExecuteScalar方法 执行查询,并返回查询返回的结果集中第一行的第一列。其他列或行将被忽略。 我猜这将涉及大量使用泛型。 假设我有一个SQLiteDatabase / Cursor对象。 问题答案: 这种逻辑对我有用:

  • 我开始转换所有64位,并注意Mac汇编语法。 我有东西要组装,但我立即遇到了一个奇怪的分段错误: QUIT通过宏defword定义如下: null 附注:是的,我可以让琼斯在Docker图像中完美地工作,但这是重点之外的。我真的希望它在卡特琳娜64位工作,开箱即用。