Posso utilizzare gli assembly PublicKey per decrittografare una stringa crittografata con la corrispondente PrivateKey?

StackOverflow https://stackoverflow.com/questions/1847357

Domanda

La firma di un assembly in .NET implica una coppia di chiavi pubblica/privata.Per quanto ne so da quello che ho letto, .NET utilizza l'algoritmo RSA e la chiave privata per firmare l'assembly, controllandolo con la chiave pubblica incorporata.

So come recuperare la chiave pubblica (Assembly.PublicKey).Mi chiedevo se quella chiave potesse essere utilizzata per decrittografare una breve stringa che contiene alcuni dati crittografati con la chiave privata.

I documenti che ho letto finora (per esempio.) sembrano implicare che sia possibile solo il contrario:Che dovrei usare la chiave pubblica per crittografare e la chiave privata per decrittografare, ma non voglio includerlo nell'assembly, vero?

Immagino che andrebbe bene se firmassi semplicemente la stringa.Ma come?

Non so come iniziare.Qualcuno ha uno snippet di codice?

Inoltre, la crittografia/firma della piccola stringa dovrebbe avvenire idealmente in PHP, poiché voglio scaricarla su un server Web e tutto ciò che abbiamo finora è il tuo sito Web generico ospitato in PHP/MySQL.

Caso d'uso:Sto cercando di elaborare uno schema di licenza leggero per un software che stiamo per rilasciare ai beta tester.Poiché il software sarà probabilmente freeware, tutto ciò che vogliamo veramente ottenere è

  1. sapere chi ha installato il software (indirizzo email)
  2. lasciare scadere il software dopo un determinato periodo, trascorso il quale l'utente dovrà ottenere una nuova licenza
    • è facile come compilare un modulo e attendere l'arrivo di un'e-mail automatizzata con la chiave
    • stiamo cercando di ridurre la probabilità che le vecchie versioni ritornino a mordere la nostra reputazione o a perseguitarci

Essere in grado di crittografare una tupla (data di scadenza, impronta digitale) e decrittografarla all'avvio renderebbe un modulo di licenza semplice:Al primo avvio dell'applicazione, all'utente viene richiesto l'indirizzo email, il nome, l'organizzazione.Queste informazioni vengono pubblicate sul server web insieme a un'impronta digitale md5 di alcune informazioni di sistema (NIC, nome del computer, versione principale e secondaria dell'assembly).Il server web risponde via email (verifica la validità dell'indirizzo email) con una versione crittografata della tupla (data di scadenza, impronta digitale) che viene poi salvata su disco.All'avvio, questo può essere decrittografato e confrontato con la data corrente e l'impronta digitale rigenerata.

MODIFICARE:OK, quindi non ho ancora tutte le risposte alla mia domanda.Ma sembra che .NET non semplificherà l'uso della chiave privata per la crittografia (se ciò è possibile, le risposte non sono realmente d'accordo su questo).

Il percorso che seguirò è questo (in base al mio caso d'uso):

  • Utilizzerò la chiave privata per firmare la licenza.
  • Utilizzerò la chiave pubblica per verificare che la licenza sia stata firmata dalla chiave privata
  • Pubblicherò un'altra domanda rivolta agli sviluppatori PHP su come utilizzare le chiavi .NET (prodotte da sn.exe) per firmare del testo
  • Non sono veramente preoccupato che l'utente veda la licenza, dato che è comunque un hash e calcolata da cose che già conosce.Tutto quello che voglio è rendere troppo difficile per il tuo tipico architetto edile copiare il mio software senza che io lo sappia (ricorda, il software sarà freeware - tutto ciò che voglio è una traccia cartacea di chi lo ha installato... )

Grazie mille per le tue risposte.

È stato utile?

Soluzione

Non in .NET.

In molti algoritmi tradizionali di crittografia a chiave pubblica, come RSA, è possibile crittografare e decrittografare in entrambi i modi, in genere un modo è chiamato "crittografia" e l'altro "firma", anche se in realtà si ottiene una versione crittografata di qualcosa in entrambi i modi.

Tuttavia, in .NET l'implementazione RSA è stata paralizzata e al momento della firma verranno prodotti solo riassunti dell'input, non l'intera informazione elaborata.

Sembra che ci sia qualche disaccordo su cosa si può e cosa non si può fare con RSA, quindi permettimi di modificare la mia risposta per essere più specifico.

Sto parlando della matematica RSA, non di una particolare implementazione RSA.

La matematica RSA consente di codificare le informazioni su una delle due chiavi (privata o pubblica) e i dati codificati possono essere decodificati solo con l'altra delle due chiavi.

In genere, si codifica con una chiave pubblica, crittografando le informazioni, e si decodifica con la chiave privata, decrittografando le informazioni.Oppure si prende un hash delle informazioni, lo si codifica con la chiave privata, si firma l'hash e si decodifica l'hash con la chiave pubblica, per confrontare e verificare la firma.

Le implementazioni tipiche non consentono di eseguire la codifica completa dei dati da privato a pubblico, solo eseguendo l'hashing dei dati, ma la matematica dietro RSA lo consente pienamente.

Altri suggerimenti

Non è possibile decrittografare utilizzando la chiave pubblica.In questo modo si perderebbe il significato stesso del "pubblico".

(Tuttavia potresti essere in grado di firmare qualcosa utilizzando la chiave privata, quindi verificare la firma utilizzando la chiave pubblica.Questo è lo scopo per cui il framework utilizza le chiavi: l'assembly è firmato e la chiave pubblica viene utilizzata per verificare la firma.)

Questo può essere fatto utilizzando SignedXml http://msdn.microsoft.com/en-us/library/ms229745.aspx.A un livello inferiore è possibile utilizzare RSAPKCS1SignatureDeformatter e RSAPKCS1SignatureFormatter.Funzionano crittografando un hash dei dati e quindi confrontando i dati con l'hash (decrittografato) dell'altra estremità.Credo che l'hashing venga utilizzato perché la crittografia della chiave privata può gestire solo piccoli dati.Non sono sicuro di riutilizzare la chiave pubblica dell'assembly, se causa problemi è sufficiente utilizzare una coppia di chiavi separata.

Un avvertimento: dai un'occhiata a questo perché queste lezioni possono comportare interruzioni di 20 secondi! http://www.pcreview.co.uk/forums/thread-3428177.php

Questo approccio è vulnerabile alla manomissione del codice di verifica della firma utilizzando Reflexil, ma questa è un’altra questione.

Ho scritto quanto segue ma rileggendo penso che tu abbia già capito questo:Non stai realmente cercando di crittografare o nascondere i dati dell'utente, vuoi impedirgli di creare o manomettere la licenza.Hai ragione nel dire che a questo scopo è possibile utilizzare un algoritmo di crittografia a chiave privata pubblica.Questo è noto come Firma utilizzando una chiave privata (generazione di licenze lato server).E verifica della firma tramite chiave pubblica (controllo della licenza nell'app).Cito questa terminologia perché aiuterà con la ricerca.

In RSA le chiavi pubbliche vengono utilizzate per la crittografia, le chiavi private vengono utilizzate per la decrittografia.Non puoi usare una chiave pubblica per decriptare nulla...

In RSA l'unica differenza effettiva tra una chiave pubblica e una chiave privata è quale mantenere segreta.

Quindi puoi utilizzare una chiave pubblica come chiave di crittografia e decrittografare con la chiave privata oppure utilizzare la chiave privata come chiave di crittografia e decrittografare con la chiave pubblica.

La crittografia con la chiave privata viene utilizzata per le firme digitali (chiunque può decodificare con la chiave pubblica).

Ma come @Lasse V.Karlsen ha sottolineato che .Net potrebbe rendere il tutto più difficile di quanto dovrebbe essere...

Penso che entrambe le direzioni siano possibili: crittografare con pubblico, decrittografare con privato e crittografare con chiave privata.Il secondo è il modo in cui funziona la firma digitale.

Avvertimento!Questa risposta è sbagliata, ma la lascerò comunque qui perché la serie di commenti allegati sono, penso, di sufficiente interesse per gli altri da mantenere la risposta in giro.Ok, mi fa fare la figura dell'idiota, ma per me non è una novità ;) Vota come preferisci.

Una chiave pubblica può essere utilizzata per: -

  • Crittografa qualcosa che può essere decrittografato solo con la chiave privata
  • Autentica qualcosa firmato con la chiave privata

Non può essere utilizzato per decrittografare qualcosa da crittografare con una chiave privata.È per questo motivo che il sistema a chiave pubblica/privata viene definito sistema asimmetrico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top