Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 处理大整数问题_C#_.net_Biginteger_Diffie Hellman - Fatal编程技术网

C# 处理大整数问题

C# 处理大整数问题,c#,.net,biginteger,diffie-hellman,C#,.net,Biginteger,Diffie Hellman,假设以下Diffie-Hellman信息也可以在本网站上找到 1)p string givenp = "00e655cc9e04f3bebae76ecca77143ef5c4451876615a9f8b4f712b8f3bdf47ee7f717c09bb5b2b66450831367d9dcf85f9f0528bcd5318fb1dab2f23ce77c48b6b7381eed13e80a14cca6b30b5e37ffe53db15e2d6b727a2efcee51893678d50e9a89

假设以下Diffie-Hellman信息也可以在本网站上找到

1)p

string givenp = "00e655cc9e04f3bebae76ecca77143ef5c4451876615a9f8b4f712b8f3bdf47ee7f717c09bb5b2b66450831367d9dcf85f9f0528bcd5318fb1dab2f23ce77c48b6b7381eed13e80a14cca6b30b5e37ffe53db15e2d6b727a2efcee51893678d50e9a89166a359e574c4c3ca5e59fae79924fe6f186b36a2ebde9bf09fe4de50453";
        BigInteger p = new BigInteger(HexToBytesv2(givenp));
2)G

BigInteger g = new BigInteger(2);
3)商户私钥

string merchantPrivateKeyHEX = "48887dfd090d175e33beea29e7b38334299289069f9ab492b67807905faa98d96d22d79205bef03f14af093f1797b904734132c34a388fdc79e20497bfa1465fec2aac4fabdf3bb0c9be8685d20f7bfe0346a9abdf7fa89838c3fa9ca6abdb70bea66795ab6699cc154db59490e4159f142f7bddff603c1d3d6c4fff8177e11d";
        BigInteger a = new BigInteger(HexToBytesv2(merchantPrivateKeyHEX));
使用公式
publickey=g^a mod p
我应该获得初始链接中提供的公钥,但在执行时

BigInteger A = BigInteger.ModPow(g, a, p);
ToHex(A.ToByteArray())
我得到的结果是

00f85c41e84446ecfe43c9911df31d3cf60d83642afd496b741363290139badf75f8b8c5c010dda2446dd483dc553b6c2698c16c9d082391677785f81d54bc9c7c45f8b6d5bdb3e49fec7f5522b880c8c753fb7d3ff2c81e47dcb27d52842def40a812dc95cc679575baf237a955ee9944bd0797326f2a0a58c6c087f9b0b9e82c
而不是

00d9abd78c93dfddeb920d57d6513126d8f1118c9237a45101408dbffe6cfd95b011a016e4e0ab8aef0601e836a452b8bb88be7ca71e4f22f97aa65f8358ee69348d1227d65db6e53641d1a6542aa4be4b4adc75fac816af79a8e3f5097f8313e7b725df37eadc8c774e2033dfa99c95ccef333bf402b066198c30481e2a83875c
有什么想法吗?我肯定错过了很明显的机会,但我不确定那可能是什么

附加说明:添加正在使用的功能:

 public static byte[] HexToBytesv2(this string hex)
    {
        if (hex.Length % 2 == 1)
            hex = '0' + hex;

        byte[] ret = new byte[hex.Length / 2];

        for (int i = 0; i < ret.Length; i++)
            ret[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16);

        return ret;

    }

  public static string ToHex(byte[] ba)
    {
        StringBuilder hex = new StringBuilder(ba.Length * 2);
        foreach (byte b in ba)
            hex.AppendFormat("{0:x2}", b);
        return hex.ToString();

    }
公共静态字节[]HexToBytesv2(此字符串为十六进制)
{
如果(十六进制长度%2==1)
十六进制='0'+十六进制;
字节[]ret=新字节[hex.Length/2];
对于(int i=0;i
这是一个endian问题

我已经调整了你的编码和解码,现在得到了你想要的答案:

public static byte[] HexToBytesv2(string hex)
{
    if (hex.Length % 2 == 1)
        hex = '0' + hex;

    byte[] ret = new byte[hex.Length / 2];

    for (int i = 0; i < ret.Length; i++)
        ret[i] = Convert.ToByte(hex.Substring(hex.Length - (i+1) * 2, 2), 16);

    return ret;

}

public static string ToHex( byte[] bytes)
{
    var sb = new StringBuilder();
    foreach (var b in bytes.Reverse())
    {
        sb.AppendFormat("{0:x2}", b);
    }
    return sb.ToString();
}
在我交换排序并包含原始问题中的
.Concat(新字节[]{0}).ToArray()
之前,输出是:

True
真的
真的
假的
现在是:

True
真的
假的
真的

您看到的另一个问题是
biginger.Parse
Byte[]
构造函数总是希望第一个半字节或最后一个字节的顶端分别是符号位。因此,您需要分别包含额外的
0
字符或字节以避免这种情况。

您正在进行大量不必要的转换,并且它们在某个地方引入了错误

如果删除断开的
字符串
-
字节[]
-
大整数
-
字节[]
-
字符串
步骤,并让
大整数
本身为您完成工作,则您将生成预期结果:

string givenp = "00e655cc9e04f3bebae76ecca77143ef5c4451876615a9f8b4f712b8f3bdf47ee7f717c09bb5b2b66450831367d9dcf85f9f0528bcd5318fb1dab2f23ce77c48b6b7381eed13e80a14cca6b30b5e37ffe53db15e2d6b727a2efcee51893678d50e9a89166a359e574c4c3ca5e59fae79924fe6f186b36a2ebde9bf09fe4de50453";
var p = BigInteger.Parse(givenp, NumberStyles.HexNumber);

var g = new BigInteger(2);

var merchantPrivateKeyHEX = "48887dfd090d175e33beea29e7b38334299289069f9ab492b67807905faa98d96d22d79205bef03f14af093f1797b904734132c34a388fdc79e20497bfa1465fec2aac4fabdf3bb0c9be8685d20f7bfe0346a9abdf7fa89838c3fa9ca6abdb70bea66795ab6699cc154db59490e4159f142f7bddff603c1d3d6c4fff8177e11d";
var a = BigInteger.Parse(merchantPrivateKeyHEX, NumberStyles.HexNumber);

var publicKey = BigInteger.ModPow(g, a, p);
Console.WriteLine(publicKey.ToString("x"));  // displays 0d9abd7...

这和Diffie Hellman有什么关系?您是否遇到了一个错误,您认为该错误是由于执行按位操作时的某些问题引起的?为什么不使用.NET的内置密码或库?使用的算法是Diffie-Hellman算法。由于缺乏在线示例,这是我最简单的方法。问题显示的只是Hex2Byte转换和返回,这与DH无关。例如,在Google上搜索“Diffie Hellman c#”会在备注部分返回带有各种示例的结果。这确实很有效,但只有在创建BigInteger时附加了0字节,比如BigInteger p=new BigInteger(HexToBytesv2(givenp).Concat(new byte[]{0}).ToArray();生成的公钥当然以“00”开头,但除此之外,它是正确的。如果我不包括零字节,那么它根本不起作用。如果没有更好的答案,我会将您的答案标记为正确。当我删除
.Concat(新字节[]{0}).ToArray()
(您最初在问题中遇到的)时,它对我同样有效。这是真的,这个示例也有效,可能是因为生成的公钥已经以“00”开头。你知道为什么它不适合这个输入吗:?你期望什么?我得到了
049CC92B93214BBF3785B2391F164B6A4A194C419D2299CA14EB1AC7C026827788E008A3DC9AA9520D39963CCB23FB173FDCA8F93B0B507D2CDB1D6B22C912E861F55B6EC8B5D733563957ECB7DAEE8F8CDE4CACFF285D20472307DB9B8A754881574CEECFD8E75E37C17D19AC86082B4E983F477B2。现在还没有时间进一步研究它,但是使用LukeH的代码,但是使用pastebin的数字,
00
前面加了
givenp
我得到了您期望的数字。我没有研究BigInteger在其字节中应该是什么,但是
var p=BigInteger.Parse(givenp,NumberStyles.HexNumber);var pdash=biginger.Parse(“00”+givenp,NumberStyles.HexNumber);var q=pdash/p;var r=pdash%p
r
生成一个非零值,
q
-8
(对于来自pastebin的
给定NP
)!虽然您对不必要的转换是正确的,但它们并不是导致问题的原因。在建议的更改之后仍然会遇到问题。
string givenp = "00e655cc9e04f3bebae76ecca77143ef5c4451876615a9f8b4f712b8f3bdf47ee7f717c09bb5b2b66450831367d9dcf85f9f0528bcd5318fb1dab2f23ce77c48b6b7381eed13e80a14cca6b30b5e37ffe53db15e2d6b727a2efcee51893678d50e9a89166a359e574c4c3ca5e59fae79924fe6f186b36a2ebde9bf09fe4de50453";
var p = BigInteger.Parse(givenp, NumberStyles.HexNumber);

var g = new BigInteger(2);

var merchantPrivateKeyHEX = "48887dfd090d175e33beea29e7b38334299289069f9ab492b67807905faa98d96d22d79205bef03f14af093f1797b904734132c34a388fdc79e20497bfa1465fec2aac4fabdf3bb0c9be8685d20f7bfe0346a9abdf7fa89838c3fa9ca6abdb70bea66795ab6699cc154db59490e4159f142f7bddff603c1d3d6c4fff8177e11d";
var a = BigInteger.Parse(merchantPrivateKeyHEX, NumberStyles.HexNumber);

var publicKey = BigInteger.ModPow(g, a, p);
Console.WriteLine(publicKey.ToString("x"));  // displays 0d9abd7...