Шифрование методом гаммирования

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

Наложение гаммы можно осуществить несколькими способами, например по формуле tш = tо XOR tг,

где tш,tо,tг - ASCII коды соответственно зашифрованного символа, исходного символа и гаммы. XOR - побитовая операция "исключающее или".

Расшифрование текста проводится по той же формуле: tо = tш XOR tг,

Последовательность гаммы удобно формировать с помощью датчика псевдослучайных чисел (ПСЧ).

Стойкость гаммирования однозначно определяется длиной периода гаммы. При использовании современных ПСЧ реальным становится использование бесконечной гаммы, что приводит к бесконечной теоретической стойкости зашифрованного текста.

Методы генерации псевдослучайных чисел(то что на википедии)ГПСЧ (PRNG) это генераторы псевдо-случайных чисел. Их общее предназначение — генерация последовательностей чисел, которые невозможно отличить от случайных.Никакой детерминированный алгоритм не может генерировать полностью случайные числа, а только лишь аппроксимировать некоторые свойства случайных чисел. Наиболее распространены линейный конгруэнтный метод, метод Фибоначчи с запаздываниями.Алгоритм Блюма, Блюма и Шуба (Blum Blum Shub, BBS) — это генератор псевдослучайных чисел, предложенный в 1986 году Ленор Блюм, Мануэлем Блюм и Майклом Шубом (Blum et al, 1986).BBS выглядит так:xn+1 = (xn)2 mod M где M=pq является произведением двух больших простых p и q. На каждом шаге алгоритма выходные данные получаются из xn путём взятия либо бита чётности, либо одного или больше наименее значимых бит xnДва простых числа, p и q, должны быть оба сравнимы с 3 по модулю 4 (это гарантирует, что каждый квадратичный остаток имеет один квадратный корень, который также является квадратичным остатком) и НОД(φ(p-1), φ(q-1)) должен быть мал (это увеличивает длину цикла).Интересной особенностью этого алгоритма является то, что для получения xn необязательно вычислять все n - 1 предыдущих чисел, если известно начальное состояние генератора x0 и числа p и q. n-ное значение может быть вычислено "напрямую" используя формулу:xn = x0 (2 ^ n) mod ((p-1)(q-1)) mod M Линейный конгруэнтный метод — один из алгоритмов генерации псевдослучайных чисел. Применяется в простых случаях и не обладает криптографической стойкостью. Используется в качестве стандартного генератора многими компиляторами.Этот алгоритм заключается в итеративном применении следующей формулы:,где a > 0, c > 0, m > 0 — некоторые целочисленные константы. Получаемая последовательность зависит от выбора стартового числа X0 и при разных его значениях получаются различные последовательности случайных чисел. В то же время, многие свойства последовательности Xj определяются выбором коэффициентов в формуле и не зависят от выбора стартового числа. Ясно, что последовательность чисел, генерируемая таким алгоритмом, периодична с периодом, не превышающим m. При этом длина периода равна m тогда и только тогда, когда:НОД (c, m) = 1 (то есть c и m взаимно просты); a - 1 кратно p для всех простых p — делителей m; a - 1 кратно 4, если m кратно 4. При реализации выгодно выбирать m = 2e, где e — число бит в машинном слове, поскольку это позволяет избавиться от относительно медленной операции приведения по модулю.Младшие двоичные разряды сгенерированных таким образом случайных чисел демонстрируют поведение, далёкое от случайного, поэтому рекомендуется использовать только старшие разряды. Кроме того, при использовании этого генератора для выбора точек в d-мерном пространстве, точки ложатся не более, чем на m1 / d гиперплоскостей, что ограничивает применение генератора в методе Монте-Карло.Статистические свойства получаемой последовательности случайных чисел полностью определяются выбором констант a и c при заданной разрядности e. Для этих констант выписаны условия, гарантирующие удовлетворительное качество получаемых случайных чисел. Numerical Recipes in C рекомендует следующие значения: a = 1664525, c = 1013904223, m = 232Метод Фибоначчи с запаздываниями (Lagged Fibonacci generator) — один из методов генерации псевдослучайных чисел.Особенности распределения случайных чисел, генерируемых линейным конгруэнтным алгоритмом, делает невозможным их использование в статистических алгоритмах, требующих высокого разрешения.В связи с этим линейный конгруэнтный алгоритм постепенно потерял свою популярность и его место заняло семейство фибоначчиевых алгоритмов, которые могут быть рекомендованы для использования в алгоритмах, критичных к качеству случайных чисел. В англоязычной литературе фибоначчиевы датчики такого типа называют обычно «Subtract-with-borrow Generators» (SWBG).Наибольшую популярность фибоначчиевы датчики получили в связи с тем, что скорость выполнения арифметических операций с вещественными числами сравнялась со скоростью целочисленной арифметики, а фибоначчиевы датчики естественно реализуются в вещественной арифметике.Один из широко распространённых фибоначчиевых датчиков основан на следующей итеративной формуле:где X(k) — вещественные числа из диапазона [0, 1), a, b — целые положительные числа, называемые лагами. Для работы фибоначчиеву датчику требуется знать max(a, b) предыдущих сгенерированных случайных чисел. При программной реализации для хранения сгенерированных случайных чисел используется конечная циклическая очередь на базе массива. Для старта фибоначчиевому датчику требуется max(a, b) случайных чисел, которые могут быть сгенерированы простым конгруэнтным датчиком.Лаги a и b — «магические» и их не следует выбирать произвольно. Рекомендуются следующие значения лагов: a = 55, b = 24; a = 17, b = 5; a = 97, b = 33. Качество получаемых случайных чисел зависит от значения константы, a чем оно больше, тем выше размерность пространства, в котором сохраняется равномерность случайных векторов, образованных из полученных случайных чисел. В то же время, с увеличением величины константы a увеличивается объём используемой алгоритмом памяти.Значения a = 17, b = 5 можно рекомендовать для простых приложений, не использующих векторы высокой размерности со случайными компонентами. Значения a = 55, b = 24 позволяют получать числа, удовлетворительные для большинства алгоритмов, требовательных к качеству случайных чисел. Значения a = 97, b = 33 позволяют получать очень качественные случайные числа и используются в алгоритмах, работающих со случайными векторами высокой размерности. Описанный фибоначчиев датчик случайных чисел (с лагами 20 и 5) используется в широко известной системе Matlab (автором первой версии этой системы был Д. Каханер).Получаемые случайные числа обладают хорошими статистическими свойствами, причём все биты случайного числа равнозначны по статистическим свойствам. Период фибоначчиева датчика может быть оценен по следующей формуле:, где e — число битов в мантиссе вещественного числа.