Sono stato più di un articolo su CodeProject un per un po 'che spiega come per cifrare e decifrare utilizzando il provider RSA:crittografia a chiave pubblica con RSACryptoServiceProvider
Mentre la vecchia versione dal 2009 è stato buggy, la nuova versione 2012 (con supporto System.Numerics.BigInteger) sembra più affidabile. Ciò che questa versione manca, però, è un modo per cifrare con una chiave pubblica e decifrare utilizzando la chiave privata .
Quindi, l'ho provato io stesso ma mi sono immondizia quando decritto. Non ho familiarità con il provider RSA, quindi sono al buio qui. È difficile trovare maggiori informazioni su come dovrebbe funzionare.
Qualcuno vede cosa c'è di sbagliato in questo? Quello che segue è la crittografia con una chiave pubblica:
// Add 4 byte padding to the data, and convert to BigInteger struct
BigInteger numData = GetBig(AddPadding(data));
RSAParameters rsaParams = rsa.ExportParameters(false);
//BigInteger D = GetBig(rsaParams.D); //only for private key
BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger encData = BigInteger.ModPow(numData, Exponent, Modulus);
return encData.ToByteArray();
si utilizza la grande "D" dal provider quando faccio questo? Probabilmente no dato che è la chiave pubblica che non ha la "D".
Poi la controparte (la decrittografia utilizzando la chiave privata):
BigInteger numEncData = new BigInteger(cipherData);
RSAParameters rsaParams = rsa.ExportParameters(true);
BigInteger D = GetBig(rsaParams.D);
//BigInteger Exponent = GetBig(rsaParams.Exponent);
BigInteger Modulus = GetBig(rsaParams.Modulus);
BigInteger decData = BigInteger.ModPow(numEncData, D, Modulus);
byte[] data = decData.ToByteArray();
byte[] result = new byte[ data.Length - 1 ];
Array.Copy(data, result, result.Length);
result = RemovePadding(result);
Array.Reverse(result);
return result;
'ho bisogno del "D" o l'Esponente qui?
Ovviamente ho bisogno che la crittografia funzioni in entrambi i modi pubblico-privato pubblico-privato. Qualsiasi aiuto è molto apprezzato!
elemento del 'D' non si trova in chiave pubblica. è impostato solo quando si utilizza una chiave privata per la decrittografia, e quindi l'esempio fallirà a meno che la chiave privata non sia distribuita con l'applicazione. –
uhm ... potrebbe essere un fatto che non puoi decifrare con la chiave privata, quando non ce l'hai ... sì ... cosa ha a che fare con un esempio di calcolo che mostra solo come fai la matematica dietro RSA? – DarkSquirrel42
Non corretto, è possibile decodificare i dati che sono stati crittografati utilizzando la chiave privata utilizzando la chiave pubblica SOLO nel processo di decrittografia. Il tuo esempio precedente richiede la chiave privata, non importa se decifrare usando pubblico o privato per la decodifica. Dai un'occhiata al tuo campione e capirai. Per tutti, è necessario ESSERE PUBBLICI e privati per far funzionare i propri metodi di decrittografia, il che è sbagliato. –