gpt4 book ai didi

java - Sha256 不提供 16 字节数组

转载 作者:行者123 更新时间:2023-11-30 07:09:26 25 4
gpt4 key购买 nike

我使用以下方法为 aes 加密生成密码。

我的 aes 需要 16 个字节的 key 。

这是我如何获得我的 key

    public  byte[] sha256digest16(String[] list) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
for(String s: list){
digest.update(s.getBytes("UTF-8"));
}
byte[] b = digest.digest();

return String.format("%0" + (b.length) + 'x', new BigInteger(1, b)).getBytes("UTF-8");

}

但是,它是64字节。我怎样才能让这个方法返回一个 16 字节的字符串

编辑我这样做的主要原因是因为我的 python 代码是

from Crypto.Hash import SHA256


myHash = SHA256.new()
myHash.update("265jMeges")
print myHash.hexdigest()

输出

917ef7e7be4a84e279b74a257953307f1cff4a2e3d221e363ead528c6b556edb

java的输出在哪里

efbfbd7eefbfbdefbfbd4aefbfbdefbfbd79efbfbd4a257953307f1cefbfbd4a2e3d221e363eefbfbd52efbfbd6b556eefbfbd

对于同一个字符串。它们为什么不同?

最佳答案

SHA-256 默认返回 32 个字节 (256/8 = 32),而不是 16。使用散列的一部分的正常方法是使用散列的前(最左边)16 个字节结果哈希。您可以通过应用 Java copyOf SHA-256结果的方法。

请使用真正的十六进制编码器来显示结果(不是返回值,您根本不需要任何String 实例)。使用 BigInteger 容易出错,可能会添加或删除字节。

例如尝试:

public static byte[] sha256digest16(String[] list) throws NoSuchAlgorithmException, UnsupportedEncodingException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
for(String s: list){
digest.update(s.getBytes("UTF-8"));
}

// so you have 32 bytes here
byte[] b = digest.digest();

// you can return it directly or you can cut it to 16 bytes
return Arrays.copyOf(b, 16);
}

要显示为十六进制,请使用:

public static String tohex(byte[] data) {
StringBuilder sb = new StringBuilder(data.length * 2);
for (int i = 0; i < data.length; i++) {
sb.append(String.format("%02X", data[i] & 0xFF));
}
return sb.toString();
}

或者使用 Apache 通用编解码器、Bouncy CaSTLe 或 Guava 的十六进制编码器之一。

关于java - Sha256 不提供 16 字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23130255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com