建议和反馈

请填写你的反馈内容

问答 > 密码学 > 问答详情
已解决

从字节到Big Int转换的字符串VICE VERSA错误10LK

我试图将哈希转换为一个大整数,所以我可以用它做一些计算。 我成功了,但在另一方面,我需要能够将大整数转换回哈希进行验证。 但我不能成功地进行转换,下面是我的代码和输出。 请建议并协助..

这是代码

//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

谁知道出了什么问题?


2019-12-04
0
请先登陆或注册

仍然2019-12-04

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

例如,PKCS#1为RSA计算指定了这一点,其中OS2IP(八位字符串到整数原语)从字节数组转换为整数,I2OSP(整数到八位字节字符串原语)从整数转换回八位字符串。 八位字符串只不过是一个字节数组。 实现起来并不是特别棘手,但事实上Java没有内置函数(提示!)并且Java无法调整数组大小使得I2OSP比你预期的更棘手。 幸运的是我已经在这里提供了答案 - 我花了一些时间才找到它。

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

所以BigInteger i = os2ip(Hex.decode(hashString)) ,然后用i做东西,当你再次回来时, String hashString = Hex.encodeToString(i2osp(i)) 。


投一票
评论(0)
赞赏(0)

求助中

解决了这个问题,预计可以帮助到

  • 0
  • 2
  • 4
  • 8
  • 4
邀请

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励