0

だから、結局のところ、私はその方法を説明したい:

アイデアは、実際には送信せずに、2 人が公共の通信チャネルを介して 1 つの値を交換することです。

これがどのように機能するかです:

https://en.wikipedia.org/wiki/Diffie-Hellman


これは私のC#コードです:

    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 の間ですが、常に異なります。

それで、私は何を間違っていますか?

C#コードは大丈夫ですか?

4

3 に答える 3

2

double は実数の近似値としてのみ格納されるため、丸め誤差が発生する可能性があるため、問題は long (整数値) ではなく double を使用していることだと思います。この投稿も参照してください。 c# でモジュラス演算子が double に対して機能しないのはなぜですか?

より大きな値を扱う場合は、 のような任意のサイズの構造体を使用する必要がありますBigInteger

于 2013-11-10T13:14:06.320 に答える
2

double浮動小数点数に対して数学的に定義されていないものに浮動小数点数を使用しています...モジュロ演算子...

次のような任意精度の整数を使用することをお勧めしますBigInteger

于 2013-11-10T13:15:47.920 に答える