Метод Диффи-Хеллмана в С# не работает

Итак, в конце концов, я хочу объяснить метод:

Идея состоит в том, чтобы два человека обменивались одной ценностью через общедоступный канал связи, фактически не отправляя ее.

Вот как это работает:

https://en.wikipedia.org/wiki/Диффи-Хеллман


Это мой код С#:

    double primemodulus = 251;
    double generator = 11;

    public string TestarGamaValores()
    {
        Random R = new Random();
        double Alice = R.Next(1, 100); //alice exp
        double AliceCalculado = DefaultMod(Alice);

        double Bob = R.Next(1, 100); //bob exp
        double BobCalculado = DefaultMod(Bob);

        //Trocar os calculados entre eles

        double ChaveFinalAlice = CalcularAposTroca(Alice, BobCalculado);
        double ChaveFinalBob = CalcularAposTroca(Bob, AliceCalculado);

        return ("Chave Final Alice: " + ChaveFinalAlice + " Chave Final Bob: " + ChaveFinalBob);
    }
                  //Calculate after exchange
    public double CalcularAposTroca(double MyExp, double HisResultFromHisModulus)
    {
        double genrt = Math.Pow(HisResultFromHisModulus, MyExp);
        double Chave = genrt % primemodulus;
        return Chave;
    }

    public double DefaultMod(double MyExp)
    {
        double genrt = Math.Pow(generator, MyExp);
        double Chave = genrt % primemodulus;
        return Chave;
    }

единственная проблема в том, что я не могу получить одинаковые значения. я проверил, в порядке ли формула, и я думаю, что не ошибся, но код C #, похоже, не согласен.

результаты действительно находятся между 0 и 251, но всегда разные.

так что я делаю неправильно?

код С# в порядке?


person JaimeASV    schedule 10.11.2013    source источник


Ответы (3)


Я думаю, ваша проблема в том, что вы используете двойные значения вместо длинных (целочисленные значения), поскольку двойные числа хранятся только как приближения к реальному числу, вы можете получить ошибки округления. См. также этот пост Почему оператор модуля не работает для двойного в С#?

Если вы имеете дело с большими значениями, вам придется использовать структуру произвольного размера, например BigInteger.

person Leonard Brünings    schedule 10.11.2013
comment
примите во внимание, что даже long может быть недостаточно большим для криптографического использования - person DarkSquirrel42; 10.11.2013
comment
@ DarkSquirrel42 да, но я бы все равно не стал использовать самореализуемый алгоритм для криптографического использования, и для его примера этого должно быть достаточно. - person Leonard Brünings; 10.11.2013
comment
Длинный не делает этого, Десятичный да, Длинный он получает некоторые правильные, двойные нет, десятичные все, но десятичные числа слишком малы для значений, которые у меня есть, если exp слишком большой, значения просто не поместятся в лол. - person JaimeASV; 10.11.2013
comment
@JaimeASV, поскольку DarkSquirrel42 предложил использовать BigInteger для больших значений. - person Leonard Brünings; 10.11.2013

вы используете double, который является числом с плавающей запятой для чего-то, что математически не определено для чисел с плавающей запятой... оператор по модулю...

я предлагаю использовать целые числа произвольной точности, такие как BigInteger

person DarkSquirrel42    schedule 10.11.2013
comment
Да, это сработало, на этот вопрос должно быть 2 правильных ответа, потому что оба они заставляют это работать. Спасибо обоим :D - person JaimeASV; 10.11.2013

Я ценю, что Вы собираетесь реализовать идею алгоритма Диффи-Хеллмана, но для всех, кто ищет решение, я могу сказать, что нет необходимости снова открывать круг.

Здесь уже реализован протокол обмена секретным ключом Диффи-Хеллмана:

System.Security.Cryptography.ECDiffieHellmanCng 

и есть ссылка на отличный пример использования: http://msdn.microsoft.com/en-us/library/system.security.cryptography.ecdiffiehellmancng(v=vs.110).aspx

Обратите внимание на то, чтобы измерить производительность решения в вашей среде перед развертыванием. Процесс генерации PublicKey занимает до 40 мс на моем Intel Core I5. :-(

person Piotr Kwiatek    schedule 20.11.2014