C # Шифрование пошло не так, часть 2 - PullRequest
1 голос
/ 01 октября 2009

На самом деле не очень хорошая неделя с шифрованием. Позвольте мне объяснить, что мне нужно.

  1. Я хочу зашифровать строковые значения в файл ....
  2. Я хочу расшифровать содержимое файла обратно в строку, используя C #
  3. Я хочу сделать это, не беспокоясь о машинном магазине, пользовательском магазине или любом другом магазине, ни реестре, и т. Д.
  4. Любой ключ безопасности может быть отправлен в моем приложении.

безопасность не должна быть удивительно сильной, и мой код запутан.

Я просто хочу портативное решение. Я попробовал RSA, и он быстро ни к чему не привел, когда я обнаружил, что в работе отсутствует определенный ключевой файл, о котором я ничего не знаю и не могу найти его на компьютере разработчика.

Пожалуйста, помогите.

Ответы [ 5 ]

3 голосов
/ 01 октября 2009

Вот некоторый код, который я использую довольно часто (адаптированный из источника в сети), который опирается исключительно на ключевую фразу, хранящуюся в web.config / app.config при настройках. Используется тройной дес.

 /// <summary>
        /// Encrypts the string.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <returns>Encrypted string</returns>
        public string EncryptString(string text)
        {
            // Locals
            var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
            byte[] results;
            var utf8 = new UTF8Encoding();

            // Step 1. We hash the passphrase using MD5
            // We use the MD5 hash generator as the result is a 128 bit byte array
            // which is a valid length for the TripleDES encoder we use below
            var hashProvider = new MD5CryptoServiceProvider();
            var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            // Step 3. Setup the encoder
            var tdesAlgorithm = new TripleDESCryptoServiceProvider
                                    {
                                        Key = tdesKey,
                                        Mode = CipherMode.ECB,
                                        Padding = PaddingMode.PKCS7
                                    };

            // Step 4. Convert the input string to a byte[]
            var dataToEncrypt = utf8.GetBytes(text);

            // Step 5. Attempt to encrypt the string
            try
            {
                var encryptor = tdesAlgorithm.CreateEncryptor();
                results = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
            }
            finally
            {
                // Clear the TripleDes and Hashprovider services of any sensitive information
                tdesAlgorithm.Clear();
                hashProvider.Clear();
            }

            // Step 6. Return the encrypted string as a base64 encoded string
            return Convert.ToBase64String(results);
        }

        /// <summary>
        /// Decrypts the string.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <returns>Decrypted string</returns>
        public string DecryptString(string text)
        {
            // Locals
            var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
            byte[] results;
            var utf8 = new UTF8Encoding();

            // Step 1. We hash the passphrase using MD5
            // We use the MD5 hash generator as the result is a 128 bit byte array
            // which is a valid length for the TripleDES encoder we use below
            var hashProvider = new MD5CryptoServiceProvider();
            var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            // Step 3. Setup the decoder
            var tdesAlgorithm = new TripleDESCryptoServiceProvider
                                    {
                                        Key = tdesKey,
                                        Mode = CipherMode.ECB,
                                        Padding = PaddingMode.PKCS7
                                    };

            // Step 4. Convert the input string to a byte[]
            var dataToDecrypt = Convert.FromBase64String(text);

            // Step 5. Attempt to decrypt the string
            try
            {
                var decryptor = tdesAlgorithm.CreateDecryptor();
                results = decryptor.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
            }
            finally
            {
                // Clear the TripleDes and Hashprovider services of any sensitive information
                tdesAlgorithm.Clear();
                hashProvider.Clear();
            }

            // Step 6. Return the decrypted string in UTF8 format
            return utf8.GetString(results);
        }

Первоначальный источник был здесь: http://www.dijksterhuis.org/encrypting-decrypting-string/

2 голосов
/ 01 октября 2009

Вы не можете хранить секреты в приложении. Период. Если приз чего-то стоит, кто-нибудь найдет ваш секретный ключ. В этот день и возраст достаточно одного раза. Google даст ответ для любого , кому интересно найти этот ключ. И как только ключ скомпрометирован, он скомпрометирует данные для всех, везде.

Ваш секрет (ключ) должен исходить извне (например, предоставленный пользователем пароль, предоставленные сертификаты и ключи, протоколы обмена ключами).

Если вы настаиваете на хранении ключа в приложении, обеспечивая тем самым минимальный уровень запутывания данных (не полностью защищен), то используйте алгоритм CryptoStream и симметричного ключа, как в примере на основе Rijndael в http://msdn.microsoft.com/en-us/library/system.security.cryptography.cryptostream.aspx с жестким ключом. Но вы должны понять, что это не что иное, как запутывание.

1 голос
/ 01 октября 2009

Если у вас возникли проблемы с созданием ключей, попробуйте CrypTool , чрезвычайно полезный инструмент для изучения криптологии.

1 голос
/ 01 октября 2009

Из ответа Эрика звучит так, как будто вы все усложняете, чем должны; возможно, пытаясь асимметричного шифрования, когда это не нужно?

Для того типа шифрования, который вы описываете, вам действительно нужно просто передать несколько аргументов в метод шифрования и дешифрования, чтобы выполнить вашу задачу.

Взгляните на этот пример из CodeProject. Он использует алгоритм Rijndael простым способом и даже включает в себя код для чтения / записи файлов.

1 голос
/ 01 октября 2009

Вы смотрели на Bouncy Castle API ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...