2009-09-30 9 views
5

私はシンプルなクライアント/サーバー設定を持っています。クライアントとサーバーの両方に秘密鍵があります。高速軽量.NETクライアント暗号化 - >サーバー復号化

何.NET

ClientData-> ClientEncryptとKEY->送信するサーバー - > ServerDecryptとKEY-> ClientData

の方法で私を提供しないことは誰もが読むために任意の速い、簡単なライブラリを提案することができます上に?

おかげ

+0

WinformsまたはWebアプリケーション? – StingyJack

答えて

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; 
     } 
    } 
} 
+0

きちんと整理と静的:) – divinci

2

RijndaelManaged

ここ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(); 
     } 

あなたは簡単に解読アルゴリズムと例に出てくることができ

+2

Re:グーグルの解決策は...はい、でも悪い方はコピーしないでください=)(http://www.codinghorror.com/blog/archives/001268.html) – StingyJack

関連する問題