Daniel OG
per en 19 d'Abril 2011
1,378 Vistes

Dos dies he estat per esbrinar com fer desxifrat RSA sense padding en c# per un projecte, sense cap documentació disponible.... argghhhxxx. Ho compartiré amb tot l'inet :P

 

1) Obtenir les llibreries OpenSSL.net per Win32 a  http://sourceforge.net/projects/openssl-net/files/openssl-net/

2) Al projecte de C#, afegir una referència a la DLL  ManagedOpenSsl.dll

3) Copiar els arxius libeay32.dll i ssleay32.dll a les carpetes de  bin/Debug  i  bin/Release  (o bé, integrar-les)

 

Partim d'una clau pública, per exemple la Clau Pública Europea (EUR_PK):

fd 45 43 20 00 ff ff 01 e9 80 76 3a 44 4a 95 25 0a 95 87 82 d1 d5 4a cf c3 23 d2 5f 39 46 b8 16 e9 2f cf 9d 32 b4 2a 26 13 d1 a3 63 b4 e4 35 32 a0 26 68 63 29 c8 96 63 cc c0 01 f7 27 82 06 b6 ab 65 ad 28 71 84 8a 68 0f 6a 57 d8 fd a1 d7 82 c9 b5 81 29 03 ea 5b 66 e2 a9 be 1d 85 bd d0 fd ae 76 a4 60 88 d7 1a 61 76 b1 f6 a9 84 19 10 04 24 dc 56 d0 84 6a a3 c8 43 90 d3 51 7a 0f 11 92 de df f7 40 92 4c db a7 00 00 00 00 00 01 00 01

 

Aquest és el codi:

byte[] eur_n = null; //mòdul de la clau pública, extreure amb Buffer.BlockCopy, a partir del byte 8 amb longitud 128 B
byte[] eur_e =
null; //exponent de la clau pública, .. a partir del byte 136 amb longitud 8 B
byte[] data = null; //data a desencriptar

// (...)

//check CA Certificate
OpenSSL.Crypto.RSA rsa = new OpenSSL.Crypto.RSA();
rsa.PublicModulus = OpenSSL.Core.BigNumber.FromArray(eur_n);
rsa.PublicExponent = OpenSSL.Core.BigNumber.FromArray(eur_e);
byte[] result = rsa.PublicDecrypt(data, OpenSSL.Crypto.RSA.Padding.None); //decipheredSignature

// (...)

 

Després, per calcular Hash, es pot combinar amb la llibreria in-built SHA de C#:

SHA1 sha = new SHA1CryptoServiceProvider();
result_sha = sha.ComputeHash(data);
ok = result_sha.SequenceEqual(h));

Publicat a: Personal
Sigues el primer a qui li agrada això.
Diego
Bona iniciativa!
19 d'Abril 2011