我试图将哈希转换为一个大整数,所以我可以用它做一些计算。我成功了,但在另一方面,我需要能够将大整数转换回哈希进行验证。但我不能成功地进行转换,下面是我的代码和输出。请建议并协助..
这是代码
//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
任何人都知道出了什么问题?
答案 0 :(得分:0)
String convertedBackHash = (hashy.toByteArray()).toString();
您使用的是Array#toString
方法,它以十六进制格式表示数组对象。
如果要将字节转换为字符串
String result = new String(hashy.toByteArray());
System.out.println("hash to hashy to hash: " + result);
答案 1 :(得分:0)
对于加密函数,通常需要将字节数组(散列)转换为正整数并返回。这可以通过将字节数组视为常量,无符号,大端整数来完成。
PKCS#1为RSA计算指定了这一点,例如,OS2IP(八位字符串到整数原语)从字节数组转换为整数,I2OSP(整数到八位字节字符串原语)从整数转换回八位字符串。八位字符串只不过是一个字节数组。实现起来既不是特别棘手,但事实上Java没有内置函数(提示!)并且Java无法调整数组大小,这使得I2OSP比你预期的更棘手。幸运的是我已经提供了答案here - 我花了一些时间才找到它。
现在您的输入哈希似乎是十六进制编码的。这是不你想要变成整数的东西。您希望将字节数组所指示的字节表示转换为整数。所以你首先需要对字节进行十六进制解码。有很多库实现十六进制编码,Stackoverflow上也有答案。相反,在I2OSP之后,如果要查看它们,则需要将字节编码回十六进制数。这样你只需处理一半大小的整数。
所以BigInteger i = os2ip(Hex.decode(hashString))
,然后使用i
做一些事情,当你再次回来时String hashString = Hex.encodeToString(i2osp(i))
。