2009-09-27 17 views
5

Bir .NET uygulamasına sahibim. Bir dosyada şifrelenmiş bir metin değerini saklamak, daha sonra şifrelenmiş değeri kodun başka bir yerinde almam ve şifresini çözmem gerekiyor.Bazı basit dosya şifreleme ve şifre çözme işlemleri nasıl yapılır?

Yeryüzünde en güçlü veya en güvenli şifreleme yöntemine ihtiyacım yok, sadece söyleyecek bir şey var - Şifreli bir değere sahibim ve şifresini çözebilirim.

Kriptografiyi denemek ve kullanmak için ağda çok fazla arama yaptım, ancak bulduğum örneklerin çoğu açıkça kavramları tanımlamıyor ve en kötü kısmı makineye özgü gibi görünüyor.

Temel olarak, bir kullanıcı, bir dosyaya dize değerleri şifreleyebilen kolay kullanımlı bir şifreleme yöntemine bir bağlantı gönderebilir ve sonra bu değerleri alabilir.

+0

"Yeryüzündeki en güçlü veya en güvenli şifreleme yöntemine ihtiyacım yok" - o zaman neden şifreleyin? Güçlü şifreleme kullanmazsanız ve bilgilerin değeri varsa, birisinin ** şifresini çözmesi çok olasıdır. – TrueWill

+1

Binanızda hangi güvenlik sisteminin uygulanacağını soruyorsunuz, ancak binadaki değerli şeyleri bize söylemiyorsunuz. Bir bankadaki güvenlik sistemi, bir büyükelçilikteki güvenlik sisteminden çok farklıdır. Neyin korunmakta olduğunu ve hangi tehlikeden olduğunu öğrenene kadar bir şifreleme algoritması öneremiyoruz. Korumayı sürdürdüğünüz kaynağı ve şifrelemeyi problemi atmaya karar vermeden önce endişelendiğiniz tehdidi açıklayın; şifreleme doğru çözüm olmayabilir. Bir ACL doğru çözüm veya başka bir güvenlik teknolojisi olabilir. –

+1

Ayrıca, şifrelemeyi güvenli kılan şeyin anahtarın güvenliği olduğunu unutmayın. * Güvenli anahtar yönetimini nasıl yapacaksınız? * Bu zor bir problem.Kullanıma hazır şifreleme algoritması ile karşılaştırma yapmak kolaydır. –

cevap

4

Stackoverflow Uzantısı kitaplığı, RSA ile & şifresini çözmek için iki güzel küçük uzantıya sahiptir. Topic Here Kendim birkaç kez kullanmıştım, ama gerçekten test etmedim, ancak SO Extension kütüphanesinde bulunuyor, bu yüzden testin & test edildiğini kabul ediyorum.

Şifrele;

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

Decrypt;

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

Tam aradığım cevap, işe yarayan ve aşırı karmaşık olmayan bir şey. Bunu RSA hakkında daha fazla bilgi edinmek için referans olarak kullanacağım. Tekrar teşekkürler Tiax –

+0

Kısa dizeler için Tamam ama 86 karakterden uzun giriş dizeleri için başarısız olur. Genel olarak, RSA büyük veri kütleleri için uygun değildir. –

1

Simetrik şifreleme yapmak istiyorsanız, o zaman Enterprise Library Cryptography Application Block'u düşünürdüm. David Hayden had a useful blog post about it, onun Enterprise Library 2.0 için olsa da (geçerli 4.1), yine de yararlı olacağını düşünüyorum.

+0

Teşekkürler Richard, daha önce kullandın mı? –

+0

Evet - kullanımı oldukça kolaydı ve yapılandırma aracı oldukça düzdü. Temel olarak, blogdaki örneği takip ederek, http://msdn.microsoft.com/en-us/library/dd203351.aspx – RichardOD

+0

@Richard adlı Şifreleme Uygulama Engelini Dağıtma bölümünde açıklanan senaryoda kullanıyorum point ... http://s637.photobucket.com/albums/uu91/mleppan/?action=view¤t=Capture.png, yani yerel dev makinemde şifreli bir dosya oluşturursam bunu yapamam barındırılan bir web sunucusunda şifresini çözmek? –

0

İşte bir simetrik şifreleme/şifre çözme için .NET ile birlikte gelen şifreleme kitaplığını kullanarak bir blog yazısı.

Simetrik bir algoritma, arabanızın kapısını kilitlemek ve kilidini açmak için bir anahtar kullandığınız gibi şifrelemek ve şifresini çözmek için aynı anahtarı kullanır.

Genel anahtar algoritması şifrelemek için bir anahtar ve şifresini çözmek için başka bir anahtar kullanır, böylece şifrelenmiş bir dosyayı gönderebilir ve anahtarınızı çok güvenli ve gizli tuttuğunuz için yalnızca şifreyi çözebilirseniz bunu bilirim .

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

İlgili konular