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

Основная идея шифрования/дешифрования (кодирования/декодирования) проста. Я хочу послать вам некий текст, но не хочу, чтобы его прочитал кто-то другой. Поэтому я преобразовываю свой текст так, чтобы он стал непонятным для людей, которые не знают, как именно я его модифицировал, но так, чтобы вы могли произвести обратное преобразование и прочитать мой текст. Эта процедура называется шифрованием. Для того чтобы зашифровать текст, я использую алгоритм (который должен считать неизвестным нежелательным соглядатаям) и строку, которая называется ключом. У вас этот ключ есть (и надеемся, что его нет у нежелательного соглядатая). Когда вы получите зашифрованный текст, вы расшифруете его с помощью ключа; другими словами, восстановите исходный текст, который я вам послал.

Алгоритм TEA получает в качестве аргумента два числа типа long без знака (v[0], v[1]), представляющие собой восемь символов, которые должны быть зашифрованы; массив, состоящий из двух чисел типа long без знака (w[0], w[1]), в который будет записан результат шифрования; а также массив из четырех чисел типа long без знака (k[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;

  }

}

Поскольку все данные не имеют знака, мы можем выполнять побитовые операции, не опасаясь сюрпризов, связанных с отрицательными числами. Основные вычисления выполняются с помощью сдвигов (<< и >>), исключительного “или” (^) и побитовой операции “и” (&) наряду с обычным сложением (без знака). Этот код написан специально для машины, в которой тип long занимает четыре байта. Код замусорен “магическими” константами (например, он предполагает, что значение sizeof(long) равно 4). Обычно так поступать не рекомендуется, но в данном конкретном коде все это ограничено одной страницей, которую программист с хорошей памятью должен запомнить как математическую формулу. Дэвид Уиллер хотел шифровать свои тексты, путешествуя без ноутбуков и других устройств. Программа кодирования и декодирования должна быть не только маленькой, но и быстрой. Переменная n определяет количество итераций: чем больше количество итераций, тем сильнее шифр. Насколько нам известно, при условии n==32 алгоритм TEA никогда не был взломан.

Приведем соответствующую функцию декодирования.

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

  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;

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

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

97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT
Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьерн Страуструп , Бьёрн Страуструп , Валерий Федорович Альмухаметов , Ирина Сергеевна Козлова

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT