Java Bouncy Castle Sha3输出错误?

Java Bouncy Castle Sha3输出错误?,java,hash,bouncycastle,sha-3,Java,Hash,Bouncycastle,Sha 3,我正在从事一个JAVA项目,该项目需要执行sha3-256哈希。 因为Bouncy Castle在其最新更新中实现了Sha3,所以我计划使用它们的实现。这是我的密码: public static String sha3(final String input) { String hash = ""; final SHA3.DigestSHA3 md = new SHA3.DigestSHA3(256); md.update(input.getBytes());

我正在从事一个JAVA项目,该项目需要执行sha3-256哈希。 因为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(“”),我得到以下输出:

C5D2460186F7233C927E7DB2DC703C0E500B653CA82273B7BFAD8045D85A470

当我从以下位置搜索基本sha3输出时: 维基百科:
或 NIST标准: ,看来我应该得到:

a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

我的密码有错误吗?bouncy castle的输出和NIST的输出之间有联系吗?bouncy castle的实现会有错误吗


谢谢您的时间和问候。

我想您的
main逻辑有误2.toString
。而
Main2.toString
应将
字节[]
转换为十六进制字符串

以下是一个实现:

final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return new String(hexChars);
}
final protected static char[]hexArray=“0123456789ABCDEF.tocharray();
公共静态字符串bytesToHex(字节[]字节){
char[]hexChars=新字符[bytes.length*2];
对于(int j=0;j>>4];
hexChars[j*2+1]=hexArray[v&0x0F];
}
返回新字符串(hexChars);
}
我已尝试了您的代码,输出为:

A7FFC6F8BF1ED76651C14756A061D662F580FF4DE43B49FA82D80A4B80F8434A

/**
*陈中普于2015年10月19日创作。
*/
导入org.bouncycastle.jcajce.provider.digest.*;
公共类TestSHA3{
最终受保护的静态字符[]hexArray=“0123456789ABCDEF”.toCharArray();
公共静态字符串bytesToHex(字节[]字节){
char[]hexChars=新字符[bytes.length*2];
对于(int j=0;j>>4];
hexChars[j*2+1]=hexArray[v&0x0F];
}
返回新字符串(hexChars);
}
公共静态字符串sha3(最终字符串输入){
字符串哈希=”;
SHA3.DigestSHA3 md=新的SHA3.DigestSHA3(256);
md.update(input.getBytes());
hash=bytesToHex(md.digest());
返回散列;
}
公共静态void main(字符串[]args){
系统输出打印项次(sha3(“”);
}
}

应正确计算SHA3

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

  • 您尚未提供
    Main2.toString(字符串)
以下内容将字节散列并转换为十六进制字符串:

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();
    }
}
输出
我在Maven构建中使用了以下工件


org.bouncycastle
bcprov-jdk15on
1.53

弹跳城堡库版本的问题 如果您正在使用bouncy castle 1.50库(输入:SHA3-256(“”)) bouncy的输出与NIST的输出不匹配

使用bouncy castle 1.54版本bouncy的输出等于NIST示例值(中的示例值)


谢谢

无需创建自定义方法将byteArray转换为字符串,请使用内置函数

public static String hashPassword(String password) {

    DigestSHA3 md = new DigestSHA3(256);
    md.update(password.getBytes());
    byte[] digest = md.digest();
    return Hex.toHexString(digest);
}
maven条目是

    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.56</version>
    </dependency>

org.bouncycastle
bcprov-jdk15on
1.56

蹦蹦跳跳城堡的版本是什么?谢谢陈中普。我用你的版本更新了我的pom文件,现在它工作得很好。我以前使用过:org.bouncycastle bcprov-jdk14 1.49 jar Thanksha3-512在1.50中也受影响
public static String hashPassword(String password) {

    DigestSHA3 md = new DigestSHA3(256);
    md.update(password.getBytes());
    byte[] digest = md.digest();
    return Hex.toHexString(digest);
}
    <!-- https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on -->
    <dependency>
        <groupId>org.bouncycastle</groupId>
        <artifactId>bcprov-jdk15on</artifactId>
        <version>1.56</version>
    </dependency>