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; } } }

Zitieren