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

标签 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

有人知道出了什么问题吗?

最佳答案

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

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

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

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

关于java - 字符串到字节到 Big Int 转换 VICE VERSA 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47303099/

相关文章:

security - 使用MD5将密码安全地从前端发送到后端

PHP AES 加密/解密

java - 将 Bitmap 转换为 ByteArray,反之亦然

python - 在 Python 中字节对象相对于字符串对象有哪些优势?

c# - 交换字节顺序/字节顺序

java - java中的枚举如何线程安全?

侧信道攻击的 C 时序内存访问

java - Android Tab Layout如何从第二个tab开始

java - 从 URL 中提取数据以用于 selenium 测试

java - Android 软键盘 : Shiftkey to load another keyboad layout