Java 字符串到字节到大整数的转换,反之亦然错误

Java 字符串到字节到大整数的转换,反之亦然错误,java,cryptography,byte,biginteger,Java,Cryptography,Byte,Biginteger,我想把散列转换成一个大整数,这样我就可以用它做一些计算了。我在这方面很成功,但另一方面,我需要能够将大整数转换回散列来进行验证。但是我无法成功地将转换返回,下面是我的代码和输出。请务必提供建议和协助 这是密码 //convert hash to bytes then to big int to mod pow BigInteger hashy = new BigInteger(hash.getBytes(StandardCharsets.ISO_8859_1)); System.out.pri

我想把散列转换成一个大整数,这样我就可以用它做一些计算了。我在这方面很成功,但另一方面,我需要能够将大整数转换回散列来进行验证。但是我无法成功地将转换返回,下面是我的代码和输出。请务必提供建议和协助

这是密码

//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
有人知道出了什么问题吗

String convertedBackHash = (hashy.toByteArray()).toString();                
您正在使用以十六进制格式表示数组对象的
Array#toString
方法

如果要将字节转换为字符串

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

对于加密函数,通常需要将字节数组(散列)转换为正整数并返回。这可以通过将字节数组视为大小恒定、无符号的大端整数来实现

PKCS#1为RSA计算指定了这一点,例如,OS2IP(八位字符串到整数原语)将字节数组转换为整数,I2OSP(整数到八位字符串原语)将整数转换回八位字符串。八位字节字符串只不过是一个字节数组。两者都不是特别难实现的,但是Java没有内置函数(提示!),而且Java无法调整数组大小,这使得I2OSP比您预期的更难实现。幸运的是,我已经提供了答案——我花了一些时间再次找到它

现在,您的输入哈希似乎是十六进制编码的。这不是您想要转换为整数的内容。您希望将字节数组表示的字节转换为整数。所以首先需要对字节进行十六进制解码。有很多库实现十六进制编码,这里也有关于Stackoverflow的答案。相反,在I2OSP之后,如果要查看字节,则需要将字节编码回十六进制。这样你只需要处理一半大小的整数


所以
biginger i=os2ip(Hex.decode(hashString))
,然后用
i
做一些事情,当你再次得到它时,
String hashString=Hex.encodeToString(i2osp(i))
,谢谢你的方法奏效了!但是你介意解释一下为什么我的方法不起作用吗?因为在我看来,我的脚步和你不一样吗?我将大整数转换为字节数组,然后在字节数组上使用.toString()。但是对于您的,您创建了一个包含大整数字节数组的新字符串?一般来说是不是都一样?请查看您的
[B@60e53b93
您使用了错误的
toString()
方法。您正在获取二进制数组
B
的内存
@
中的十六进制地址。这直接解决了哈希字符串无法正确打印的问题,但它无法处理哈希仍为十六进制格式的问题,也无法处理可能导致哈希字符串无效的零填充问题太大或太小。他没有使用
Array.toString()
,也没有“以十六进制格式表示数组对象”。他使用的是
byte[].toString()
,它是从
object.toString()
继承的,它返回对象的类,后跟它的
hashCode()
十六进制。@EJP这就是问题的症结所在,我对答案进行了评论。阅读我的答案以了解我在说什么。将十六进制转换为ASCII再转换为整数是没有意义的。当然,将其转换回也有问题,但我认为这不是主要问题。谢谢你,Maarten感谢你们如此深入地回答这个问题。这真的很有帮助。也感谢苏雷什试图解决这个问题!感谢你们两个!!!!