Чтение онлайн

на главную - закладки

Жанры

Программирование. Принципы и практика использования C++ Исправленное издание
Шрифт:

// 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])) {

outf << hex; // используется шестнадцатеричный вывод

if (++count == nchar) {

encipher(inptr,outptr,k);

// заполнение ведущими нулями:

outf << setw(8) << setfill('0') << outptr[0] << ' '

<< setw(8) << setfill('0') << outptr[1] << ' ';

count = 0;

}

}

if (count) { // заполнение

while(count != nchar) inbuf[count++] = '0';

encipher(inptr,outptr,k);

outf << outptr[0] << ' ' << outptr[1] << ' ';

}

}

Основной частью кода является цикл

while
; остальная часть носит вспомогательный характер. Цикл
while
считывает символы в буфер ввода
inbuf
и каждый раз, когда алгоритму TEA нужны очередные восемь символов, передает их функции
encipher
. Алгоритм TEA не проверяет символы; фактически он не имеет представления об информации, которая шифруется. Например, вы можете зашифровать фотографию или телефонный разговор. Алгоритму TEA требуется лишь, чтобы на его вход поступало 64 бита (два числа типа
long
без знака), которые он будет преобразовывать. Итак, берем указатель на строку
inbuf
, превращаем его в указатель типа
unsigned long*
без знака и передаем его алгоритму TEA. То же самое мы делаем с ключом; алгоритм TEA использует первые 128 битов (четыре числа типа
unsigned long
),
поэтому мы дополняем вводную информацию, чтобы она занимала 128 битов. Последняя инструкция дополняет текст нулями, чтобы его длина была кратной 64 битам (8 байтов) в соответствии с требованием алгоритма TEA.

Как передать зашифрованный текст? Здесь у нас есть выбор, но поскольку текст представляет собой простой набор битов, а не символы кодировки ASCII или Unicode, то мы не можем рассматривать его как обычный текст. Можно было бы использовать двоичный ввод-вывод (см. раздел 11.3.2), но мы решили выводить числа в шестнадцатеричном виде.

ПОПРОБУЙТЕ

Ключом было слово

bs
; что представляет собой текст?

Любой эксперт по безопасности скажет вам, что хранить исходный текст вместе с зашифрованным очень глупо. Кроме того, он обязательно сделает замечания о процедуре заполнения, двухбуквенном ключе и так далее, но наша книга посвящена программированию, а не компьютерной безопасности.

Мы проверили свою программу, прочитав зашифрованный текст и преобразовав его в исходный. Когда пишете программу, никогда не пренебрегайте простыми проверками ее корректности.

Центральная часть программы расшифровки выглядит следующим образом:

unsigned long inptr[2];

char outbuf[nchar+1];

outbuf[nchar]=0; // терминальный знак

unsigned long* outptr = reinterpret_cast<unsigned long*>(outbuf);

inf.setf(ios_base::hex,ios_base::basefield); // шестнадцатеричный

// ввод

while (inf>>inptr[0]>>inptr[1]) {

decipher(inptr,outptr,k);

outf<<outbuf;

}

Обратите внимание на использование функции

inf.setf(ios_base::hex,ios_base::basefield);

для чтения шестнадцатеричных чисел. Для дешифровки существует буфер вывода

outbuf
, который мы обрабатываем как набор битов, используя приведение.

Следует ли рассматривать алгоритм TEA как пример программирования встроенной системы? Не обязательно, но мы можем представить себе ситуацию, в которой необходимо обеспечить безопасность или защитить финансовые транзакции с помощью многих устройств. Алгоритм TEA демонстрирует много свойств хорошего встроенного кода: он основан на понятной математической модели, корректность которой не вызывает сомнений; кроме того, он небольшой, быстрый и непосредственно использует особенности аппаратного обеспечения.

Стиль интерфейса функций

encipher
и
decipher
не вполне соответствует нашим вкусам. Однако эти функции были разработаны так, чтобы обеспечить совместимость программ, написанных как на языке С, так и на языке С++, поэтому в них нельзя было использовать возможности языка С+, которыми не обладает язык C. Кроме того, многие “магические константы” являются прямым переводом математических формул.

25.6. Стандарты программирования

Поделиться:
Популярные книги

Курсант: назад в СССР

Дамиров Рафаэль
1. Курсант
Фантастика:
попаданцы
альтернативная история
7.33
рейтинг книги
Курсант: назад в СССР

Чужая семья генерала драконов

Лунёва Мария
6. Генералы драконов
Фантастика:
фэнтези
5.00
рейтинг книги
Чужая семья генерала драконов

Пышка и Герцог

Ордина Ирина
Фантастика:
юмористическое фэнтези
историческое фэнтези
фэнтези
5.00
рейтинг книги
Пышка и Герцог

Имперский Курьер. Том 5

Бо Вова
5. Запечатанный мир
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Имперский Курьер. Том 5

Имя нам Легион. Том 7

Дорничев Дмитрий
7. Меж двух миров
Фантастика:
боевая фантастика
рпг
аниме
5.00
рейтинг книги
Имя нам Легион. Том 7

Возвышение Меркурия

Кронос Александр
1. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Измена. (Не)любимая жена олигарха

Лаванда Марго
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. (Не)любимая жена олигарха

Вираж бытия

Ланцов Михаил Алексеевич
1. Фрунзе
Фантастика:
героическая фантастика
попаданцы
альтернативная история
6.86
рейтинг книги
Вираж бытия

Отмороженный 11.0

Гарцевич Евгений Александрович
11. Отмороженный
Фантастика:
боевая фантастика
рпг
попаданцы
фантастика: прочее
фэнтези
5.00
рейтинг книги
Отмороженный 11.0

История "не"мощной графини

Зимина Юлия
1. Истории неунывающих попаданок
Фантастика:
попаданцы
фэнтези
5.00
рейтинг книги
История немощной графини

Крестоносец

Ланцов Михаил Алексеевич
7. Помещик
Фантастика:
героическая фантастика
попаданцы
альтернативная история
5.00
рейтинг книги
Крестоносец

Газлайтер. Том 15

Володин Григорий Григорьевич
15. История Телепата
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Газлайтер. Том 15

Призыватель нулевого ранга

Дубов Дмитрий
1. Эпоха Гардара
Фантастика:
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Призыватель нулевого ранга