有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java BouncyCastle将自定义别名设置为算法

我在用Bouncy Castle验证签名摘要。 摘要算法是SHA1

不幸的是,摘要算法在签名中设置为SHA1 WithRSA(这不是摘要算法),而不仅仅是SHA1

对此我无能为力

现在我需要告诉Bouncy Castle,当它遇到SHA1和RSA时,使用SHA1作为摘要算法

是否可以添加一个别名来生成SHA1摘要算法

我试过这个:

BouncyCastleProvider bcp = new BouncyCastleProvider();
bcp.put("Alg.Alias.MessageDigest.SHA1WITHRSA", "SHA-1");
bcp.put("Alg.Alias.MessageDigest.1.2.840.113549.1.1.5", "SHA-1");
Security.addProvider(bcp);

MessageDigest.getInstance("SHA1WITHRSA", "BC"); // throws an exception
MessageDigest.getInstance("1.2.840.113549.1.1.5", "BC"); // throws an exception

但是没有成功。。 我正在学习java。安全没有任何算法例外

完整的堆栈如下所示:

no such algorithm: SHA1WITHRSA for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: SHA1WITHRSA for provider BC
    at sun.security.jca.GetInstance.getService(GetInstance.java:87)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
    at java.security.Security.getImpl(Security.java:698)
    at java.security.MessageDigest.getInstance(MessageDigest.java:227)
    at com.company.Main.testAddDigest(Main.java:82)
    at com.company.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

1.2.840.113549.1.1.5也是如此

no such algorithm: 1.2.840.113549.1.1.5 for provider BC
java.security.NoSuchAlgorithmException: no such algorithm: 1.2.840.113549.1.1.5 for provider BC
    at sun.security.jca.GetInstance.getService(GetInstance.java:87)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:206)
    at java.security.Security.getImpl(Security.java:698)
    at java.security.MessageDigest.getInstance(MessageDigest.java:227)
    at com.company.Main.testAddDigest(Main.java:95)
    at com.company.Main.main(Main.java:32)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)

RSA没有这样的摘要算法SHA1,因此抛出异常是正确的。 但我认为,通过添加“put”行,将添加别名,然后将SHA1 WithRSA识别为SHA1摘要算法

更新:当我使用特定的Provider实例时,它正在工作:

MessageDigest.getInstance("SHA1WITHRSA", bcp);

我不知道如何将别名添加到BC的所有实例中,而不仅仅是创建的bcp变量(BouncyCastleProvider)。如果可能的话


共 (1) 个答案

  1. # 1 楼答案

    要验证签名,只需使用以下代码

    Signature sig = Signature.getInstance("SHA1withRSA", "BC");
    sig.initVerify(publicKey);
    sig.update(data)
    boolean verifies = sig.verify(sigToVerify);
    

    你把签名算法和摘要算法搞混了SHA1withRSA是一种签名算法。这意味着数字签名操作使用SHA1摘要算法执行数据哈希,然后执行RSA加密

    因此MessageDigest.getInstance("SHA1WITHRSA", "BC");上的java.security.NoSuchAlgorithmException是预期的行为,因为SHA1withRSA不是摘要算法

    编辑

    如果你想知道签名算法的摘要算法,你可以使用BouncyCastle的finders

    AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find(signatureAlgorithm);
    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
    String digestAlgOID = digAlgId.getAlgorithm().getId();
    MessageDigest.getInstance(digestAlgOID);