конечно нужен весь xml, иначе никак.
для работы с xml-dsig используется apache xml-security, который идет в составе sdk
примеров в интернете куча, ничего сложного
ну примерно как-то так, взято из разных кусков:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
DocumentBuilder documentBuilder = dbf.newDocumentBuilder();
Document doc = documentBuilder.parse(new ByteArrayInputStream(xml.getBytes(encoding)));
String xmlSign = signXml(doc, privateKey, cert);
String signMethod;
String digestMethod;
if ((privateKey.getAlgorithm().toUpperCase().compareTo("ECGOST3410") == 0)
|| (privateKey.getAlgorithm().toUpperCase().compareTo("ECGOST34310") == 0)) {
signMethod = "http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311";
digestMethod = "http://www.w3.org/2001/04/xmldsig-more#gost34311";
} else {
signMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha1";
digestMethod = "http://www.w3.org/2001/04/xmldsig-more#sha1";
}
XMLSignature sig = new XMLSignature(doc, "", signMethod);
String res = "";
if (doc.getFirstChild() != null) {
doc.getFirstChild().appendChild(sig.getElement());
Transforms transforms = new Transforms(doc);
transforms.addTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature");
transforms.addTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments");
sig.addDocument("", transforms, digestMethod);
sig.addKeyInfo((X509Certificate) cert);
sig.sign(privateKey);
StringWriter os = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
os.close();
res = os.toString();