Pull to refresh

Первые шаги в криптографии, или как я сосал из пальца

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

Как все начиналось.


Все начиналось очень даже непримечательно. Я читал книгу по C++, выяснил, что можно проинкрементировать даже символ(тогда это для меня было ого-го какое откровение), также я научился работать с файлами. Ну что-же, взял и написал я программу, которая инкрементирует каждый символ файла. Штука бестолковая, но я был в восторге и очень собой гордился. Прошло несколько дней, я подумал и написал другую программу, которая декрементировала каждый символ файла. Тут я подумал: «Да это же шифровка и расшифровка, какой я умный!»

Как зародилась идея.


Но радость моя была недолгой. Однажды на форуме я наткнулся на интересную фразу… была она примерно такой: «XORом круче всего шифровать» — тут мое самолюбие было задето и я решил выяснить. что же за XOR то такой волшебный. До этого я знал только логический XOR(оператор ^^), да и тот редко использовал. Что я сделал первым делом? Не зная как пишется побитовый оператор(да и лишь догадываясь о том, что он должен быть побитовый, если честно), я написал такую штуку:

#include<iostream>  
using namespace std;  
int man(){  
char c='a' xor 'b';  
cout << c << endl << c xor 'b' << endl;  
}


Я думаю, всем понятно как эта штука работала. Я вдруг понял, что если «проXORить» символ на другой символ дважды, то получиться тот самый символ. Тут я стал думать. Ведь теперь я могу вместо двух программ(одна шифрует, другая расшифровует) сделать одну. Здорово? Здорово. Хоть и примитивно.

Что получилось.


Дело оставалось за малым. Я сделал так, чтобы можно было шифровать под ключ(последовательно «XORя» на каждый символ строки, содержащей ключ). Вылизал ее, сделал красивой, мою программу. Получилось что-то такое:

#include<iostream>
#include<fstream>
#include<string>
using namespace std;
char cr(int c, char key){
	return (c ^ key);
}
int main(int argc, char* argv[]){
fstream f1(argv[1], ios::in | ios::binary);
fstream f2(argv[3], ios::out | ios::binary);
const string key(argv[2]);
char c;
int j=0;
 while(true){
  	f1.get(c);
	if(!f1.eof()){
	  if (j>key.size())
	    j=0;
	  f2.put(cr(c, key[j]));
	  j++;
	}
	else break;
}
 f1.close();
 f2.close();


Все просто. Но это дало мне возможность почувствовать себя исследователем. Экспериментатором и первооткрывателем, и несмотря на то, что моя учительница по информатике сказала, что мне гораздо важнее выучить паскаль и комбинаторику, именно эта первая программа поняла мне определиться с дальнейшим жизненным путем.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.