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

时间:2017-11-15 08:57:32

标签: 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.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 :(得分: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))