На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Шифрование строки для конфигурационного файла
    Хотел бы в параметрах конфигурационного файла строковые значения некоторых параметров указывать в зашифрованном виде. Для этого мне нужно сделать программу, в которой я вводил бы незашифрованное значение параметра, а получал бы зашифрованную строку, которую я бы вставлял в конфигурационный файл. В основной программе я бы считанные из конфигурационного файла строки расшифровывал и сравнивал с незашифрованными значениями. Я посмотрел некоторые статьи в интернете, но как-то все очень сложно - хэши, открытый и закрытый ключи, различные алгоритмы шифрования. Программой будут пользоваться обычные пользователи, вряд ли они будут дизассемблировать код и пытаться расшифровать значения параметров программы для внутреннего применения. Посоветуйте, пожалуйста, как проще решить эту задачу с помощью NET.
      Не знаю зачем, можно так Blowfish Block Cipher
        Кому нужны значения параметров в твоей программе, тот дизассемблирует твой код,код сшарп извлекается из компилированной программы на рвз.
        Или делай качественно или не делай совсеи.
          Цитата tumanovalex @
          Я посмотрел некоторые статьи в интернете, но как-то все очень сложно


          Читайте про DESCryptoServiceProvider, из System.Security.Cryptography. NET полностью реализует DES шифрование, и оборачивает его в стрим, для вас код ничем не будет отличаться, например, от кода записи строки в файл.

          Вот пример того как вы это можете сделать (я заполнил ключи случайными значениями только что, можете их переделать ещё раз)
          ExpandedWrap disabled
            using System;
            using System.IO;
            using System.Text;
            using System.Security.Cryptography;
             
            namespace Server.Network.Protocol {
             
                /// <summary>
                /// Сервис шифрования данных симметричным алгоритмом с публичным фрагментом ключа
                /// Реализован через CryptoStream
                /// </summary>
                public class CryptoHandler {
             
                    private static byte[] symmetric  = new byte[] { 0x13, 0xb0, 0x8e, 0x31, 0x12, 0x01, 0x14, 0xc1 };
                    private static byte[] privateKey = new byte[] { 0xa1, 0x54, 0xff, 0x77, 0xcc, 0xe4, 0x10, 0x07 };
             
                    /// <summary>
                    /// Шифрует данные алгоритмом DES
                    /// </summary>
                    /// <param name="bytes">Входные данные</param>
                    /// <param name="key">Ключ шифрования</param>
                    /// <returns>Возвращает зашифрованные данные</returns>
                    public static byte[] Crypt(byte[] bytes) {
                        byte[] result = null;
                        using (var memoryInputStream = new MemoryStream(bytes)) {
                            using (var memoryOutputStream = new MemoryStream()) {
                                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                                cryptic.Key = privateKey;
                                cryptic.IV  = symmetric;
                                using (var cryptoStream = new CryptoStream(memoryOutputStream, cryptic.CreateEncryptor(), CryptoStreamMode.Write)) {
                                    CopyTo(memoryInputStream, cryptoStream);
                                }
                                result = memoryOutputStream.ToArray();
                            }
                        }
                        return result;
                    }
             
                    /// <summary>
                    /// Расшифровывает данные алгоритмом DES
                    /// </summary>
                    /// <param name="bytes">Входные зашифрованные данные</param>
                    /// <param name="key">Ключ шифрования</param>
                    /// <returns>Возвращает расшифрованные данные</returns>
                    public static byte[] Decrypt(byte[] bytes) {
                        byte[] result = null;
                        using (var memoryInputStream = new MemoryStream(bytes)) {
                            using (var memoryOutputStream = new MemoryStream()) {
                                DESCryptoServiceProvider cryptic = new DESCryptoServiceProvider();
                                cryptic.Key = privateKey;
                                cryptic.IV  = symmetric;
                                using (var cryptoStream = new CryptoStream(memoryOutputStream, cryptic.CreateDecryptor(), CryptoStreamMode.Write)) {
                                    CopyTo(memoryInputStream, cryptoStream);
                                }
                                result = memoryOutputStream.ToArray();
                            }
                        }
                        return result;
                    }
             
                    public static byte[] GetBytes(string data) {
                        return Encoding.Unicode.GetBytes(data);
                    }
             
                    public static string GetString(ref byte[] data) {
                        return GetString(ref data, 0);
                    }
             
                    public static string GetString(ref byte[] data, int offset) {
                        return GetString(ref data, offset, data.Length - offset);
                    }
             
                    public static string GetString(ref byte[] data, int offset, int length) {
                        return Encoding.Unicode.GetString(data, offset, length);
                    }
             
                    private static void CopyTo(Stream input, Stream output) {
                        byte[] buffer = new byte[1024 * 32];
                        int num;
                        while((num = input.Read(buffer, 0, buffer.Length)) != 0) {
                            output.Write(buffer, 0, num);
                        }
                    }
             
                }
             
            }


          Теперь вы сможете применять это, примерно так:

          ExpandedWrap disabled
            string text    = "Вася";
            byte[] data    = CryptoHandler.Crypt(CryptoHandler.GetBytes(text)); // зашифровывает данные
             
            byte[] decrypt = CryptoHandler.Decrypt(data); // расшифрованные данные
            string result = CryptoHandler.GetString(ref decrypt); // восстанавливаем в строку


          Максимум с чем вы столкнётесь - это сложность хранения или записи двоичных данных совместно с текстовыми (если я правильно понял, конфиги у вас именно текстовые). Но, тут так же, можно прибегать к хитростям, на вроде - преобразования двоичных данных в текстовый формат, тот же base64.

          Цитата MIF @
          Или делай качественно или не делай совсеи.

          Не стоит так категорично...
          Сообщение отредактировано: VisualProg -
            VisualProg, спасибо большое!
            MIF, я же объяснил, что никто дизассемблировать программу не будет
            0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
            0 пользователей:


            Рейтинг@Mail.ru
            [ Script execution time: 0,0346 ]   [ 17 queries used ]   [ Generated: 18.04.24, 17:38 GMT ]