In poche parole, questo è il mio problema:Uso Base64 codificati chiave pubblica per verificare RSA firma
private string publicKeyString = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFOGwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWpbY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5yGPhGAAmqYrm8YiupwQIDAQAB";
/* Some transformation required, using publicKeyString to initiate a new RSACryptoServiceProvider object
*/
//for now:
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] selfComputedHash = new byte[]; //left out of the example
byte[] signature = new byte[];
bool result = rsa.VerifyHash(selfComputedHash, CryptoConfig.MapNameToOID("SHA1"), signature);
Come si può vedere, il problema sta avviando una nuova RSACryptoServiceProvider con la stringa chiave pubblica dato codifica Base64. Sono stato in grado di eseguire l'istanziazione utilizzando un oggetto RSAParameters, caricato con il byte [] per Modulus ed Exponent derivato da questa stringa di chiave pubblica utilizzando un comando di shell OpenSSL. Ma dal momento che questa chiave pubblica potrebbe cambiare in futuro, voglio essere in grado di memorizzarla nella sua forma originale in un database. Ci deve essere un modo più diretto per affrontare questo.
Molti degli esempi che ho letto finora evitano questo problema esportando e importando le chiavi private e pubbliche generate da e verso un oggetto portachiavi e utilizzandolo nello stesso pezzo di codice e quindi non "trasferendo" 'la chiave in qualche forma di stringa dalla memoria. Alcune persone hanno espresso lo stesso problema, sia qui su StackOverflow che su altri siti, ma non sono ancora riuscito a trovare una risposta soddisfacente.
Qualsiasi idea è più che benvenuta.
Informazioni di base: Il mio partner di comunicazione calcola un SHA1-hash da 20 byte da una stringa di input di lunghezza variabile, composta dalle informazioni contenute in diversi campi di un messaggio codificato ASCII. Questo hash viene quindi firmato con RSA con la chiave privata del mio partner e inviato insieme al messaggio ASCII. All'arrivo, computo da solo l'hash SHA1, utilizzando gli stessi campi del messaggio ASCII, quindi provo a verificare se questi campi non sono stati modificati chiamando VerifyHash.
La chiave è fornita in 2 forme: normale e 'noNL'. La versione noNL è incluso nel codice sopra, la versione normale è questo:
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDVGUzbydMZS+fnkGTsUkDKEyFO
GwghR234d5GjPnMIC0RFtXtw2tdcNM8I9Qk+h6fnPHiA7r27iHBfdxTP3oegQJWp
bY2RMwSmOs02eQqpKx4QtIjWqkKk2Gmck5cll9GCoI8AUAA5e0D02T0ZgINDmo5y
GPhGAAmqYrm8YiupwQIDAQAB
-----END PUBLIC KEY-----
Grazie, è abbastanza facile. Analizzerò la libreria BouncyCastle, ma sei sicuro che non ci sia modo di farlo utilizzando solo la libreria di crittografia in .NET stessa? – jscheppers
@jscheppers: puoi farlo manualmente come suggerito da poupou, ma non esiste un supporto diretto per il formato in .NET. Una rapida ricerca rivela questo esempio per la decodifica manuale: http://www.jensign.com/JavaScience/dotnet/pempublic/pempublic.cs, ma sembra un po 'disordinato. –
Penso che preferisco la tua soluzione BouncyCastle quindi;) L'ho già provato nella mia attuale implementazione e funziona. Segnerò il tuo post come risposta! – jscheppers