Шифрование с помощью операции XOR


Шифр 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;
}