В общем, это заметка о дешифрации аффинного шифра (о шифрации писала здесь).
Прежде всего, нам необходимо «собрать» алфавит (в примере разбираю латиницу). Сделать это можно так:
sh="abcdefghijklmnopqrstuvwxyz";
for(int i=1;i<27;i++)
alf[i]=sh.SubString(i,1);
Здесь массив alf[]
– это, собственно говоря, сам алфавит.
После этого нужно собрать «алфавит-шифровку». Это может быть выполнено таким способом:
for(int j=1;j<27;j++)
{
if((b+a*(j-1))>25)
{
int f=(b+a*(j-1))/26;
shifr[j]=alf[b+1+a*(j-1)-26*f];
}
else shifr[j]=alf[b+1+a*(j-1)];
}
Здесь массив shifr[]
представляет собой шифровальный алфавит, а a и b – целые числа криптосистемы (я рассказывала о них в предыдущей статье (ссылка выше)).
В принципе, после этого можно переходить к непосредственной дешифрации полученной строки, зашифрованной аффинным шифром. Выглядит это так:
for(int i;i
Здесь str
– исходная (зашифрованная) строка;
len
– ее длинна;
массив ich[]
массив исходных данных (в нем содержится зашифрованную строку посимвольно);
массив kod[i]
результирующий массив (в нем содержится дешифрованная строка посимвольно);
str2
– результирующая строка.
Вот, собственно говоря, и все. Будут вопросы – пишите в комментах.
А как то же самое будет на паскале? А то я си вообще не знаю…
Алгоритм для паскаля не изменится. Совсем. Я, если честно, паскаль не помню (в школе учила)… Единственное, с чем могут быть проблемы – с функциями.
Нужно найти аналог функций построчного разбиения
и получения длины шифрованного (нешифрованного) текста:
Этот способ дешифрации, конечно, прост, однако хотелось бы разобраться с дешифрацией с использованием a^-1
?
В каком плане? Дешифровать нужно так же, как шифровали. Шифровали без степеней… Или я чего-то не поняла?)
http://
ru.wikipedia.org/wiki/%C0%F4%F4%E8%ED%ED%FB%E9_%F8%E8%F4%F0Вот здесь формула расшифрования со степенью.
Как бы я так-то была бы очень рада использовать такой способ, как у вас) Я даже его реализовала. Но преподаватель считает, что с использованием степени – это более научно, что ли><
Честно говоря, не понимаю в чем возникла сложность. Алгоритм, по факту, не изменился. Просто вместо того, чтоб умножать х на а, приходится делить всю конструкцию на а (т.к. “а в мину первой” равносильно 1/а). Не понимаю в чем проблема…
У вас что-то конкретное не получается? Или что?
Спасибо) я уже разобралась) Сложность в том, что здесь модульная арифметика, и а в минус первой степени не равносильно 1/a.
?
В смысле? Ладно, правильно говорить не “равносильно”, а “равно”:
a^-1 = a^0/a=1/a
http://
en.wikipedia.org/wiki/ExponentiationЯ ведь говорю, это модулярная арифметика. Она не такая, как в случае действительных чисел, для которых а в степени -1 действительно равно 1/a.
Там в статье на вики про Аффинный шифр ниже формулы расшифрования указано, что a^-1 и a связаны по формуле 1=a*a^-1 mod m – это и есть модулярная арифметика.
ну, эта формула 1=a*a^-1 лишь подчеркивает, что а^-1=1/а
а*1/а=1…
Вы забываете, что там ещё mod m
Изначально я так же считала, что это 1/a, но с при этом задача не решалась. А когда я поняла, что это модулярная арифметика, то всё получилось и дешифрование происходит верно.
)))
Как об этом забудешь? – Это ведь размер алфавита. Если число выйдет за его пределы, то не будет соответствовать букве.
Я понимаю, что уравнению 1=a*a^-1 mod m удовлетворяет неограниченное количество значений a^-1, зависящих от а. Среди прочих и значение 1/а.
А че , криптографию уже без основ матлогики преподают? Просто тут не про модульную арифметику говорить надо : а про кольца, поля….на них определяются операции, которые кольца делают. В данном случае мы разбираем кольцо, в котором введен обратимый(обратный) элемент. а условие : 1=a*a^-1 mod m – показыавет это. Также определяютя операции коммутативности и ассоциативности.
Я же самоучка ))) До колец и полей мое самообразование еще не добралось. Спасибо за наводку =)
Это не математическая логика, а линейная алгебра