2

为了简短起见,我的问题如下:

我在函数的开头添加了 BC-Provider:

Security.addProvider(new BouncyCastleProvider());

当我列出所有服务时

BouncyCastleProvider().getServices();

该列表包含“RIPEMD160WITHECDSA”

在此代码段的最后一行:

XMLSignatureFactory factory = XMLSignatureFactory.getInstance("DOM");
DOMValidateContext valContext = new DOMValidateContext(pubkeys[i], sigElement);
valContext.setURIDereferencer(new FileDereferencer(
                              factory.getURIDereferencer(), new File("D:\\eclipseworkspace\\pathtoxml.xml")));
javax.xml.crypto.dsig.XMLSignature xmlSignature = factory.unmarshalXMLSignature(valContext);

我收到一条消息异常:

不支持的 SignatureMethod 算法:http ://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160

这意味着什么?RIPEMD160WITHECDSA 与此 URL 指定的算法有什么区别?或者 url 只是没有映射到这个算法名?

这是堆栈跟踪:

javax.xml.crypto.MarshalException: unsupported SignatureMethod algorithm: http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160
    at org.jcp.xml.dsig.internal.dom.DOMSignatureMethod.unmarshal(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMSignedInfo.<init>(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignature.<init>(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshal(Unknown Source)
    at org.jcp.xml.dsig.internal.dom.DOMXMLSignatureFactory.unmarshalXMLSignature(Unknown Source)
    at com.mobile.xmlsignature.XMLSigChecker.verify(XMLSigChecker.java:122)
    at com.mobile.xmlsignature.mainclass.main(mainclass.java:13)
4

1 回答 1

4

看起来ecdsa-ripemd160不是使用DOMSignatureMethod注册的默认签名方法之一。

根据XMLSignatureFactory.newSignatureMethod()您可能可以使用以下方式注册ecdsa-ripemd160

xmlFact.newSignatureMethod(
    "http://www.w3.org/2007/05/xmldsig-more#ecdsa-ripemd160", 
     MyECDSARipemd160Provider());

您将不得不滚动您自己的MyECDSARipemd160Provider()类来实现SignatureMethodParameterSpec,并且它需要识别您的算法。我还没有尝试过,我怀疑它可能需要一些试验和错误。我不知道是否有一个BC班可以为你做这件事。我假设对此类的getAlgorithm()调用应返回“RIPEMD160WITHECDSA”。

于 2012-08-23T01:36:37.157 回答