2009-09-27 2 views
5

Ho un'applicazione .NET. Ho bisogno di memorizzare un valore di testo crittografato in un file, quindi recuperare il valore crittografato da qualche altra parte nel codice e decodificarlo.Come posso eseguire una semplice crittografia e decrittografia dei file?

Non ho bisogno il metodo di crittografia più forte o più sicuro sulla terra, solo qualcosa che basti dire - Ho il valore criptato, e sono in grado di decifrarlo.

Ho cercato molto sulla rete per provare a utilizzare la crittografia, ma la maggior parte degli esempi che trovo, non definiscono chiaramente i concetti, e la parte peggiore è che sembrano essere specifici della macchina.

In sostanza, qualcuno può inviare un collegamento a un metodo di crittografia facile da utilizzare che può crittografare i valori stringa in un file e quindi recuperare questi valori.

+0

"Non ho bisogno del metodo di crittografia più forte o più sicuro al mondo" - quindi perché crittografarlo? Se non si utilizza la crittografia avanzata e l'informazione ha valore, è molto probabile che qualcuno ** lo decifri. – TrueWill

+1

È come se ti chiedessi quale sistema di sicurezza inserire nel tuo edificio, ma non ci stai dicendo cosa c'è di prezioso nell'edificio. Il sistema di sicurezza in una banca è molto diverso dal sistema di sicurezza di un'ambasciata. Non possiamo raccomandare un algoritmo di crittografia finché non sappiamo cosa viene protetto e da quale minaccia. Descrivi la risorsa che stai proteggendo e la minaccia che ti preoccupa prima di decidere di lanciare la crittografia sul problema; la crittografia potrebbe non essere la soluzione giusta. Un ACL potrebbe essere la soluzione giusta o qualche altra tecnologia di sicurezza. –

+1

Inoltre, non dimenticare che ciò che rende sicura la crittografia è la sicurezza della chiave. * Come procederai alla gestione sicura delle chiavi? * Questo è il problema più difficile.L'utilizzo di un algoritmo di crittografia standard è facile al confronto. –

risposta

4

La libreria di estensione Stackoverflow ha ottenuto due piccole estensioni per crittografare la stringa & decifrata con RSA. Topic Here Utilizzato un paio di volte ma non l'ho provato veramente, ma è nella libreria di estensioni SO, quindi presumo che sia testato come stabile &.

Encrypt;

public static string Encrypt(this string stringToEncrypt, string key) 
     { 
      if (string.IsNullOrEmpty(stringToEncrypt)) 
      { 
       throw new ArgumentException("An empty string value cannot be encrypted."); 
      } 

      if (string.IsNullOrEmpty(key)) 
      { 
       throw new ArgumentException("Cannot encrypt using an empty key. Please supply an encryption key."); 
      } 

      System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters(); 
      cspp.KeyContainerName = key; 

      System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp); 
      rsa.PersistKeyInCsp = true; 

      byte[] bytes = rsa.Encrypt(System.Text.UTF8Encoding.UTF8.GetBytes(stringToEncrypt), true); 

      return BitConverter.ToString(bytes); 
     } 

Decrittografia;

public static string Decrypt(this string stringToDecrypt, string key) 
     { 
      string result = null; 

      if (string.IsNullOrEmpty(stringToDecrypt)) 
      { 
       throw new ArgumentException("An empty string value cannot be encrypted."); 
      } 

      if (string.IsNullOrEmpty(key)) 
      { 
       throw new ArgumentException("Cannot decrypt using an empty key. Please supply a decryption key."); 
      } 

      try 
      { 
       System.Security.Cryptography.CspParameters cspp = new System.Security.Cryptography.CspParameters(); 
       cspp.KeyContainerName = key; 

       System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider(cspp); 
       rsa.PersistKeyInCsp = true; 

       string[] decryptArray = stringToDecrypt.Split(new string[] { "-" }, StringSplitOptions.None); 
       byte[] decryptByteArray = Array.ConvertAll<string, byte>(decryptArray, (s => Convert.ToByte(byte.Parse(s, System.Globalization.NumberStyles.HexNumber)))); 


       byte[] bytes = rsa.Decrypt(decryptByteArray, true); 

       result = System.Text.UTF8Encoding.UTF8.GetString(bytes); 

      } 
      finally 
      { 
       // no need for further processing 
      } 

      return result; 
     } 
+0

Esattamente la risposta che stavo cercando, qualcosa che funziona e non eccessivamente complicata. Userò questo come riferimento per saperne di più su RSA. Grazie ancora Tiax –

+0

Ok per le stringhe brevi, ma fallirà per le stringhe di input più lunghe di 86 caratteri. In generale, RSA non è adatto per grandi quantità di dati. –

1

Se si sta cercando di eseguire la crittografia simmetrica, prenderei in considerazione lo Enterprise Library Cryptography Application Block. David Hayden had a useful blog post about it, sebbene sia per Enterprise Library 2.0 (l'attuale è 4.1), penso che lo sarà ancora utile.

+0

Grazie Richard, l'hai già usato? –

+0

Sì, era abbastanza facile da usare e lo strumento di configurazione era abbastanza semplice. Fondamentalmente ho usato lo scenario descritto in Deploying the Cryptography Application Block- http://msdn.microsoft.com/en-us/library/dd203351.aspx – RichardOD

+0

@Richard, occupato seguendo l'esempio nel blog, e poi arrivare a questo point ... http://s637.photobucket.com/albums/uu91/mleppan/?action=view¤t=Capture.png, questo significa che se creo un file crittografato sulla mia macchina dev locale, non posso decodificarlo su un server web ospitato? –

0

Ecco un post del blog che utilizza la libreria di crittografia fornita da .NET per una crittografia/decrittografia simmetrica.

Un algoritmo simmetrico utilizza la stessa chiave per crittografare e decodificare, proprio come si usa una chiave per bloccare e sbloccare la portiera della macchina.

Un algoritmo a chiave pubblica utilizza una chiave per crittografare e un'altra per decodificare, quindi, posso inviarti un file crittografato, e so che solo tu puoi decrittografarlo, dato che hai mantenuto la tua chiave molto sicura e privata .

http://blog.binaryocean.com/2006/01/08/NETSymmetricEncryption.aspx