Программирование. Принципы и практика использования C++ Исправленное издание, стр. 362
Основная идея шифрования/дешифрования (кодирования/декодирования) проста. Я хочу послать вам некий текст, но не хочу, чтобы его прочитал кто-то другой. Поэтому я преобразовываю свой текст так, чтобы он стал непонятным для людей, которые не знают, как именно я его модифицировал, но так, чтобы вы могли произвести обратное преобразование и прочитать мой текст. Эта процедура называется шифрованием. Для того чтобы зашифровать текст, я использую алгоритм (который должен считать неизвестным нежелательным соглядатаям) и строку, которая называется ключом. У вас этот ключ есть (и надеемся, что его нет у нежелательного соглядатая). Когда вы получите зашифрованный текст, вы расшифруете его с помощью ключа; другими словами, восстановите исходный текст, который я вам послал.
Алгоритм TEA получает в качестве аргумента два числа типа
longv[0]v[1]longw[0]w[1]longk[0]..k[3]void encipher( const unsigned long *const v, unsigned long *const w, const unsigned long * const k) { unsigned long y = v[0]; unsigned long z = v[1]; unsigned long sum = 0; unsigned long delta = 0x9E3779B9; unsigned long n = 32; while(n–– > 0) { y += (z << 4 ^ z >> 5) + z ^ sum + k[sum&3]; sum += delta; z += (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3]; } w[0]=y; w[1]=z; }}Поскольку все данные не имеют знака, мы можем выполнять побитовые операции, не опасаясь сюрпризов, связанных с отрицательными числами. Основные вычисления выполняются с помощью сдвигов (
<<>>^&sizeof(long)4nn==32Приведем соответствующую функцию декодирования.
void decipher( const unsigned long *const v, unsigned long *const w, const unsigned long * const k) { unsigned long y = v[0]; unsigned long z = v[1]; unsigned long sum = 0xC6EF3720; unsigned long delta = 0x9E3779B9; unsigned long n = 32; // sum = delta<<5, в целом sum = delta * n while(n–– > 0) { z –= (y << 4 ^ y >> 5) + y ^ sum + k[sum>>11 & 3]; sum –= delta; y –= (z << 4 ^ z >> 5) + z ^ sum + k[sum&3]; } w[0]=y; w[1]=z; }}Мы можем использовать алгоритм TEA для того, чтобы создать файл, который можно передавать по незащищенной линии связи.
int main() // отправитель{ const int nchar = 2*sizeof(long); // 64 бита const int kchar = 2*nchar; // 128 битов string op; string key; string infile; string outfile; cout << "введите имя файлов для ввода, для вывода и ключ:\n"; cin >> infile >> outfile >> key; while (key.size()<kchar) key += '0'; // заполнение ключа ifstream inf(infile.c_str()); ofstream outf(outfile.c_str()); if (!inf || !outf) error("Неправильное имя файла"); const unsigned long* k = reinterpret_cast<const unsigned long*>(key.data()); unsigned long outptr[2]; char inbuf[nchar]; unsigned long* inptr = reinterpret_cast<unsigned long*>(inbuf); int count = 0; while (inf.get(inbuf[count])) {