Здравствуйте Bell, Вы писали:
B>>>Есть такой простенький алгоритм (по-моему когда-то использовался в arj): берется некая строка — ключ, и исходная строка побайтно ксорится с этим ключом.
B>>>Например есть
B>>>char strSource[20];
B>>>char strDestination[20];
B>>>char strKey[3];
B>>>Тогда процедура шифрования выглядит так:
B>>>strDestinationх[0] = strSource[0]^strKey[0];
B>>>strDestinationх[1] = strSource[1]^strKey[1];
B>>>strDestinationх[2] = strSource[2]^strKey[2];
B>>>strDestinationх[3] = strSource[3]^strKey[0];
B>>>.......
NM>>и тут возникает одна неприятность((((
NM>>если в strSource и strKey содержится один и тотже символ, то в результате мы получим 0, тоесть "символ конца строки", а тут уже появятся напряги по работе с файлами, сокетами!, итд...
NM>>как этого можно избежать? (например, какой символ точно не может быть задействован?(для замены))
B>Да по-моему лучше передавать зашифрованную строку как массив байтов, а после расшифровки преобразовать в строку...
Для этого нужно работать не в пространстве {0..255} а в {1..255},
используя любую биективную функцию. Например, сложение/вычитание с ключом.
(Ой, забыл, как вся эта теоретико-алгебраическая чача называется. Звыняйте...)
const unsigned char MinCode = 1;
const unsigned char MaxCode = 255;
const unsigned char CodeBase = MaxCode - MinCode + 1;
unsigned char chrSource; // MinCode..MaxCode;
// символы, равные по модулю CodeBase - неразличимы
// и, следовательно, выход за диапазон MinCode..MaxCode - недопустим
unsigned char chrKey;
// ключи, равные по модулю CodeBase - неразличимы.
// выход за диапазон - не имеет значения.
unsigned char chrSrc1 = chrSource - MinCode; // 0..CodeBase-1
unsigned char chrEnc1 = (chrSrc1 + chrKey) % CodeBase; // 0..CodeBase-1
unsigned char chrEncrypted = chrEnc1 + MinCode; // MinCode..MaxCode
unsigned char chrDec1 = (chrEnc1 - chrKey1) % CodeBase; // 0..CodeBase-1
unsigned char chrDecrypted = chrDec1 + MinCode; // MinCode..MaxCode
assert(chrDecrypted == chrSource);