【问题标题】:Diffie-Hellman Method in C# not workingC# 中的 Diffie-Hellman 方法不起作用
【发布时间】:2013-11-10 13:09:42
【问题描述】:

所以,毕竟我要说明方法:

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

这就是它的工作原理:

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# 代码可以吗?

【问题讨论】:

    标签: c# public-key-encryption diffie-hellman


    【解决方案1】:

    我认为您的问题是您使用的是 double 而不是 long(整数值),因为双精度数仅存储为实数的近似值,您可能会遇到舍入错误。另见这篇文章Why is modulus operator not working for double in c#?

    如果您要处理较大的值,则必须使用任意大小的结构,例如 BigInteger

    【讨论】:

    • 考虑到即使long 也可能不够大,无法用于加密
    • @DarkSquirrel42 是的,但无论如何我都不会使用自我实现的算法进行加密,对于他的例子来说它应该足够了。
    • 长不做,十进制是的,长它得到一些正确的,双倍无,十进制全部,但十进制对于我拥有的值来说太小了,如果 exp 太大,值只是不适合大声笑。
    • @JaimeASV as DarkSquirrel42 建议使用BigInteger 以获得更大的值。
    【解决方案2】:

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

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

    【讨论】:

    • 是的,这行得通,这个问题应该有 2 个正确答案,因为他们俩都能做到这一点。感谢两者:D
    【解决方案3】:

    我很欣赏你将要实现 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 毫秒。 :-(

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多