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

на главную

Жанры

Программирование. Принципы и практика использования 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. Стандарты программирования

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

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

Гарцевич Евгений Александрович
7. Отмороженный
Фантастика:
рпг
аниме
5.00
рейтинг книги
Отмороженный 7.0

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Измена

Рей Полина
Любовные романы:
современные любовные романы
5.38
рейтинг книги
Измена

Идеальный мир для Лекаря 4

Сапфир Олег
4. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 4

Развод и девичья фамилия

Зика Натаэль
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Развод и девичья фамилия

Сила рода. Том 1 и Том 2

Вяч Павел
1. Претендент
Фантастика:
фэнтези
рпг
попаданцы
5.85
рейтинг книги
Сила рода. Том 1 и Том 2

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Тринадцатый II

NikL
2. Видящий смерть
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Тринадцатый II

Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Вудворт Франциска
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Замуж второй раз, или Ещё посмотрим, кто из нас попал!

Бестужев. Служба Государевой Безопасности

Измайлов Сергей
1. Граф Бестужев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Бестужев. Служба Государевой Безопасности

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Начальник милиции 2

Дамиров Рафаэль
2. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции 2

Оружейникъ

Кулаков Алексей Иванович
2. Александр Агренев
Фантастика:
альтернативная история
9.17
рейтинг книги
Оружейникъ