Eine kleine Klasse die .Net 4.0 benötigt. Als p und q werden festgelegte große Primzahlen in Form von Strings (_g und _p) verwendet. Diese können natürlich auch generiert werden (in meinem Fall war der Austausch nicht notwendig). Hierzu hilft folgender Thread: http://stackoverflow.com/questions/2...gint-generator


Wer DH nicht kennt: DH ist ein asymmetrischer Algorithmus mit dem Schlüssel ausgetauscht werden können, ohne diese über das Netzwerk zu senden.


Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Numerics;


namespace Cryptographie
{
    public class DiffieHellman
    {
        private BigInteger p;
        private BigInteger g;
        private BigInteger secret;


        public DiffieHellman()
        {
            string _p = "66891290172357932183296341458632188723505509508383843340862420394332310428103260354849999559200170699394836781881061614618848289";
            byte[] __p = new byte[_p.Length * sizeof(char)];
            Buffer.BlockCopy(_p.ToCharArray(), 0, __p, 0, __p.Length);
            p = new BigInteger(__p);
            string _g = "82088016496786993023458885441085227818629257838912622091831757354209193336157180957688529788410445666034214686864883196858357693";
            byte[] __g = new byte[_p.Length * sizeof(char)];
            Buffer.BlockCopy(_g.ToCharArray(), 0, __g, 0, __g.Length);
            g = new BigInteger(__g);


            byte[] data = new byte[256];
            (new Random()).NextBytes(data);
            secret = BigInteger.Abs(new BigInteger(data));
        }
        
        /// <summary>
        /// Caclculates Keybase to send to partner
        /// </summary>
        /// <returns>Keybase with wich the partner can calculate the key</returns>
        public BigInteger calcKeyBase()
        {
            // A = g^a mod p
            BigInteger keyBase = BigInteger.ModPow(g, secret, p);
            return keyBase;
        }


        /// <summary>
        /// Calculates the key out of the foreign Keybase and the own Secret
        /// </summary>
        /// <param name="foreignKeyBase"></param>
        /// <returns>Calculated Key</returns>
        public BigInteger calcKey(BigInteger foreignKeyBase)
        {
            // K = B^a mod p
            BigInteger key = BigInteger.ModPow(foreignKeyBase, secret, p);
            return key;
        }
    }
}