0

所以,毕竟,我想解释一下方法:

想法是两个人通过公共通信渠道交换一个价值,而不是真正发送它。

这就是它的工作原理:

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

我认为您的问题是您使用的是双精度而不是长整数(整数值),因为双精度仅存储为实数的近似值,您可能会遇到舍入错误。另请参阅这篇文章为什么模数运算符在 c# 中不能用于双精度?

如果您正在处理更大的值,则必须使用具有任意大小的结构,例如BigInteger.

于 2013-11-10T13:14:06.320 回答
2

您正在使用doublewhich 是一个浮点数,用于在数学上没有为浮点数定义的东西......模运算符......

我建议使用任意精度整数,例如BigInteger

于 2013-11-10T13:15:47.920 回答
1

我很欣赏你将要实现 Diffie-Hellman 算法的想法,但是对于正在寻找解决方案的每个人,我可以告诉你没有必要再次发现这个圈子。

Diffie-Hellman 密钥交换协议已在此处实现:

System.Security.Cryptography.ECDiffieHellmanCng 

并且有一个很好的使用示例的链接:http: //msdn.microsoft.com/en-us/library/system.security.cryptography.ecdiffiehellmancng (v=vs.110).aspx

在部署之前,请注意在您的环境中测量解决方案的性能。在我的 Intel Core I5 上生成公钥的过程最多需要 40 毫秒。:-(

于 2014-11-20T23:30:32.873 回答