java BouncyCastle没有找到它提供的算法?

muk1a3rh  于 2022-12-10  发布在  Java
关注(0)|答案(4)|浏览(172)

令我惊讶的是,下面的代码片段中的catch-block经常被绊倒。

Security.addProvider(new BouncyCastleProvider());

final Set<String> found = new HashSet<String>();
final Set<String> missing = new HashSet<String>();

final DefaultSignatureAlgorithmIdentifierFinder finder = new DefaultSignatureAlgorithmIdentifierFinder();
for (Service service : new BouncyCastleProvider().getServices()) {
    if ("Signature".equals(service.getType())) {
        final String algorithm = service.getAlgorithm();
        try {
            finder.find(algorithm);
            found.add(algorithm);
        } catch (IllegalArgumentException ex) {
            missing.add(algorithm);
        }
    }
}

System.out.println("Found: " + found);
System.out.println("Missing: " + missing);

我似乎无法通过Finder使用大多数算法,即使存在提供这些算法的服务。我做错了什么?

  • Update* 为了更好地说明这个问题,我对代码做了一些修改。可能有意思的是,我使用的是JDK1.5版本的BouncyCastle。上面的代码给出了以下输出:

找到:[RIPEMD 256使用RSA加密,MD5使用RSA加密,MD 2使用RSA加密,SHA 384使用RSA加密,SHA 224使用ECDSA,SHA 384使用DSA,SHA 256使用DSA,SHA 512使用RSA加密,SHA 512使用DSA,RIPEMD 160使用RSA加密,SHA 224使用RSA加密,SHA 256使用ECDSA,RIPEMD 128使用RSA加密,SHA 384使用ECDSA,SHA 256使用RSA加密,SHA 512使用ECDSA,SHA1使用RSA加密,SHA 224使用DSA]
遗失:[带有ECNR的SHA1、不带有ECDSA的SHA 512、带有ECDSA的RIPEMD 160、RSA、GOST 3410、带有ECNR的SHA 256、带有RSA/ISO 9796 -2的MD5、带有CVC-ECDSA的SHA1、带有RSA/PSS的SHA 384、带有RSA/PSS的SHA1、带有RSA加密的MD 4、带有RSASSA-PSS的SHA 512、带有ECNR的SHA 256、带有RSA/ISO 9796 -2的SHA1、带有RSA/PSS的SHA 224、带有CVC-ECDSA的SHA 224、带有RAWRSASSA-PSS的SHA 224、带有RSA/PSS的SHA 256、不带有DSA的SHA 384、带有ECNR的RIPEMD 160、带有RSA/ISO 9796 -2的RIPEMD 160、DSA、ECGOST 3410、带有ECNR的SHA 224、1.2.840.113549.1.1.10]

0mkxixxg

0mkxixxg1#

我认为DefaultSignatureAlgorithmIdentifierFinder是bcmail API的一部分。它返回此API识别的算法标识符。(检查Cryptographic Message Syntax)另一方面,bouncy castle提供程序提供了更多的算法。您可以检查DefaultSignatureAlgorithmIdentifierFinder的源代码,其中识别的算法是硬编码的:

algorithms.put("MD2WITHRSAENCRYPTION", PKCSObjectIdentifiers.md2WithRSAEncryption);
algorithms.put("MD2WITHRSA", PKCSObjectIdentifiers.md2WithRSAEncryption);
algorithms.put("MD5WITHRSAENCRYPTION", PKCSObjectIdentifiers.md5WithRSAEncryption);
algorithms.put("MD5WITHRSA", PKCSObjectIdentifiers.md5WithRSAEncryption);
algorithms.put("SHA1WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha1WithRSAEncryption);
algorithms.put("SHA1WITHRSA", PKCSObjectIdentifiers.sha1WithRSAEncryption);
algorithms.put("SHA224WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha224WithRSAEncryption);
algorithms.put("SHA224WITHRSA", PKCSObjectIdentifiers.sha224WithRSAEncryption);
algorithms.put("SHA256WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha256WithRSAEncryption);
algorithms.put("SHA256WITHRSA", PKCSObjectIdentifiers.sha256WithRSAEncryption);
algorithms.put("SHA384WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha384WithRSAEncryption);
algorithms.put("SHA384WITHRSA", PKCSObjectIdentifiers.sha384WithRSAEncryption);
algorithms.put("SHA512WITHRSAENCRYPTION", PKCSObjectIdentifiers.sha512WithRSAEncryption);
algorithms.put("SHA512WITHRSA", PKCSObjectIdentifiers.sha512WithRSAEncryption);
algorithms.put("SHA1WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
algorithms.put("SHA224WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
algorithms.put("SHA256WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
algorithms.put("SHA384WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
algorithms.put("SHA512WITHRSAANDMGF1", PKCSObjectIdentifiers.id_RSASSA_PSS);
algorithms.put("RIPEMD160WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
algorithms.put("RIPEMD160WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd160);
algorithms.put("RIPEMD128WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
algorithms.put("RIPEMD128WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd128);
algorithms.put("RIPEMD256WITHRSAENCRYPTION", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
algorithms.put("RIPEMD256WITHRSA", TeleTrusTObjectIdentifiers.rsaSignatureWithripemd256);
algorithms.put("SHA1WITHDSA", X9ObjectIdentifiers.id_dsa_with_sha1);
algorithms.put("DSAWITHSHA1", X9ObjectIdentifiers.id_dsa_with_sha1);
algorithms.put("SHA224WITHDSA", NISTObjectIdentifiers.dsa_with_sha224);
algorithms.put("SHA256WITHDSA", NISTObjectIdentifiers.dsa_with_sha256);
algorithms.put("SHA384WITHDSA", NISTObjectIdentifiers.dsa_with_sha384);
algorithms.put("SHA512WITHDSA", NISTObjectIdentifiers.dsa_with_sha512);
algorithms.put("SHA1WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA1);
algorithms.put("ECDSAWITHSHA1", X9ObjectIdentifiers.ecdsa_with_SHA1);
algorithms.put("SHA224WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA224);
algorithms.put("SHA256WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA256);
algorithms.put("SHA384WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA384);
algorithms.put("SHA512WITHECDSA", X9ObjectIdentifiers.ecdsa_with_SHA512);
algorithms.put("GOST3411WITHGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
algorithms.put("GOST3411WITHGOST3410-94", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_94);
algorithms.put("GOST3411WITHECGOST3410", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
algorithms.put("GOST3411WITHECGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);
algorithms.put("GOST3411WITHGOST3410-2001", CryptoProObjectIdentifiers.gostR3411_94_with_gostR3410_2001);

干杯!干杯!

yks3o0rb

yks3o0rb2#

您是否已将BouncyCastle添加到安全提供程序中?您可以使用以下代码行完成此操作:

Security.addProvider(new BouncyCastleProvider());
tvokkenx

tvokkenx3#

这个答案与BouncyCastle没有直接关系。但是,我认为这对其他人会很有用:
在我的例子中,我使用的是SpongyCastle。我遇到了类似的问题:org.e.h.p:无法创建签名者:提供商SC未在org.e.h.a.a.a上提供SHA 256 WITHRSA(源文件:101)
原来proguard删除了一些必需的类。在proguard配置文件中添加以下内容后:- 保持类org.spongycastle.**{ *;}
问题已解决。

fwzugrvs

fwzugrvs4#

您可以通过两个步骤将Bouncy Castle添加到您的java平台上的安全提供程序中:

1.将BC库(当前为bcpkix-jdk15on-149.jar、bcprov-jdk15on-149.jar)复制到目录$JAVA_HOME/jre/lib/ext/
2.注册BC提供商:编辑文件$JAVA_HOME/jre/lib/security/java.security和下面的行

security.provider.1=sun.security.provider.Sun

添加您的BC提供商

security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

更改其余提供程序的数量。整个提供程序块应类似于:

security.provider.1=sun.security.provider.Sun
security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=com.sun.crypto.provider.SunJCE
security.provider.7=sun.security.jgss.SunProvider
security.provider.8=com.sun.security.sasl.Provider
security.provider.9=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.10=sun.security.smartcardio.SunPCSC

相关问题