java - Java 中 RSACryptoServiceProvider.FromXmlString 的等效项

标签 java rsa private-key sign

我有 XML 格式的私钥,我将使用该 key 对我的数据进行签名。在 .Net 中,您可以像这样以 XML 格式加载您的私钥

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString("<RSAKeyValue><Modulus>oQRshGhLf2Fh...");

Java中有类似的方法吗?如果没有,我还有什么选择?

现在我的代码看起来像这样

Signature rsa = Signature.getInstance("SHA1withRSA");  
rsa.initSign(getPrivate(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”));
rsa.update(message.getBytes());
byte[] signed = rsa.sign();

最佳答案

Java 没有对 XML 加密 key 的特定支持(可能在 XMLDSIG 中除外?),但它对 XML 总体上有相当广泛的支持。我不做 dotnet,而且你们不提供测试数据,所以我不得不弥补一些,但我认为以下内容会起作用:

import java.io.*;
import java.math.*;
import java.security.*;
import java.security.spec.*;
import javax.xml.bind.DatatypeConverter;
import javax.xml.parsers.*;
import org.w3c.dom.*;

String s = "<RSAKeyValue><Modulus>iDedXXkixunqnh278qUll8sWYIqyy/FfTd59kq6HDwXDapOXmYKkcsy+HTFbbLRb/bbJsMVEessdbwEVysedzx38QnWOBmGmY1VTKO8Ph3X1dkVktMT8zCbgKMBBT17dTbBE+B9zO6jqcN120qaHc8rOGC2KztM5xnEa3hNvSwk="
        +"</Modulus><Exponent>AQAB"
        +"</Exponent><P>1TmBWEl5DARzhcmaaLJELymx0Sw3xcdEqEi/2nnIYrLE1YCb0OQVHvyFBBnXEgk81zxoqkPmItNO1yHzX7UIzw=="
        +"</P><Q>o4tFYK9HE4UhaLUGzx9WpFlX8NXsXcYxzV2ewCR1EXaMCA8xowSyyDfzhUugfKI02rTeQRucTnuttbJEQsu0pw=="
        +"</Q><DP>IKzGSHxB43iPJ3JkiiS/VCbki/Rlu5Y0zEERvW4qKg3RIhKqThGVtwDldWJsVeQ6gZVNSMJM8wtEqq0WOZVpew=="
        +"</DP><DQ>UAn3GExwEqOTKDWAcZm6w5BeM6Xemj5HXWS2Lv8otDU6by9QcaH5BXgsnE3Y62ZPS8I9C8xBgT+SUlw+gBpF/Q=="
        +"</DQ><InverseQ>lbcDsYsWBNg365eRqp8n8sGLR5gdG+SV5YUAZY+Bf1P2V9cpIm8YpVcUKZXkE5SwGub7p+mCQkAbaoT/pQyXOg=="
        +"</InverseQ><D>fi82wa5DfwyV4J8eymod5v2k3w3dD3urk5D1tnmid1IZcpMCrpwNBqOPwa9FR+/T/7XiJLS4+R9LRtc0fsJn9maEfUV26ry3vqQXYRlobdsWMFuNZPmHD1S7ef1fkGthDGWMmdiKyyy5Cy+lXEM/9VlexSKMxZc3Tor+v5SCB/k="
        +"</D></RSAKeyValue>";

DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
// there are many options possible for XML but not needed here
Element el = db.parse(new ByteArrayInputStream (s.getBytes())).getDocumentElement();
// or other source including file if applicable
String[] names = {"Modulus", "Exponent", "D", "P", "Q", "DP", "DQ", "InverseQ"};
BigInteger[] vals = new BigInteger [names.length];
for( int i = 0; i < names.length; i++ ){ 
    String v = el.getElementsByTagName(names[i]).item(0).getTextContent();
    vals[i] = new BigInteger(1, DatatypeConverter.parseBase64Binary(v));
}
PrivateKey pk = KeyFactory.getInstance("RSA").generatePrivate(
        new RSAPrivateCrtKeySpec (vals[0], vals[1], vals[2], vals[3], vals[4], vals[5], vals[6], vals[7]) );
//
Signature si = Signature.getInstance("SHA1withRSA");
si.initSign(pk); si.update("foobar\r\n".getBytes()); byte[] ss = si.sign();

关于java - Java 中 RSACryptoServiceProvider.FromXmlString 的等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49470312/

相关文章:

java - 如何在 Clojure 中创建一个原始的二维 (2d) double 组?

java - JSF 2.0 禁止在 actionListener 中验证失败后调用操作

java - Java 中 3DES 与 RSA 的 key 交换

java - 使用java在文件中嵌入签名

algorithm - 有没有公​​钥/私钥的快速简单的加密算法?

java - 使用 Mockito 测试增强的 Java 行为

java - 服务器端的响应式 Web 模式

java - Android 中的 RSA 加密

git - 加载我的私钥以用于 Mac 上的 git

ssh - vagrant 自定义 ssh key 认证失败