SORU
16 NİSAN 2012, PAZARTESİ


& C bir Dize şifreleme ve Şifresini çözmek#

C aşağıdaki tatmin edici en modern (en iyi) yolu nedir#?

string encryptedString = SomeStaticClass.Encrypt(sourceString);

string decryptedString = SomeStaticClass.Decrypt(encryptedString);

AMA en az yaygara tuzları, anahtarlar, byte ile dalga geçiyor ile ilgili[], vb.

Googling ve buluyorum ne de karıştı (benzer listesini ÇOK Edildikleri bu sormak için aldatıcı bir soru olduğunu görmek görebilirsiniz).

CEVAP
16 NİSAN 2012, PAZARTESİ


Diğer insanlar, Kriptografi en iyi kendi "şifreleme algoritması." haddeleme önlemek için o kadar basit değil dediğim gibi

Ancak, "kendi" kapsayıcı sınıf bir şeyin etrafında yerleşik RijndaelManaged kriptografi dersi gibi. roll yapabilirsiniz

Rijndael geçerli algoritmik adı kesinlikle kabul edilebilir bir algoritma kullaniyorsunuz Advanced Encryption Standard, "en iyi uygulama".

RijndaelManaged sınıf gerçekten normalde "" diziler, tuz, tuşu, başlatma vektörler vb byte ile. sürtmek gerektirir ama bu tam olarak biraz "" sınıf. sarıcı içinde soyutlanmış olabilir ayrıntı türüdür

Aşağıdaki sınıf bir yazdım bir süre önce gerçekleştirmek için tam olarak ne tür bir şeysin sonra, basit tek yöntem aramak için izin birkaç dize-tabanlı düz metin için şifreli bir dize tabanlı bir parola ile elde edilen şifreli bir dize olarak temsil edilen bir dize. Tabii ki, aynı şifre ile şifrelenmiş dize şifresini çözmek için eşdeğer bir yöntem var.

Not orada bir kaç takaslar burada olmasından dolayı basitleştirilmesi gibi sen üreten tuzu/IV değeri (temelde, aynı tuz/IV her zaman) ve ideal bir dünya (yani daha güvenli bir dünya) edersin kullanın farklı tuz için her dize istediğin için şifrelemek ve saklamak tuz ile birlikte şifreli bir sonuç.

"Güç" kullanarak bu (rağmen takaslar için basitlik) gelir kullanarak RijndaelManaged sınıf gerçekleştirmek için şifreleme için, birlikte kullanarak PasswordDeriveBytes işlev System.Security.Cryptography ad olan oluşturur sizin şifreleme anahtarı kullanarak bir standart ve güvenli algoritması (özellikle PBKDF1) dayanarak dize tabanlı bir parola sağlayın.

Bilmeden senin tam gereksinimleri, aradığını söyle olsun burası yeterince güvenli ihtiyaçlarınızı, ama eğer sen sadece sonra tek satırlık bir yöntemi çağırmak için hızlı bir şekilde şifrelemek bir dize, sanırım bu yeterli olur.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace EncryptStringSample
{
    public static class StringCipher
    {
        // This constant string is used as a "salt" value for the PasswordDeriveBytes function calls.
        // This size of the IV (in bytes) must = (keysize / 8).  Default keysize is 256, so the IV must be
        // 32 bytes long.  Using a 16 character string here gives us 32 bytes when converted to a byte array.
        private static readonly byte[] initVectorBytes = Encoding.ASCII.GetBytes("tu89geji340t89u2");

        // This constant is used to determine the keysize of the encryption algorithm.
        private const int keysize = 256;

        public static string Encrypt(string plainText, string passPhrase)
        {
            byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
            using (PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null))
            {
                byte[] keyBytes = password.GetBytes(keysize / 8);
                using (RijndaelManaged symmetricKey = new RijndaelManaged())
                {
                    symmetricKey.Mode = CipherMode.CBC;
                    using (ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes))
                    {
                        using (MemoryStream memoryStream = new MemoryStream())
                        {
                            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write))
                            {
                                cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length);
                                cryptoStream.FlushFinalBlock();
                                byte[] cipherTextBytes = memoryStream.ToArray();
                                return Convert.ToBase64String(cipherTextBytes);
                            }
                        }
                    }
                }
            }
        }

        public static string Decrypt(string cipherText, string passPhrase)
        {
            byte[] cipherTextBytes = Convert.FromBase64String(cipherText);
            using(PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, null))
            {
                byte[] keyBytes = password.GetBytes(keysize / 8);
                using(RijndaelManaged symmetricKey = new RijndaelManaged())
                {
                    symmetricKey.Mode = CipherMode.CBC;
                    using(ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, initVectorBytes))
                    {
                        using(MemoryStream memoryStream = new MemoryStream(cipherTextBytes))
                        {
                            using(CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
                            {
                                byte[] plainTextBytes = new byte[cipherTextBytes.Length];
                                int decryptedByteCount = cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
                                return Encoding.UTF8.GetString(plainTextBytes, 0, decryptedByteCount);
                            }
                        }
                    }
                }
            }
        }
    }
}

Yukarıdaki sınıf oldukça basitçe aşağıdakine benzer bir kod ile kullanılan:

using System;
using System.Linq;

namespace EncryptStringSample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Please enter a password to use:");
            string password = Console.ReadLine();
            Console.WriteLine("Please enter a string to encrypt:");
            string plaintext = Console.ReadLine();
            Console.WriteLine("");

            Console.WriteLine("Your encrypted string is:");
            string encryptedstring = StringCipher.Encrypt(plaintext, password);
            Console.WriteLine(encryptedstring);
            Console.WriteLine("");

            Console.WriteLine("Your decrypted string is:");
            string decryptedstring = StringCipher.Decrypt(encryptedstring, password);
            Console.WriteLine(decryptedstring);
            Console.WriteLine("");

            Console.ReadLine();
        }
    }
}

(16* *basit VS2010 örnek bir çözüm indirebilirsiniz).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:
C#

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • magnum33563

    magnum33563

    8 NİSAN 2011
  • RaverX DouBle StAg XI

    RaverX DouBl

    23 Mayıs 2008