2009-09-30 22 views
5

Ho una semplice configurazione client/server. Sia il client che il server hanno una chiave privata.Crittografia client .NET leggera e leggera -> Decrittografia server

Ciò che mi .NET offrire in termini di

ClientData-> ClientEncrypt con KEY-> Trasmetti a Server-> ServerDecrypt con KEY-> ClientData

Qualcuno può suggerire eventuali librerie veloce semplice da leggere su?

Grazie

+0

Winform o app Web? – StingyJack

risposta

2
using System; 
using System.Security.Cryptography; 
using System.IO; 
using System.Text; 

namespace ServiceConsole 
{ 
    public class Obfuscation 
    { 
     public static byte[] Encrypt(string data) 
     { 
      return Encrypt(data, SecurityCredentials.KeyString, SecurityCredentials.IvString); 
     } 

     public static byte[] Encrypt(string data, string key, string iv) 
     { 
      return Encrypt(data, key, iv, SecurityCredentials.PaddingString); 
     } 

     public static byte[] Encrypt(string data, string key, string iv, char paddingCharacter) 
     { 
      byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadLeft(32, paddingCharacter).Substring(0, 32)); 
      byte[] ivBytes = Encoding.UTF8.GetBytes(iv.PadLeft(32, paddingCharacter).Substring(0, 32)); 

      RijndaelManaged rijndaelManaged = new RijndaelManaged(); 
      rijndaelManaged.BlockSize = 256; 
      rijndaelManaged.KeySize = 256; 

      MemoryStream memoryStream = new MemoryStream(); 

      ICryptoTransform iCryptoTransform = rijndaelManaged.CreateEncryptor(keyBytes, ivBytes); 

      CryptoStream cryptoStream = new CryptoStream(memoryStream, iCryptoTransform, CryptoStreamMode.Write); 

      StreamWriter streamWriter = new StreamWriter(cryptoStream); 

      streamWriter.Write(data); 
      streamWriter.Flush(); 

      cryptoStream.FlushFinalBlock(); 

      byte[] returnBytes = memoryStream.ToArray(); 

      /// Disposal 
      streamWriter.Dispose(); 
      cryptoStream.Dispose(); 
      iCryptoTransform.Dispose(); 
      memoryStream.Dispose(); 
      rijndaelManaged.Clear(); 
      /// 

      return returnBytes; 
     } 

     public static string Decrypt(byte[] data) 
     { 
      return Decrypt(data, SecurityCredentials.KeyString, SecurityCredentials.IvString); 
     } 

     public static string Decrypt(byte[] data, string key, string iv) 
     { 
      return Decrypt(data, key, iv, SecurityCredentials.PaddingString); 
     } 

     public static string Decrypt(byte[] data, string key, string iv, char paddingCharacter) 
     { 
      byte[] keyBytes = Encoding.UTF8.GetBytes(key.PadLeft(32, paddingCharacter).Substring(0, 32)); 
      byte[] ivBytes = Encoding.UTF8.GetBytes(iv.PadLeft(32, paddingCharacter).Substring(0, 32)); 

      RijndaelManaged rijndaelManaged = new RijndaelManaged(); 
      rijndaelManaged.BlockSize = 256; 
      rijndaelManaged.KeySize = 256; 

      MemoryStream memoryStream = new MemoryStream(data); 

      ICryptoTransform iCryptoTransform = rijndaelManaged.CreateDecryptor(keyBytes, ivBytes); 

      CryptoStream cryptoStream = new CryptoStream(memoryStream, iCryptoTransform, CryptoStreamMode.Read); 

      StreamReader streamReader = new StreamReader(cryptoStream); 

      string returnString = streamReader.ReadLine(); 

      /// Disposal 
      streamReader.Dispose(); 
      cryptoStream.Dispose(); 
      iCryptoTransform.Dispose(); 
      memoryStream.Dispose(); 
      rijndaelManaged.Clear(); 
      /// 

      return returnString; 
     } 
    } 
} 
(o semplicemente google in giro!)
+0

pulito, ordinato e statico :) – divinci

2

RijndaelManaged:

Ecco an example:

private static string CreateEncryptedString(string myString, string hexiv, string key) 
     { 
      RijndaelManaged alg = new RijndaelManaged(); 
      alg.Padding = PaddingMode.Zeros; 
      alg.Mode = CipherMode.CBC; 
      alg.BlockSize = 16 * 8; 
      alg.Key = ASCIIEncoding.UTF8.GetBytes(key); 
      alg.IV = StringToByteArray(hexiv); 
      ICryptoTransform encryptor = alg.CreateEncryptor(alg.Key, alg.IV); 

      MemoryStream msStream = new MemoryStream(); 
      CryptoStream mCSWriter = new CryptoStream(msStream, encryptor, CryptoStreamMode.Write); 
      StreamWriter mSWriter = new StreamWriter(mCSWriter); 
      mSWriter.Write(myString); 
      mSWriter.Flush(); 
      mCSWriter.FlushFinalBlock(); 

      var EncryptedByte = new byte[msStream.Length]; 
      msStream.Position = 0; 
      msStream.Read(EncryptedByte, 0, (int)msStream.Length); 

      return ByteArrayToHexString(EncryptedByte); 

     } 
     public static byte[] StringToByteArray(String hex) 
     { 
      int NumberChars = hex.Length; 
      byte[] bytes = new byte[NumberChars/2]; 
      for (int i = 0; i < NumberChars; i += 2) 
       bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
      return bytes; 
     } 
     public static string ByteArrayToHexString(byte[] ba) 
     { 
      StringBuilder hex = new StringBuilder(ba.Length * 2); 
      foreach (byte b in ba) 
       hex.AppendFormat("{0:x2}", b); 
      return hex.ToString(); 
     } 

Si può facilmente venire fuori con un algoritmo di decrittazione e gli esempi

+2

Re: googling per una soluzione ... Sì, ma assicurati di non copiarne uno sbagliato =) (http://www.codinghorror.com/blog/archives/001268.html) – StingyJack

Problemi correlati