Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.216.94.152] |
|
Сообщ.
#1
,
|
|
|
Хотел бы в параметрах конфигурационного файла строковые значения некоторых параметров указывать в зашифрованном виде. Для этого мне нужно сделать программу, в которой я вводил бы незашифрованное значение параметра, а получал бы зашифрованную строку, которую я бы вставлял в конфигурационный файл. В основной программе я бы считанные из конфигурационного файла строки расшифровывал и сравнивал с незашифрованными значениями. Я посмотрел некоторые статьи в интернете, но как-то все очень сложно - хэши, открытый и закрытый ключи, различные алгоритмы шифрования. Программой будут пользоваться обычные пользователи, вряд ли они будут дизассемблировать код и пытаться расшифровать значения параметров программы для внутреннего применения. Посоветуйте, пожалуйста, как проще решить эту задачу с помощью NET.
|
Сообщ.
#2
,
|
|
|
Не знаю зачем, можно так Blowfish Block Cipher
|
Сообщ.
#3
,
|
|
|
Кому нужны значения параметров в твоей программе, тот дизассемблирует твой код,код сшарп извлекается из компилированной программы на рвз.
Или делай качественно или не делай совсеи. |
Сообщ.
#4
,
|
|
|
Цитата tumanovalex @ Я посмотрел некоторые статьи в интернете, но как-то все очень сложно Читайте про DESCryptoServiceProvider, из System.Security.Cryptography. NET полностью реализует DES шифрование, и оборачивает его в стрим, для вас код ничем не будет отличаться, например, от кода записи строки в файл. Вот пример того как вы это можете сделать (я заполнил ключи случайными значениями только что, можете их переделать ещё раз) 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); } } } } Теперь вы сможете применять это, примерно так: string text = "Вася"; byte[] data = CryptoHandler.Crypt(CryptoHandler.GetBytes(text)); // зашифровывает данные byte[] decrypt = CryptoHandler.Decrypt(data); // расшифрованные данные string result = CryptoHandler.GetString(ref decrypt); // восстанавливаем в строку Максимум с чем вы столкнётесь - это сложность хранения или записи двоичных данных совместно с текстовыми (если я правильно понял, конфиги у вас именно текстовые). Но, тут так же, можно прибегать к хитростям, на вроде - преобразования двоичных данных в текстовый формат, тот же base64. Цитата MIF @ Или делай качественно или не делай совсеи. Не стоит так категорично... |
Сообщ.
#5
,
|
|
|
VisualProg, спасибо большое!
MIF, я же объяснил, что никто дизассемблировать программу не будет |