Java中RSACryptServiceProvider.FromXmlString的等效项

Java中RSACryptServiceProvider.FromXmlString的等效项,java,rsa,private-key,sign,Java,Rsa,Private Key,Sign,我有XML格式的私钥,我将用该密钥对数据进行签名。在.Net中,您可以像这样以XML格式加载私钥 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); rsa.FromXmlString("<RSAKeyValue><Modulus>oQRshGhLf2Fh..."); Signature rsa = Signature.getInstance("SHA1withRSA"); rsa.initS

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

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString("<RSAKeyValue><Modulus>oQRshGhLf2Fh...");
Signature rsa = Signature.getInstance("SHA1withRSA");  
rsa.initSign(getPrivate(“<RSAKeyValue><Modulus>oQRshGhLf2Fh...”));
rsa.update(message.getBytes());
byte[] signed = rsa.sign();
rsacyptoserviceprovider rsa=新的rsacyptoserviceprovider();
rsa.FromXmlString(“oQRshGhLf2Fh…”);
Java中有类似的方法吗?如果没有,我会有什么选择

现在我的代码是这样的

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

Java没有对XML加密密钥的特定支持(可能在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();
import java.io.*;
导入java.math.*;
导入java.security.*;
导入java.security.spec.*;
导入javax.xml.bind.DatatypeConverter;
导入javax.xml.parsers.*;
导入org.w3c.dom.*;
字符串s=“idedxkixunqnh278qll8swyiqyy/fftd59kq6hdwxdapoxmykcsy+HTFbbLRb/bbjsmveessdbwevysedzx38qnwobmg1vtko8ph3x1dkvkt8zcbgkmbbt17dtbbe+b9zo6jqcn120qahc8rogc2kztm5nea3hnvswk=”
+“AQAB”
+“

1TmBWEl5DARzhcmaaLJELymx0Sw3xcdEqEi/2Niyrle1YCB0OQVHVYFBNXEGK81ZXOQKPmitno1YHZX7UIZW=” +“

O4TFYK9HE4UHALUGZX9WPFLX8NXSXCYXZV2EWCR1EXAMCA8WOWSYYDFZHUUGFKI02RTEQRUCTbJEQSU0PW=” +“IKzGSHxB43iPJ3JkiiS/VCbki/RLU5Y0ZEERV4QKG3RIHKQTHGVTWDWJSVEQ6GZVNSMJM8WTEQ0WOZVPEW=” +“UAn3GExwEqOTKDWAcZm6w5BeM6Xemj5HXWS2Lv8otDU6by9QcaH5BXgsnE3Y62ZPS8I9C8xBgT+SUlw+gBpF/Q=” +“lbcDsYsWBNg365eRqp8n8sGLR5gdG+SV5YUAZY+Bf1P2V9cpIm8YpVcUKZXkE5SwGub7p+mCQkAbaoT/pQyXOg=” +“FI82WA5DFWYV4J8EYMOD5V2K3W3DD3URK5D1TNMID1ZCPMCRPWNBQOPWA9FR+/T/7XiJLS4+R9LRTC0FSJN9MAEFOUV26RY3VQXYRLOBDSWMFUNZPMHD1EF1FKGTHWMMDIKYY5CY+lXEM/9VlexSKMxZc3Tor+v5SCB/k=” +""; DocumentBuilder db=DocumentBuilderFactory.newInstance().newDocumentBuilder(); //XML有许多可能的选项,但这里不需要 Element el=db.parse(新的ByteArrayInputStream(s.getBytes()).getDocumentElement(); //或其他来源,包括文件(如适用) 字符串[]名称={“模数”、“指数”、“D”、“P”、“Q”、“DP”、“DQ”、“InverseQ”}; BigInteger[]vals=新的BigInteger[names.length]; 对于(inti=0;i