Документация Engee
Notebook

Гаммирование

Гаммирование — это процесс наложения по определенному закону гаммы шифра на открытые данные.

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

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

Процедура наложения гаммы осуществляется следующими способами:

  1. Символы исходного текста и гаммы заменяются цифрами эквивалентными, которые затем складываются по модулю k, где k – число символов в алфавите, т.е.: Ri=(Si+G)mod(k-1), где Ri, Si, G – символы зашифрованного, исходного текста и гаммы соответственно.
  2. Символы исходного текста и гаммы представляются в виде двоичного кода, а затем соответствующие разряды складываются по модулю 2. Вместо сложения по модулю 2 при гаммировании можно использовать другие логические функции. Теперь рассмотрим реализованный нами алгоритм. Код представлен ниже.

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

In [ ]:
# Реализация функции bitxor
bitxor(a::Integer, b::Integer) = a  b
Out[0]:
bitxor (generic function with 1 method)
In [ ]:
# Определение входных значений
input_string = collect("Экспонента")
Game = collect("Engee")

# Выравнивание гаммы относительно входного слова
Game = repeat([Game], inner=(ceil(Int, length(input_string) / length(Game))))
Game = collect(Iterators.flatten(Game))
Out[0]:
10-element Vector{Char}:
 'E': ASCII/Unicode U+0045 (category Lu: Letter, uppercase)
 'n': ASCII/Unicode U+006E (category Ll: Letter, lowercase)
 'g': ASCII/Unicode U+0067 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 'E': ASCII/Unicode U+0045 (category Lu: Letter, uppercase)
 'n': ASCII/Unicode U+006E (category Ll: Letter, lowercase)
 'g': ASCII/Unicode U+0067 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
 'e': ASCII/Unicode U+0065 (category Ll: Letter, lowercase)
In [ ]:
# Кодирование
output = map(x -> bitxor(Int(x[1]), Int(x[2])), zip(input_string, Game[1:length(input_string)]))

# Печать результата кодирования
println("Закодированная строка:")
for ch in output
    print(Char(ch))
end

# Декодирование
input_string2 = output
# Алгоритм
output2 = map(x -> bitxor(Int(x[1]), Int(x[2])), zip(input_string2, Game[1:length(input_string2)]))

# Печать результата декодирования
println("\nДекодированная строка:")
for ch in output2
    print(Char(ch))
end
Закодированная строка:
ѨєЦњћѸћњЧѕ
Декодированная строка:
Экспонента

Вывод

В этой демонстрации мы убедились, что формула гаммирования работает корректно.