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