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

Popular posts from this blog

node.js - Mongoose: Cast to ObjectId failed for value on newly created object after setting the value -

gradle error "Cannot convert the provided notation to a File or URI" -

python - NameError: name 'subprocess' is not defined -