【问题标题】:How to implement Diffie Hellman in .netcore/Linux如何在 .net core/Linux 中实现 Diffie Hellman
【发布时间】:2019-11-01 11:21:29
【问题描述】:

ECDiffieHellmanCng -> 不支持平台

ECDiffieHellmanOpenSsl -> PublicKey.ToByteArray() -> 不支持平台

这是 7 个月前其他人提出的基本相同(未回答)的问题 How do I serialize and deserialize the public key for ECDiffieHellmanOpenSsl on Linux?

如果有办法驯服提供的类,我想避免引入第 3 方部门。

【问题讨论】:

    标签: c# .net-core cryptography diffie-hellman


    【解决方案1】:

    ECDiffieHellmanCng 在 Linux 上不受支持。

    Linux 使用ECDiffieHellmanOpenSsl,但注意

    所涉及的类型不会在平台之间转换

    https://github.com/dotnet/corefx/blob/1841042b99062de13dc80098cede9413be569238/Documentation/architecture/cross-platform-cryptography.md

    您可以找到一些在测试套件中如何使用它的示例,例如

    [Fact]
    public void VerifyDuplicateKey_ValidHandle()
    {
        using (var first = new ECDiffieHellmanOpenSsl())
        using (SafeEvpPKeyHandle firstHandle = first.DuplicateKeyHandle())
        using (ECDiffieHellman second = new ECDiffieHellmanOpenSsl(firstHandle))
        using (ECDiffieHellmanPublicKey firstPublic = first.PublicKey)
        using (ECDiffieHellmanPublicKey secondPublic = second.PublicKey)
        {
            byte[] firstSecond = first.DeriveKeyFromHash(secondPublic, HashAlgorithmName.SHA256);
            byte[] secondFirst = second.DeriveKeyFromHash(firstPublic, HashAlgorithmName.SHA256);
            byte[] firstFirst = first.DeriveKeyFromHash(firstPublic, HashAlgorithmName.SHA256);
    
            Assert.Equal(firstSecond, secondFirst);
            Assert.Equal(firstFirst, firstSecond);
        }
    }
    

    https://github.com/dotnet/corefx/blob/a10890f4ffe0fadf090c922578ba0e606ebdd16c/src/System.Security.Cryptography.OpenSsl/tests/EcDiffieHellmanOpenSslTests.cs

    【讨论】:

    • P和G在哪里与客户分享?它们是硬编码的,我只是得到firstFirst 并将其发送给客户? ECDiffieHellmanPublicKey firstPublic = D.PublicKey; 仍然无法序列化。如果我调用“.ToByteArray()”,我会得到另一个 System.PlatformNotSupportedException 我不知道如何从课堂中取出密钥,以便我可以通过套接字与我的客户共享它..
    【解决方案2】:

    使用 .NET Core 3.0,您可以使用 key.ExportSubjectPublickeyInfo() 序列化值(并使用 key.ImportSubjectPublicKeyInfo(bytes, out _) 重新水化一个。

    如果您继续使用 2.1 (LTS),您可以使用带有自定义序列化逻辑的 ExportParameters/ImportParameters。

    【讨论】:

      猜你喜欢
      • 2012-02-06
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多