Member 13438777 Ответов: 3

Программа на языке C++ или C, которая может шифровать и расшифровывать с помощью шифра 2 x 2 hill


#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
char aa[26]="abcdefghijklmnopqrstuvwxyz";
char pt[10];
int m,d,q=0,i,j,k[2][2],p[4],pp[4],t[5];
int k1[2][2],k2[2][2],det;
//clrscr();
printf("enter the plaintext:" );
scanf("%s",pt);
m=strlen(pt);
printf("enter the numbers:");
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
scanf("%d",&k[i][j]);
}
}

for(i=0;i<m;i++)
{
for(j=i;j<26;j++)

{
if(pt[i]==aa[j])

{
t[q]=j%26;
++q;
}
}
}
p[0]=(k[0][0]*t[0])+(k[0][1]*t[1]);
p[1]=(k[1][0]*t[0])+(k[1][1]*t[1]);
p[2]=(k[0][0]*t[2])+(k[0][1]*t[3]);
p[3]=(k[1][0]*t[2])+(k[1][1]*t[3]);
k1[0][0]=k[1][1];
k1[0][1]=-(k[0][1]);
k1[1][0]=-(k[1][0]);
k1[1][1]=k[0][0];

det=(k1[0][0]*k1[1][1])-(k1[0][1]*k1[1][0]);
for(i=0;i<26;i++)
{
if((det*i)%26==1)
{
d=i;
}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
k2[i][j]=(d*k1[i][j])%26;


}
}
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
if(k2[i][j]<0)
k2[i][j]+=26;
}
}
pp[0]=((k2[0][0]*p[0])+(k2[0][1]*p[1]))%26;
pp[1]=((k2[1][0]*p[0])+(k2[1][1]*p[1]))%26;
pp[2]=((k2[0][0]*p[2])+(k2[0][1]*p[3]))%26;
pp[3]=((k2[1][0]*p[2])+(k2[1][1]*p[3]))%26;
for(i=0;i<m;i++)
{
printf("\nThe decrypted plain text :%c",aa[pp[i]]);
}
getch();
}


Что я уже пробовал:

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

3 Ответов

Рейтинг:
2

CPallini

Я бы реализовал его с помощью C++.
Ну, вообще-то я так и сделал, вы можете найти его здесь: [^].


Рейтинг:
1

OriginalGriff

Compiling does not mean your code is right! :laugh:
Think of the development process as writing an email: compiling successfully means that you wrote the email in the right language - English, rather than German for example - not that the email contained the message you wanted to send.

So now you enter the second stage of development (in reality it's the fourth or fifth, but you'll come to the earlier stages later): Testing and Debugging.

Start by looking at what it does do, and how that differs from what you wanted. This is important, because it give you information as to why it's doing it. For example, if a program is intended to let the user enter a number and it doubles it and prints the answer, then if the input / output was like this:
<pre lang="text">Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик teh, чтобы выяснить, почему. Поставить точку останова на строке:
for(i=0;i<m;i++)

и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она действительно делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!

Да, я, вероятно, мог бы сказать вам, в чем "проблема" - но это не трудно сделать самому, и вы узнаете что-то действительно стоящее в то же время!


Рейтинг:
1

Patrice T

Цитата:
задача кодирования для обратной ключевой матрицы используемой для шифрования и дешифрования в шифре Хилла

Это абсолютно ничего нам не говорит, потому что каждый вопрос здесь о чем-то, что не работает.
Описание того, как все идет не так, было бы хорошим началом.

Научитесь правильно делать отступы в вашем коде, это покажет его структуру, и это поможет чтению и пониманию.
#include<stdio.h>
#include<conio.h>
#include<string.h>
void main()
{
    char aa[26]="abcdefghijklmnopqrstuvwxyz";
    char pt[10];
    int m,d,q=0,i,j,k[2][2],p[4],pp[4],t[5];
    int k1[2][2],k2[2][2],det;
    //clrscr();
    printf("enter the plaintext:" );
    scanf("%s",pt);
    m=strlen(pt);
    printf("enter the numbers:");
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
        {
            scanf("%d",&k[i][j]);
        }
    }

    for(i=0;i<m;i++)
    {
        for(j=i;j<26;j++)
        {
            if(pt[i]==aa[j])
            {
                t[q]=j%26;
                ++q;
            }
        }
    }
    p[0]=(k[0][0]*t[0])+(k[0][1]*t[1]);
    p[1]=(k[1][0]*t[0])+(k[1][1]*t[1]);
    p[2]=(k[0][0]*t[2])+(k[0][1]*t[3]);
    p[3]=(k[1][0]*t[2])+(k[1][1]*t[3]);
    k1[0][0]=k[1][1];
    k1[0][1]=-(k[0][1]);
    k1[1][0]=-(k[1][0]);
    k1[1][1]=k[0][0];

    det=(k1[0][0]*k1[1][1])-(k1[0][1]*k1[1][0]);
    for(i=0;i<26;i++)
    {
        if((det*i)%26==1)
        {
            d=i;
        }
    }
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
        {
            k2[i][j]=(d*k1[i][j])%26;
        }
    }
    for(i=0;i<2;i++)
    {
        for(j=0;j<2;j++)
        {
            if(k2[i][j]<0)
                k2[i][j]+=26;
        }
    }
    pp[0]=((k2[0][0]*p[0])+(k2[0][1]*p[1]))%26;
    pp[1]=((k2[1][0]*p[0])+(k2[1][1]*p[1]))%26;
    pp[2]=((k2[0][0]*p[2])+(k2[0][1]*p[3]))%26;
    pp[3]=((k2[1][0]*p[2])+(k2[1][1]*p[3]))%26;
    for(i=0;i<m;i++)
    {
        printf("\nThe decrypted plain text :%c",aa[pp[i]]);
    }
    getch();
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

Если вы не понимаете, что идет не так в вашем коде, ответ-отладчик.
Существует инструмент, который позволяет вам видеть, что делает ваш код, его имя отладчик Это также отличный инструмент обучения, потому что он показывает вам реальность, и вы можете увидеть, какие ожидания соответствуют реальности.
Когда вы не понимаете, что делает ваш код или почему он делает то, что он делает, ответ таков: отладчик.
Используйте отладчик, чтобы увидеть, что делает ваш код. Просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не находит ошибок, он просто помогает вам. Когда код не делает того, что ожидается, вы близки к ошибке.