字符串转换为字节再转换为大整数的反向操作错误

3

我正在尝试将哈希转换为大整数,以便进行一些计算。在这方面,我成功了,但另一方面,我需要能够将大整数转换回哈希以进行验证。但我无法成功地进行转换,请参考下面的代码和输出。请给出建议并提供帮助。

以下是代码:

//convert hash to bytes then to big int to mod pow
BigInteger hashy = new 
BigInteger(hash.getBytes(StandardCharsets.ISO_8859_1));
System.out.println("hashy: " +hashy);
//test if convert back to big int works
String convertedBackHash = (hashy.toByteArray()).toString();                
System.out.println("hash to hashy to hash: " + convertedBackHash);

这是输出结果

hash: d1bb961ac85f6d9ae66b469b5cabe83f9f88e4ee
hashy: 835979497806227327262557895525398820611883198135120938003873334575862278693562754177889725605221
hash to hashy to hash: [B@60e53b93

有人知道出了什么问题吗?
2个回答

0
String convertedBackHash = (hashy.toByteArray()).toString();                

您正在使用 Array#toString 方法,该方法将数组对象表示为十六进制格式。

如果您想将字节转换为字符串

String result = new String(hashy.toByteArray());  
System.out.println("hash to hashy to hash: " + result);

谢谢,你的方法有效!但是你介意解释一下为什么我的方法不起作用吗?因为从我的角度来看,我的步骤不是和你一样吗?我将我的大整数转换为字节数组,然后在字节数组上使用了 .toString()。但是对于你的方法,你创建了一个包含大整数字节数组的新字符串?这不是通常都是一样的吗?请给予建议。 - user6235245
看看你的 [B@60e53b93,你正在使用错误的 toString() 方法。你得到了二进制数组 B 在内存中的十六进制地址 @ - rossum
这直接解决了哈希字符串无法正确打印的问题,但它并没有处理十六进制格式的哈希问题,也没有处理可能导致哈希字符串过大或过小的零填充问题。 - Maarten Bodewes
他没有使用 Array.toString(),也不是“以十六进制格式表示数组对象”。他正在使用从 Object.toString() 继承的 byte[].toString(),它返回对象的类,后跟其十六进制的 hashCode() - user207421
@EJP 这就是问题所在,我是在评论答案。阅读我的答案以了解我在谈论什么。将十六进制转换为ASCII,然后再转换为整数是没有意义的。当然,将其转换回来存在问题也是一个问题,但我认为这不是主要问题。 - Maarten Bodewes

0

在加密函数中,通常需要将字节数组(哈希)转换为整数,然后再转换回来。这可以通过将字节数组视为定长、无符号、大端整数来完成。

例如,PKCS#1规定了RSA计算的方式,其中OS2IP(八位字节串到整数原语)将字节数组转换为整数,而I2OSP(整数到八位字节串原语)则将整数转换回八位字节串。八位字节串只是一个字节数组。这两个函数都不是特别难以实现,但Java没有内置这些函数(提示!),而且Java不能调整数组大小,这使得I2OSP比您预期的更棘手。幸运的是,我已经在这里提供了答案——我花了一些时间才找到它。

现在你的输入哈希值似乎是十六进制编码的。这不是你想要转换为整数的方式。你需要将字节数组所代表的字节转换为整数。因此,你首先需要对字节进行十六进制解码。有许多库实现了十六进制编码,这里在Stackoverflow上也有答案。相反,在执行I2OSP操作后,如果你想查看它们,则需要将字节重新编码为十六进制。这样,你只需处理半大小的整数。

所以,BigInteger i = os2ip(Hex.decode(hashString)),然后使用i进行处理,当你再次得到它时,String hashString = Hex.encodeToString(i2osp (i))


感谢Maarten深入解答问题,这真的很有帮助。也感谢Suresh尝试解决问题!向你们俩竖起大拇指!!! - user6235245

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接