字符串到字节到 Big Int 转换 VICE VERSA 错误

String to bytes to Big Int conversion VICE VERSA error

我正在尝试将哈希值转换为大整数,以便我可以用它进行一些计算。我在这方面很成功,但另一方面我需要能够将大整数转换回散列以进行验证。但我无法成功转换回来,下面是我的代码和输出。请提供建议和协助..

这是代码

//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 比您预期的更棘手。幸运的是,我已经提供了答案 here - 我花了一些时间才再次找到它。

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

所以 BigInteger i = os2ip(Hex.decode(hashString)),然后用 i 做一些事情,当你再次找回它时,String hashString = Hex.encodeToString(i2osp(i))