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