Cryptopp短暂的Diffie Hellman到C#Bouncy城堡

Cryptopp短暂的Diffie Hellman到C#Bouncy城堡,c#,security,cryptography,bouncycastle,diffie-hellman,C#,Security,Cryptography,Bouncycastle,Diffie Hellman,我正在尝试将cryptopp DiffieHellman 2密钥协商方法转换为c#bouncy castle库 这里是关于CyfOLC++库的帮助页: 我正在尝试将RFC5114的1024位MODP组实现为C 但是有很多问题我解决不了 当keyPair生成一个密钥时,它是131字节,但它必须是128字节,因为服务器向我发送256字节的静态和临时密钥。我也必须发送256个字节。但是1、2和3个字节的值在每个键中都是静态的,所以我要删除键中的前3个字节。这是真的吗 我必须使用哪个密钥将共享密钥转换为

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

这里是关于CyfOLC++库的帮助页:

我正在尝试将RFC5114的1024位MODP组实现为C

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

  • 当keyPair生成一个密钥时,它是131字节,但它必须是128字节,因为服务器向我发送256字节的静态和临时密钥。我也必须发送256个字节。但是1、2和3个字节的值在每个键中都是静态的,所以我要删除键中的前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;
    
    
    
        }
    

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

    所以现在,当我将密钥发送到服务器时,我必须用大端编码对该密钥进行右方编码?我如何对这个密钥进行编码,你能给我示例代码吗?谢谢。