C++ Builder аффинный шифр и его реализация (часть 2 – дешифрация)

В общем, это заметка о дешифрации аффинного шифра (о шифрации писала здесь).

Прежде всего, нам необходимо «собрать» алфавит (в примере разбираю латиницу). Сделать это можно так:

1
2
3
sh="abcdefghijklmnopqrstuvwxyz";
for(int i=1;i<27;i++)
 alf[i]=sh.SubString(i,1);

Здесь массив alf[] – это, собственно говоря, сам алфавит.

После этого нужно собрать «алфавит-шифровку». Это может быть выполнено таким способом:

1
2
3
4
5
6
7
8
9
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 – целые числа криптосистемы (я рассказывала о них в предыдущей статье (ссылка выше)).

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  for(int i;i<len+1;i++)
   ich[i]=str.SubString(i,1);
  for(int i=1;i<len+1;i++)
  {
   for(int j=1;j<27;j++)
   {
    if(ich[i]==shifr[j])
    {
     kod[i]=alf[j];
     j++;
    }
   }
  }
   for(int i=1;i<len+1;i++)
     str2+=kod[i];

Здесь str – исходная (зашифрованная) строка;
len – ее длинна;
массив ich[] массив исходных данных (в нем содержится зашифрованную строку посимвольно);
массив kod[i] результирующий массив (в нем содержится дешифрованная строка посимвольно);
str2 – результирующая строка.

Вот, собственно говоря, и все. Будут вопросы – пишите в комментах.

0

    1. Алгоритм для паскаля не изменится. Совсем. Я, если честно, паскаль не помню (в школе учила)… Единственное, с чем могут быть проблемы — с функциями.
      Нужно найти аналог функций построчного разбиения

      1
      
      ich[i]=str.SubString(i,1);

      и получения длины шифрованного (нешифрованного) текста:

      1
      
      len=str.Length();
  1. Этот способ дешифрации, конечно, прост, однако хотелось бы разобраться с дешифрацией с использованием a^-1

    1. ?
      В каком плане? Дешифровать нужно так же, как шифровали. Шифровали без степеней… Или я чего-то не поняла?)

      1. http://ru.wikipedia.org/wiki/%C0%F4%F4%E8%ED%ED%FB%E9_%F8%E8%F4%F0
        Вот здесь формула расшифрования со степенью.
        Как бы я так-то была бы очень рада использовать такой способ, как у вас) Я даже его реализовала. Но преподаватель считает, что с использованием степени — это более научно, что ли><

        1. Честно говоря, не понимаю в чем возникла сложность. Алгоритм, по факту, не изменился. Просто вместо того, чтоб умножать х на а, приходится делить всю конструкцию на а (т.к. «а в мину первой» равносильно 1/а). Не понимаю в чем проблема…
          У вас что-то конкретное не получается? Или что?

          1. Спасибо) я уже разобралась) Сложность в том, что здесь модульная арифметика, и а в минус первой степени не равносильно 1/a.

            1. и а в минус первой степени не равносильно 1/a.

              ?
              В смысле? Ладно, правильно говорить не «равносильно», а «равно»:
              a^-1 = a^0/a=1/a
              http://en.wikipedia.org/wiki/Exponentiation

  2. Я ведь говорю, это модулярная арифметика. Она не такая, как в случае действительных чисел, для которых а в степени -1 действительно равно 1/a.
    Там в статье на вики про Аффинный шифр ниже формулы расшифрования указано, что a^-1 и a связаны по формуле 1=a*a^-1 mod m — это и есть модулярная арифметика.

  3. Вы забываете, что там ещё mod m
    Изначально я так же считала, что это 1/a, но с при этом задача не решалась. А когда я поняла, что это модулярная арифметика, то всё получилось и дешифрование происходит верно.

    1. )))
      Как об этом забудешь? — Это ведь размер алфавита. Если число выйдет за его пределы, то не будет соответствовать букве.

      Я понимаю, что уравнению 1=a*a^-1 mod m удовлетворяет неограниченное количество значений a^-1, зависящих от а. Среди прочих и значение 1/а.

      1. А че , криптографию уже без основ матлогики преподают? Просто тут не про модульную арифметику говорить надо : а про кольца, поля….на них определяются операции, которые кольца делают. В данном случае мы разбираем кольцо, в котором введен обратимый(обратный) элемент. а условие : 1=a*a^-1 mod m — показыавет это. Также определяютя операции коммутативности и ассоциативности.

        1. Я же самоучка ))) До колец и полей мое самообразование еще не добралось. Спасибо за наводку =)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *