我正在一个需要执行 sha3-256 哈希的JAVA项目中。
由于Bouncy Castle在其最新更新中实现了Sha3,因此我计划使用它们的实现。这是我的代码:

 public static String sha3(final String input) {

    String hash = "";

    final SHA3.DigestSHA3 md = new SHA3.DigestSHA3(256);
    md.update(input.getBytes());
    hash = Main2.toString(md.digest());

    return hash;
  }

运行System.out.println(Main2.sha3(""));时,得到以下输出:

C5D2460186F7233C927E7DB2DCC703C0E500B653CA82273B7BFAD8045D85A470

当我从以下目录搜索基本sha3输出时:
维基百科:https://en.wikipedia.org/wiki/SHA-3
要么
NIST标准:http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA3-256_Msg0.pdf
,看来我应该获得:

a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

我的代码有什么错误吗?充气城堡的输出与NIST的输出之间有任何联系吗?充气城堡的实施会不会有错误?

感谢您的宝贵时间和问候。

最佳答案

您的SHA3应该正确计算。

您的问题中的代码有问题:

  • 您尚未提供Main2.toString(String)

  • 以下哈希将字节转换为十六进制字符串:
    import java.security.MessageDigest;
    
    import org.bouncycastle.jcajce.provider.digest.SHA3.DigestSHA3;
    import org.bouncycastle.jcajce.provider.digest.SHA3.Digest256;
    
    public class TestSha3 {
        public static void main(String[] args) {
            System.out.println(sha3(""));
        }
    
        public static String sha3(final String input) {
            final DigestSHA3 sha3 = new Digest256();
    
            sha3.update(input.getBytes());
    
            return TestSha3.hashToString(sha3);
        }
    
        public static String hashToString(MessageDigest hash) {
            return hashToString(hash.digest());
        }
    
        public static String hashToString(byte[] hash) {
            StringBuffer buff = new StringBuffer();
    
            for (byte b : hash) {
                buff.append(String.format("%02x", b & 0xFF));
            }
    
            return buff.toString();
        }
    }
    

    输出量
    a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a
    

    我在Maven构建中使用了以下工件

    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.53</version>
    </dependency>
    

    08-25 02:54