Приветствую всех. В последнее время часто встречаю вопросы как реализовать в своем приложении шифрование данных, для хранения или передачи их по сети. А после можно было бы их расшифровать и получить оригинал. Алгоритмов шифрования очень много, но в данной статье я покажу очень простой и быстрый способ шифрования.
Этот способ был применен еще в MicrosoftWorld 95 . Но и сейчас можно встретить похожие подходы применения шифрования. В коде который я приведу ниже, мы передаем строку в метод EncodeDecrypt, в ней строка разбивается на символы и передается в другой метод в котором производится шифрование данных, шифрованные буквы, а точнее символы в методе TopSecret происходит вычисления XOR операции над каждым символом по ключу.
И на выходе мы получаем зашифрованные данные, а в место привычных нам букв мы видим не понятные символы. Стоит заметить что в примере приведен ключ 16 битный и он будет подобран очень быстро, однако если вы ключ сделаете куда больше в 1000 раз к примеру, то такой ключ будет проблематично взломать, если это будет вообще возможно. По аналогии будет произведена расшифровка текста. И так посмотрим код программы.
Как сделать свой скрипт для шифрования (+ задачка)
class Program
static void Main ( string [ ] args )
ushort secretKey = 0x0088 ; // Секретный ключ (длина — 16 bit).
string str = «Hello World» ; //это строка которую мы зашифруем
str = EncodeDecrypt ( str , secretKey ) ; //производим шифрование
Console . WriteLine ( str ) ; //выводим в консоль зашифрованную строку
str = EncodeDecrypt ( str , secretKey ) ; //производим рассшифровку
Console . WriteLine ( str ) ; //выводим в консоль расшифрованную строку
Console . ReadKey ( ) ;
public static string EncodeDecrypt ( string str , ushort secretKey )
var ch = str . ToArray ( ) ; //преобразуем строку в символы
string newStr = «» ; //переменная которая будет содержать зашифрованную строку
foreach ( var c in ch ) //выбираем каждый элемент из массива символов нашей строки
newStr += TopSecret ( c , secretKey ) ; //производим шифрование каждого отдельного элемента и сохраняем его в строку
return newStr ;
public static char TopSecret ( char character , ushort secretKey )
character = ( char ) ( character ^ secretKey ) ; //Производим XOR операцию
return character ;
Весь код я закомментировал, и не старался его сокращать, я привел его в таком виде, что бы вам было более понятна работы такой программы построчно. Не думаю что у вас возникнут проблемы в его понимании. Такой подход шифрования можно использовать как в сетевых технологиях, типо игр,чата, но и в десктопных приложениях, веб приложениях скорость шифрования и дешифровки довольно высока, что скажется на быстрой работе вашей программы.
Обновлено: 03.03.2018 — 19:47
9 комментариев
Это не C#, а бейсик какой то. Где вы видели var в C#?
Вот на C#, проверил кодирует. Кстати спасибо за простой алгоритм =) using System.IO; class Program
static void Main(string[] args)
< ushort secretKey = 0x0088; // Секретный ключ (длина — 16 bit).
Асимметричное шифрование | Криптография
EncodeDecrypt(«D:\file.txt», «D:\cryptFile.txt», secretKey); // Кодируем
EncodeDecrypt(«D:\cryptFile.txt», «D:\newFile.txt», secretKey); // Декодируем
> public static void EncodeDecrypt(string FileRes, string FileDest, ushort secretKey)
FileStream fs = null; // исходный файл
FileStream rs = null; // результат try
if (File.Exists(FileDest))
File.Delete(FileDest); fs = new FileStream(FileRes, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
rs = new FileStream(FileDest, FileMode.CreateNew); List Bt = new List(); while (fs.Position < fs.Length)
byte B = (byte)fs.ReadByte();
B = (byte)(B ^ secretKey); // Не самая лучшая конструкция…
Bt.Add(B);
>
rs.Write(Bt.ToArray(), 0, Bt.Count);
>
catch (Exception ex)
Console.WriteLine(ex.Message);
>
finally
if (fs != null) fs.Close();
if (rs != null) rs.Close();
>
>
>
Хм. Согласен. В узко направленных случаях это прокатит, если пользователь использует современную версию Ms Framework.=))
Хочу заметить, что тут не шла речь о версиях выше VS 3.0 и о нужных сборках Microsoft Framework. А просто, цитирую «Этот способ был применен еще в MicrosoftWorld 95», заголовок «Как зашифровать и расшифровать данные на C#», что в моём случае выдало ошибку «»string» не содержит определения для «ToArr1ay» и не был найден метод расширения «ToArray», принимающий тип «string» в качестве первого аргумента (возможно, пропущена директива using или ссылка на сборку)» (22я стока по коду в примере)
По этому штатный пользователь не поймёт что вообще делать…
В широко использованной среде .NET версии 2.0 (не все современные компьютеры вообще поддерживают выше v2.0, я о фирмах, а не пользовательских ПК), нет понятий о Var в теле метода.
Пространство имён LINQ доступно с версии Ms Framefork 3.5 (в моём случае)
По этому следует указать в начале кода версию используемого Ms Framework, что бы не было притязаний.
От себя.
Сколько лет пишу программы на C# и не использую устаревших методов с Var, так как считал это пережитками прошло от Java. Замечал некоторые примеры кода с Var, но считал их некой переходной стадией от java-синтаксиса к c#-синтаксису и не воспринимал всерьёз.
Благодарю за конструктивную критику=)
Опять вы все не так поняли и ошибаетесь. Давайте все по порядку разложу В Java var появился лишь в прошлом годy. Интересно что это за компании использующие win95? Да еще встречаются с XP но там поддержка framework 4.0 в SP3. Преобладающая часть компанию уже ушла от использования windows вообще, в сторону Linux.
А по этому использовать этот пример в net Core так же возможно. Ошибку выдало вам потому что вы использовали не верный тип, полный код должен был выглядеть следующим образом.
public static string EncodeDecrypt(string str, ushort secretKey)
char[] ch = str.ToArray(); //преобразуем строку в символы
string newStr = «»; //переменная которая будет содержать зашифрованную строку
foreach (char c in ch) //выбираем каждый элемент из массива символов нашей строки
newStr += TopSecret(c, secretKey); //производим шифрование каждого отдельного элемента и сохраняем его в строку
return newStr;
>
Я вам так скажу что все современные языки выстроены таким образом, что бы облегчить разработку. К вашему сведению var очень помогает в этом, так как является «синтаксическим сахаром». Позволяя не писать тип объекта длинной в несколько десятков символов, а сократить всего до 3. Потом это просто вызывает привычку и многие его используют везде где это возможно.
Всё по порядку=)
Есть фирмы, которые до сих пор используют WinXP SP1 (но чаще SP2) с установленным MS Fw 2.0
И был случай, где мне пришлось усердно доказывать, что им просто жизненно необходимо установить хотя бы v2.0
Но зачастую директор отвечал просто, «Я ничего дополнительного устанавливать не буду, не можете выполнить работу, так и скажите…»
Вот почему важно, что бы всё работало на древности. (ну не все продвинутые) Больший интерес у меня вызвал ваш последний ответ со словами «потому что вы использовали не верный тип». Прошу прощения, не я =)
Код был для теста взят как есть с примера. Если там введена ошибка, моя ли вина? Или то, что не указаны требуемые сборки для безошибочного компилирования? И самое главное заблуждение, это виденье простоты в сложности чтения кода. Согласен, что код из 30и строк читать легко, но стоит ли ради 35и строк сокращать его, усложнив коротким словом (var), и сэкономить пару-тройку строк кода?
А если код из 40к строк, не дай бог запутаться в этих нестрого типизированных переменных.
На просторах инэта много обсуждений о рациональности этого удобства в C#
Я считаю, что лучше уделить немного времени для написания качественного кода, чем потом тратить часы на понимание своего же кода, через год, например.
Хорошо, используете вы XP SP1 кто мешает установить FW 3.5 на него? Ошибка явно не моя, а с вашей стороны, код приведенного примера верный, а знания языка программирования и его тонкостей для вставки кода никто не отменял, вам лишь надо было объявить явный тип, а для чего вы туда string пихать начали я не в курсе. Применения var никак не ухудшает его читаемость, так как тип образуется из создаваемого объекта. Не понимание var лишь свидетельствует о низком знания языка, и практики. 20 лет назад вместо него использовали object используйте его, но я сомневаюсь что это было легче.
IEnumerable query = from name in names where name.StartsWith(«A») select (Initial: name[0], LastName: name.Split(‘ ‘)[1]);
Сильно вам тут помог явный тип в понимании кода?
var names = new string[] ;
А тут у вас возникает затруднения в читаемости кода? Вам стоит подучить в таком случаи язык C#.
А как вы тогда предлагаете работать с анонимными типами или методами?
var names = new < name1 = «Сергей», name2=»Андрей», name3=»Дима» >;
Идти нужно в ногу со временем, иначе развития не было в ЯП, в ваше случаи вам тогда вообще не следовало переходить на C#, а использовать C++, тогда бы у вас никаких подобных проблем не возникало.
Я var использую почти 6 лет и коллеги мои тоже)
А кто-то в 2к19 пытается доказать, что это излишество не по времени)
Источник: www.nookery.ru
Пишем простую программу для шифрования сообщений
Доброго времени суток, господа. Сегодня на повестке дня у нас XOR — самый простой способ зашифровать текст. Я выбрал его для первого поста про шифрование информации так-как писать надо немного и код будет понятным для новичков.
using namespace std;
/* Функция для шифрования и дешифровки */
string XOR(string data, char key[])
/* Создаём новую переменную */
string xorstring = data;
/* Циклом перебираем все символы в строке и ксорим каждый отдельно */
xorstring[i] = data[i] ^ key[i % ( sizeof(*key) / sizeof(char) )];
/* Возвращаем зашифрованную строку */
return xorstring;
int main()
/* Создаем ключ для шифрования */
/* Создаём переменную которая будет содержать зашифрованный текст(в нашем случае Torchik_ru) */
/* В функцию передаётся сам текст, который надо преобразовать и ключ */
string dataE = XOR(string(«Torchik_Ru»), key);
/* Создаём переменную которая будет содеражать расшифрованный текст */
string dataD = XOR(dataE, key);
/* Выводим оба значения в терминал */
return 0;
Источник: dzen.ru
Шифр Вернама на JavaScript
Вчера мы показали вам невзламываемый шифр Вернама. Теперь напишем собственную реализацию этого шифра на JavaScript.
Принцип работы шифра Вернама
- Нам нужно исходное сообщение и ключ шифрования. Ключ должен быть таким же по размеру, как исходное сообщение, или больше.
- Каждый бит исходного сообщения сопоставляется с битом ключа шифрования. Производится специальная операция XOR, которая отвечает за кодирование
- На выходе получается зашифрованный текст, расшифровать который можно только имея под рукой секретный ключ.
Алгоритм
Сделаем классическую реализацию шифра Вернама:
- Спрашиваем текст исходного сообщения и ключ.
- Если ключ короче сообщения — говорим об этом и сразу генерируем новый ключ нужной длины.
- Шифруем сообщение и выводим результат в консоль.
Единственное отличие нашего алгоритма от классического — принудительная проверка длины ключа. Чтобы шифр нельзя было взломать, ключ должен быть как минимум той же длины, что и исходное сообщение.
Подготовка
Заведём нужные переменные:
// переменные для исходного сообщения, зашифрованного и ключа шифрования var input, output,key; // служебные переменные для шифра var inp, k;
Ещё нам понадобится функция, которая возвращает случайное число в указанном диапазоне. Её мы будем использовать для создания нового ключа, если ключ пользователя будет слишком короткий.
// генератор случайных чисел в заданном диапазоне function getRandomInt(min, max)
Последнее, что нам осталось сделать, — запросить у пользователя сообщение, которое будем шифровать, и ключ:
// запрашиваем текст, который будем шифровать input = prompt(«Введите исходный текст»); // запрашиваем ключ шифрования key = prompt(«Введите ключ»);
Проверяем ключ
Теперь, когда у нас есть сообщение и ключ, проверим, хватит ли длины ключа или нет. Если не хватит — выведем сообщение и сгенерируем новый ключ.
Обратите внимание на второй параметр в функции, которая возвращает случайное значение. В нашем примере мы взяли число 66535, потому что в первом регистре кодировки Unicode 66536 символов — от 0 до 66535, а JavaScript возвращает коды символов строки как раз в Unicode. Попробуйте поставить число поменьше, например 9999, и посмотрите, как меняются символы в ключе и в готовой шифровке.
Само генерирование ключа очень простое: мы берём случайное число, переводим его в строку функцией String.fromCharCode() и добавляем результат к строке с ключом.
// если длина ключа меньше длины сообщения — говорим пользователю и генерируем свой ключ if ((key.length) < (input.length)) < alert(«Ключ короче сообщения, это небезопасно. Скопируйте новый сгенерированный ключ из консоли браузера.»); // в самом начале ключ будет пустой key = «»; // генерируем новый ключ такой же длины, как и сообщение for (var i = 0; i < input.length; i++) < key += String.fromCharCode(getRandomInt(0,66535)); >// выводим новый ключ шифрования console.log(«Скопируйте новый ключ ↓»); console.log(key); >
Шифруем сообщение
В основе алгоритма Вернама лежит XOR — исключающее ИЛИ. Его особенность в том, что если его применить к зашифрованному тексту снова с тем же ключом, то мы получим расшифрованное исходное сообщение. Это значит, что этим алгоритмом мы можем и шифровать, и расшифровывать.
Логика работы алгоритма такая:
- Берём очередной символ сообщения и ключа.
- Получаем их числовой код.
- Применяем к ним XOR (в JavaScript эта операция обозначается крышечкой: ^) и получаем новое число.
- Это число переводим в символ и прибавляем к строке с зашифрованным текстом.
// шифруем сообщение output = «»; for (i = 0; i < input.length; i++) < // берём цифровое значение очередного символа в сообщении и ключе inp = input.charCodeAt(i); k = key.charCodeAt(i); // и применяем к ним исключающее или — XOR output += String.fromCharCode(inp ^ k); >// выводим результат шифрования console.log(«Результат работы алгоритма ↓»); console.log(output);
Если хотите проверить, как работает алгоритм, расшифруйте это сообщение
вот этим ключом:
Это может показаться удивительным, но в нашем примере длина ключа и сообщения совпадают. Это связано с особенностью кодировки Unicode — один код может одновременно кодировать несколько визуальных символов, поэтому длина кажется разной.
Что дальше
В нашей реализации шифра есть несколько минусов:
- в настоящей криптографии не используют функцию Math.random() в таком явном виде. Есть методы подбора и взлома этой псевдослучайной последовательности, по которой можно восстановить, казалось бы, случайные символы.
- Если мы хотим отправить длинное сообщение, то нам нужно его и ключ копировать и вставлять в поле ввода. Намного проще сделать чтение из файла — и сообщения, и ключа.
- Чтобы пользоваться этим алгоритмом, нужно постоянно передавать ключ, а это — проблема. Намного проще сделать так: сгенерировать очень длинную случайную последовательность и использовать её части при каждом шифровании или расшифровке. А использованные фрагменты сразу удалять, чтобы не снижать стойкость шифра.
- И да, у нас нет в явном виде функции расшифровки
Когда-нибудь мы соберёмся с силами и исправим все три пункта.
// генератор случайных чисел в заданном диапазоне function getRandomInt(min, max) < return Math.floor(Math.random() * (max — min)) + min; >// переменные для исходного сообщения, зашифрованного и ключа шифрования var input, output,key; // служебные переменные для шифра var inp, k; // запрашиваем текст, который будем шифровать input = prompt(«Введите исходный текст»); // запрашиваем ключ шифрования key = prompt(«Введите ключ»); // если длина ключа меньше длины сообщения — говорим пользователю и генерируем свой ключ if ((key.length) < (input.length)) < alert(«Ключ короче сообщения, это небезопасно. Скопируйте новый сгенерированный ключ из консоли браузера.»); // в самом начале ключ будет пустой key = «»; // генерируем новый ключ такой же длины, как и сообщение for (var i = 0; i < input.length; i++) < key += String.fromCharCode(getRandomInt(0,66535)); >// выводим новый ключ шифрования console.log(«Скопируйте новый ключ ↓»); console.log(key); > // шифруем сообщение output = «»; for (i = 0; i < input.length; i++) < // берём цифровое значение очередного символа в сообщении и ключе inp = input.charCodeAt(i); k = key.charCodeAt(i); // и применяем к ним исключающее или — XOR output += String.fromCharCode(inp ^ k); >// выводим результат шифрования console.log(«Результат работы алгоритма ↓»); console.log(output);
Источник: thecode.media