How to use BouncyCastle's Diffie-Hellman in C#? -
i'm writing app that'll exchange data between phone , windows pc, , want protect data sent key generated diffie-hellman exchange.
i'm trying use bouncycastle that, non-existant documentation c# implementation has me stumped.
what want know is: what's workflow generating dh key , computing shared key when other side's key received? (i'm assuming can send key string , can work other side's key string.) objects/methods use in c# that?
alright, after lot of trial, got working. posting answer in case else needs it.
i'll assume reader (1) knows diffie-hellman , it's useful (read here details) , (2) imported bouncycastle .net project via nuget.
imports you'll need:
using org.bouncycastle.crypto; using org.bouncycastle.crypto.generators; using org.bouncycastle.crypto.parameters; using org.bouncycastle.security;
how generate g , p:
public dhparameters generateparameters() { var generator = new dhparametersgenerator(); generator.init(bitsize, defaultprimeprobability, new securerandom()); return generator.generateparameters(); }
wanna g , p strings?
public string getg(dhparameters parameters) { return parameters.g.tostring(); } public string getp(dhparameters parameters) { return parameters.p.tostring(); }
how generate , a:
public asymmetriccipherkeypair generatekeys(dhparameters parameters) { var keygen = generatorutilities.getkeypairgenerator("dh"); var kgp = new dhkeygenerationparameters(new securerandom(), parameters); keygen.init(kgp); return keygen.generatekeypair(); }
wanna read , string?
// returns public string getpublickey(asymmetriccipherkeypair keypair) { var dhpublickeyparameters = _generatedkey.public dhpublickeyparameters; if (dhpublickeyparameters != null) { return dhpublickeyparameters.y.tostring(); } throw new nullreferenceexception("the key pair provided not valid dh keypair."); } // returns public string getprivatekey(asymmetriccipherkeypair keypair) { var dhprivatekeyparameters = _generatedkey.private dhprivatekeyparameters; if (dhprivatekeyparameters != null) { return dhprivatekeyparameters.x.tostring(); } throw new nullreferenceexception("the key pair provided not valid dh keypair."); }
to import parameters strings do:
var importedparameters = new dhparameters(p, g);
to generate b , b use generatekeys()
importedparameters
instead of generated parameters
.
let's generated b , b , got p, g , a. compute shared secret:
public biginteger computesharedsecret(string a, asymmetrickeyparameter bprivatekey, dhparameters internalparameters) { var importedkey = new dhpublickeyparameters(new biginteger(a), internalparameters); var internalkeyagree = agreementutilities.getbasicagreement("dh"); internalkeyagree.init(bprivatekey); return internalkeyagree.calculateagreement(importedkey); }
repeat , have shared secret between 2 clients, ready used encrypt communications.
hope useful.
Comments
Post a Comment