Шифр XOR - очень плохой шифр, потому что если в исходной
последовательности встречается длинная цепочка одинаковых символов -
ключ шифрования вылетает в выходной поток в чистом или почти чистом
виде. Поэтому ломается такой шифр за 1 минуту. Соответственно,
программа, демонстрирующая суть метода, а также наглядно показывающая
как в шифрованном потоке возникают повторения ключа, применима только
в ознакомительных и учебных целях - и никогда в практических. В
общем, не используйте XOR и деление по модулю в качестве шифров.
/*///////////////////////////////////////////////////////////////
XOR, GNU C++, 2011-01-15
Artix, master@7masterov.ru, icq:53666599, skype:artixmaster
* Error in code? Nothing is perfect!
* Free source for free Linux, use it for free!
* Please, do not remove this comment!
///////////////////////////////////////////////////////////////*/
#include <stdio.h>
#include <string.h>
int getCodeOf(char sym)
{
return sym & 0xFF;
}
char getCharOf(int code)
{
return code & 0xFF;
}
int XOR(int code1, int code2)
{
return (code1 ^ code2) & 0xFF;
}
// Необязательная фукнция форматирования вывода
// Отображает только "нормальные" символы A-Z
// Другие - отображает как звездочку '*'
char viewChar(char c)
{
if (c==' ' || (c>='A' && c<='Z')) return c;
return '*';
}
int main()
{
char str[]="HELLO AND WELCOME FROM MOSCOW RUSSIA\0";
char sec[]="-----------------------------------------------\0";
char pwd[]="KEY\0";
int LEN = strlen(str);
int KEYLEN = strlen(pwd);
// encode
for(int i=0;i<LEN;i++)
{
char n = getCharOf( XOR(getCodeOf(str[i]),getCodeOf(i%KEYLEN)) );
printf("%c",viewChar(n));
sec[i] = n;
}
printf("\n");
// decode
for(int i=0;i<LEN;i++)
{
char n = getCharOf( XOR(getCodeOf(sec[i]),getCodeOf(i%KEYLEN)) );
printf("%c",viewChar(n));
}
printf("\n");
return 0;
}
Справочник алгоритмов v0.05 © 2007-2025 Igor Salnikov aka SunDoctor