【问题标题】:Cryptopp Ephemeral Diffie Hellman to C# Bouncy CastleCryptopp Ephemeral Diffie Hellman 到 C# Bouncy Castle
【发布时间】:2014-07-02 19:34:52
【问题描述】:

我正在尝试将 cryptopp DiffieHellman 2 密钥协商方法转换为 c# bouncy castle 库。

这里是关于 cryptoo c++ 库的帮助页面:http://www.cryptopp.com/wiki/Diffie-Hellman

我正在尝试将 RFC 5114 的 1024 位 MODP 组实现为 C#。

但是有很多问题我解决不了。

  1. keyPair 生成密钥时是 131 字节,但必须是 128 字节,因为服务器发送给我的密钥是静态和临时密钥的 256 字节。我也必须发送 256 个字节。但是每个键中的 1、2 和 3 字节值都是静态的,所以我要删除键中的前 3 个字节是真的吗?

  2. 我必须使用哪个密钥将共享密钥转换为其他加密系统密钥?

  3. 例如,我有一个密钥,如何将其转换为 Twofish、RC6、xTEA、Serpent 等?

这是我的代码:

    public byte[] CreateaNewDiffieHellmanKey()
    {
public static string Phex = "B10B8F96A080E01DDE92DE5EAE5D54EC52C99FBCFB06A3C69A6A9DCA52D23B616073E28675A23D189838EF1E2EE652C013ECB4AEA906112324975C3CD49B83BFACCBDD7D90C4BD7098488E9C219A73724EFFD6FAE5644738FAA31A4FF55BCCC0A151AF5F0DC8B4BD45BF37DF365C1A65E68CFDA76D4DA708DF1FB2BC2E4A4371";
public static string Ghex = "A4D1CBD5C3FD34126765A442EFB99905F8104DD258AC507FD6406CFF14266D31266FEA1E5C41564B777E690F5504F213160217B4B01B886A5E91547F9E2749F4D7FBD7D3B9A92EE1909D0D2263F80A76A6A24C087A091F531DBF0A0169B6A28AD662A4D18E73AFA32D779D5918D08BC8858F4DCEF97C2A24855E6EEB22B3B2E5";
public static string Qhex = "F518AA8781A8DF278ABA4E7D64B7CB9D49462353";

        BigInteger P = new BigInteger(Phex, 16);
        BigInteger G = new BigInteger(Ghex, 16);
        BigInteger Q = new BigInteger(Qhex, 16);

        IAsymmetricCipherKeyPairGenerator staticKeyGen = GeneratorUtilities.GetKeyPairGenerator("DH");
        IAsymmetricCipherKeyPairGenerator ephemeralKeyGen = GeneratorUtilities.GetKeyPairGenerator("DH");

        DHParameters dhParams = new DHParameters(P, G, Q, 0, 160);

        DHP = dhParams;

        KeyGenerationParameters kgpSt = new DHKeyGenerationParameters(new SecureRandom(), dhParams);
        KeyGenerationParameters kgpEp = new DHKeyGenerationParameters(new SecureRandom(), dhParams);
        staticKeyGen.Init(kgpSt);
        ephemeralKeyGen.Init(kgpEp);

        AsymmetricCipherKeyPair staticKeyPayir  = staticKeyGen.GenerateKeyPair();
        staticKeyEgri = AgreementUtilities.GetBasicAgreement("DH");
        staticKeyEgri.Init(staticKeyPayir.Private);

        AsymmetricCipherKeyPair ephemeralKeyPair  = ephemeralKeyGen.GenerateKeyPair();
        ephemeralKeyEgri = AgreementUtilities.GetBasicAgreement("DH");
        ephemeralKeyEgri.Init(staticKeyPayir.Private);

        AsymmetricKeyParameter StaticPublicKey = staticKeyPayir.Public;
        SubjectPublicKeyInfo StaticPublicKeyinfomuz = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(StaticPublicKey);
        byte[] st1 = StaticPublicKeyinfomuz.PublicKeyData.GetBytes();
        byte[] staticPublic = new byte[128];

        Array.Copy(st1, 3, staticPublic, 0, staticPublic.Length);

        AsymmetricKeyParameter EphPublicKey = staticKeyPayir.Public;
        SubjectPublicKeyInfo EphPublicKeyinfomuz = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(EphPublicKey);
        byte[] ep1 = StaticPublicKeyinfomuz.PublicKeyData.GetBytes();
        byte[] ephemeralPublic = new byte[128];

        Array.Copy(ep1, 3, ephemeralPublic, 0, ephemeralPublic.Length);

        return Bot.Birleştir(staticPublic, ephemeralPublic); // Combine 2 byte arrays

    }


    public bool AgreeTheKey(byte[] buffer)
    {

            byte[] staticpublic = new byte[128];
            byte[] ephemeralpublic = new byte[128];

            Array.Copy(buffer, 0, staticpublic, 0, staticpublic.Length);
            Array.Copy(buffer, staticpublic.Length, ephemeralpublic, 0, ephemeralpublic.Length);

            ICipherParameters istatic = new KeyParameter(staticpublic);
            ICipherParameters iphemeral = new KeyParameter(ephemeralpublic);

            DHPublicKeyParameters dhkpST = new DHPublicKeyParameters(new BigInteger(staticpublic), DHP);
            DHPublicKeyParameters dhkpEP = new DHPublicKeyParameters(new BigInteger(staticpublic), DHP);

            SharedStatic = staticKeyEgri.CalculateAgreement(dhkpST).ToByteArray();
            SharedEphemeral = ephemeralKeyEgri.CalculateAgreement(dhkpEP).ToByteArray();

            byte[] Sharedkey = SharedStatic;


          return true;



    }

【问题讨论】:

    标签: c# security cryptography bouncycastle diffie-hellman


    【解决方案1】:

    如果您不想添加编码,您可以始终从AsymmetricKeyParameter 转换为DHPublicKeyParameters 并使用getY() 检索Y。当然,在获得整数值后,您可能仍希望将其编码为固定数量的八位字节(字节)。一般来说,数字使用无符号左填充大端编码。

    【讨论】:

    • 所以现在,当我将密钥发送到服务器时,我必须用大端编码这个密钥对吗?我如何编码这个密钥,你能给我示例代码吗?谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-06
    相关资源
    最近更新 更多