2010-05-26 16 views
5

Ho provato e provato ma continuo a ricevere "Dati errati". Come decifrare i dati utilizzando RSACryptoServiceProvider con Exponent/Modulus della chiave pubblica?C# RSA Modulo/Esponente pubblico? (Dati errati)

public static byte[] Encrypt(byte[] b, byte[] mod, byte[] exp) 
{ 
    CspParameters csp = new CspParameters(); 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 

    RSAParameters par = new RSAParameters(); 
    par.Exponent = exp; 
    par.Modulus = mod; 
    rsa.ImportParameters(par); 

    return rsa.Encrypt(b, false); 
} 
public static byte[] Decrypt(byte[] b, byte[] pubexp, byte[] mod, byte[] priexp) 
{ 
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); 
    RSACryptoServiceProvider.UseMachineKeyStore = false; 
    RSAParameters rp = new RSAParameters(); 

    rp.Exponent = pubexp; 
    rp.D = priexp; 

    rp.Modulus = mod; 
    rsa.ImportParameters(rp); 
    return rsa.Decrypt(b, false); 
} 

static List<byte[]> Base2Array(string str) 
{ 
    byte[] b = Convert.FromBase64String(str); 

    List<byte[]> Bytes = new List<byte[]>(); 

    int i = 0; 
    while (i < b.Length) 
    { 
     int size = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(b, i)); 
     i += 4; 
     byte[] b2 = new byte[size]; 
     Array.Copy(b, i, b2, 0, size); 
     Bytes.Add(b2); 
     i += size; 
    } 

    return Bytes; 
} 


static void Main(string[] args) 
{ 
    List<byte[]> pub = Base2Array("AAAAB3NzaC1yc2EAAAABJQAAAIBMW4HxU1glv+CcZpJnvUKEyeNfFoKkyLOVLOOb/vNXQkrkGsNdpYAZkKKizij8fD3u3/iYT8UI+xkFoyonRYVipgCslirJB1VdvLivXs69Ht4vf7VAv2yJSUni3XsIHauMlfOkjJ7DpUW75ZkrxsGieICFWlXvRnAyDdqQrkZRZQ=="); 
    List<byte[]> pri = Base2Array("AAAAgBSjHDNiojO3UXZg6Ux4VyrOx9SCn9mCWgykWTEUeR6Anp6DxhlPUw3UEEetVy97hlw8iGCEQxcvG4T7qocni9UtUTLdpuQzvr6718y2CP0ouKt/1hVKD9QssT08XUvJEBQnnl2yVZAbIqT/DGnUH36L0BnQE/2ombPakwHscfFFAAAAQQCSfQy2cP8Oa0IR0u0whxqGmuuXY/3tCD8NaaSCYm31ly0QBdxFdf2WkC51DNVaf5/1ErHceMapFN9Z3j+/6lA7AAAAQQCFcMoSA32f240nFBmMv/nn/mL1uSdAXOxjUHViJc6M8ntZvW2ZuP2qTvfA3mh1AK5K69piX/4T72xxqTA2tmrfAAAAQFxX1JunFI+fpobdienVCZcjibwbpDPf1MVTbwQhAXHqVBL3XXgkysS/67X/aWnv/+SdBDaXa1SnDpphSWOkxAQ="); 

    //pub[0] 7 
    //pub[1] 1 
    //pub[2] 128 

    //pri[0] 128 
    //pri[1] 65 
    //pri[2] 65 
    //pri[3] 64 

    byte[] pubmod = null; 
    byte[] primod = null; 
    byte[] pubexp = null; 
    byte[] priexp = null; 

    pubexp = pub[0]; 
    pubmod = pub[2]; 

    priexp = pri[0]; 
    primod = pri[2]; 


    byte[] bstr = Encoding.ASCII.GetBytes("Test"); 

    bstr = Encrypt(bstr, pubmod, pubexp); 
    bstr = Decrypt(bstr, pubexp, pubmod, null); 


    string str = Encoding.ASCII.GetString(bstr); 
} 
+0

non abbastanza informazioni .... –

+0

Aggiunto il codice che non funziona. – user230821

+0

Sembra che la classe RSA di microsofts sia molto semplice e accetta solo le chiavi nel loro formato. Bene, ho scaricato il castello gonfiabile e sto cercando di capirlo. – user230821

risposta

2

faccio qualcosa di simile:

public byte[] PublicDecryption(byte[] encryptedData) 
{ 
     var encData = new BigInteger(encryptedData); 
     BigInteger bnData = encData.modPow(_exponent, _modulus); 
     return bnData.getBytes(); 
} 

public byte[] PrivateDecryption(byte[] encryptedData) 
{ 
    var encData = new BigInteger(encryptedData); 
    d = new BigInteger(rsaParams.D); 
    BigInteger bnData = encData.modPow(d, _modulus); 
    return bnData.getBytes(); 
} 

dove BigInteger è questa:

http://www.codeproject.com/KB/cs/biginteger.aspx

perché Microsoft implementazione è parziale e buggy.

Non ho mai avuto un problema con questo.

Spero che questo aiuto

1

Pochi mesi fa ho cercato di attuare scenario con crittografia a chiave privata e la chiave pubblica di decifratura. Ho trascorso una settimana a provare a farlo con RSACryptoServiceProvider e .. niente. Essi supportano solo due casi di utilizzo:

  1. crittografia a chiave pubblica, privata (completa) decrittazione chiave.

  2. Firma con chiave privata, verifica con il pubblico.

E hanno fatto di tutto per non permettervi di fare qualcos'altro con la loro API. Per favore, dai un'occhiata ai forum msdn: Ho trovato molte risposte come quella msdn, comprese le risposte dal team di sviluppo del supporto. Tutto ciò che hanno detto: questo è proibito dal design. Quindi il mio suggerimento è di non provare nemmeno a farlo con RSACryptoServiceProvider, meglio usare un'altra implementazione.

Problemi correlati