Читаем Программирование полностью

  cout << "введите имя файлов для ввода, для вывода и ключ:\n";

  cin >> infile >> outfile >> key;

  while (key.size()

  ifstream inf(infile.c_str());

  ofstream outf(outfile.c_str());

  if (!inf || !outf) error("Неправильное имя файла");

  const unsigned long* k =

    reinterpret_cast(key.data());

  unsigned long outptr[2];

  char inbuf[nchar];

  unsigned long* inptr = reinterpret_cast

  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(outbuf);

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

                                             // ввод

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

  decipher(inptr,outptr,k);

  outf<

}

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

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

для чтения шестнадцатеричных чисел. Для дешифровки существует буфер вывода outbuf, который мы обрабатываем как набор битов, используя приведение.

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

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных