PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C#] Diffie Hellman



IRET
28.07.2015, 13:38
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/2965707/c-sharp-a-random-bigint-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.




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 = "66891290172357932183296341458632188723505509508383 84334086242039433231042810326035484999955920017069 9394836781881061614618848289";
byte[] __p = new byte[_p.Length * sizeof(char)];
Buffer.BlockCopy(_p.ToCharArray(), 0, __p, 0, __p.Length);
p = new BigInteger(__p);
string _g = "82088016496786993023458885441085227818629257838912 62209183175735420919333615718095768852978841044566 6034214686864883196858357693";
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;
}
}
}