Java BigInteger与Mono.net BigInteger

Java BigInteger与Mono.net BigInteger,java,.net,biginteger,Java,.net,Biginteger,我在.Net项目中使用Java中biginger()的mono实现,我使用Java.math.biginger 相同的代码在Java中产生不同的结果 .Net代码 String inputBytes = "8E5BD77F0DCC30864634C134E28BFB42A149675A320786B616F4530708350D270353C30A40450325801B7AFED12BCCA274B8187072A89CC0CC3F95A24A8251243C1835898246F4D

我在.Net项目中使用Java中biginger()的mono实现,我使用Java.math.biginger

相同的代码在Java中产生不同的结果

.Net代码

    String inputBytes = "8E5BD77F0DCC30864634C134E28BFB42A149675A320786B616F4530708350D270353C30A40450325801B7AFED12BCCA274B8187072A89CC0CC3F95A24A8251243C1835898246F4D64CA3AC61DB841518F0E8FBC8996A40EB626153AE7F0BB87FD713FAC522719431428DE178E780A3FA45788A72C431926AED990E6DA268D2CC";
    String modulus = "00e6b4b4511e0bd1b3d9c82ee189ba6d0c70b1466d94126f99a741af99a92701a789451742a357ddb61a4dea409965ec58dcaa5e30826de871b04700ed0fd46b1693446049734e8f95faba2bf9301347e63ba1771650e71982adef0cca6890b6f7baa7f5421a6533652f4b70c3c4270c480cf54cc06635f22901a42716d1dadf4f";
    String exp = "010001";

    BigInteger mModulus = new BigInteger(hexStringToByteArray(modulus));
    BigInteger mExponent = new BigInteger(hexStringToByteArray(exp));
    BigInteger input = new BigInteger(hexStringToByteArray(inputBytes));
    BigInteger output = input.ModPow(mExponent, mModulus);
    Console.WriteLine("==RESULT==" + byteArray2Hex(output.GetBytes()));   


    public static byte[] hexStringToByteArray(string hexString)
    {
        if (hexString.Length % 2 != 0)
            throw new ArgumentException(String.Format(CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));

        byte[] HexAsBytes = new byte[hexString.Length / 2];
        for (int index = 0; index < HexAsBytes.Length; index++)
        {
            string byteValue = hexString.Substring(index * 2, 2);
            HexAsBytes[index] = byte.Parse(byteValue, NumberStyles.HexNumber, CultureInfo.InvariantCulture);
        }

        return HexAsBytes; 
    }

    ==RESULT==01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF003020300C06082A864886F70D02050500041009EB0D996BFC1EFA5675997712A1AB6E
Java和.Net中的结果是相同的

==RESULT==01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003020300c06082a864886f70d02050500041046fd8e86a4833e7141cbe4718e8e92f7
魔力何在?

来自以下文档:

将包含BigInteger的二元补码二进制表示形式的字节数组转换为BigInteger。假设输入数组按大端字节顺序排列:最高有效字节位于第0个元素中

从以下文件:

值数组中的各个字节应为小尾端顺序,从最低顺序字节到最高顺序字节


因此,您可能只想尝试反转其中一个值的输入字节-不清楚应该反转哪个集合,因为我们不知道您试图表示什么值。我建议在每种情况下添加诊断,即在构造后立即打印出正常的十进制表示法-如果它们不相同,代码的其余部分无关紧要。

我通过在inputBytes开头添加0位解决了问题。

我刚刚通过在inputBytes开头添加0位解决了问题。谢谢你的想法,他们帮了我很多。是的,因为.NET
biginger
String inputBytes = "242e35241b85fcfd75a53441ef9fc0941064c16f8e4555dabef5ce8ebc91400c6961b6b607e5dd762dbcabce51b11c8594e7d7183786c8e3c5300c7583c1871fc6f350b817682150b5cd0430ca9a2c3f8315b425c8fea0e7cc18187237ed47d29b082e7e7154888d5fb09f092a6dd5e2d3dac9df8de45837b708b5ae17f03e7f";
==RESULT==01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003020300c06082a864886f70d02050500041046fd8e86a4833e7141cbe4718e8e92f7