Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2010, 03:43   #1
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
Восклицание строки, вывод, Си.шифр Бьюфорта

Приветики, приветики!!
Взялась, значиЦЦо, я за шифр Бьюфорта, т.е. за написание кода по многоалфавитной системе Бьюфорта, т.е. за дописание и все-таки доделывание этого кошмара.
Метод Бьюфорта подобен методу Виженера. Т.е. =>
Квадрат Виженера представлен ниже:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
B C D E F G H I J K L M N O P Q R S T U V W X Y Z A
C D E F G H I J K L M N O P Q R S T U V W X Y Z A B
D E F G H I J K L M N O P Q R S T U V W X Y Z A B C
E F G H I J K L M N O P Q R S T U V W X Y Z A B C D
F G H I J K L M N O P Q R S T U V W X Y Z A B C D E
G H I J K L M N O P Q R S T U V W X Y Z A B C D E F
H I J K L M N O P Q R S T U V W X Y Z A B C D E F G
I J K L M N O P Q R S T U V W X Y Z A B C D E F G H
J K L M N O P Q R S T U V W X Y Z A B C D E F G H I
K L M N O P Q R S T U V W X Y Z A B C D E F G H I J
L M N O P Q R S T U V W X Y Z A B C D E F G H I J K
M N O P Q R S T U V W X Y Z A B C D E F G H I J K L
N O P Q R S T U V W X Y Z A B C D E F G H I J K L M
O P Q R S T U V W X Y Z A B C D E F G H I J K L M N
P Q R S T U V W X Y Z A B C D E F G H I J K L M N O
Q R S T U V W X Y Z A B C D E F G H I J K L M N O P
R S T U V W X Y Z A B C D E F G H I J K L M N O P Q
S T U V W X Y Z A B C D E F G H I J K L M N O P Q R
T U V W X Y Z A B C D E F G H I J K L M N O P Q R S
U V W X Y Z A B C D E F G H I J K L M N O P Q R S T
V W X Y Z A B C D E F G H I J K L M N O P Q R S T U
W X Y Z A B C D E F G H I J K L M N O P Q R S T U V
X Y Z A B C D E F G H I J K L M N O P Q R S T U V W
Y Z A B C D E F G H I J K L M N O P Q R S T U V W X
Z A B C D E F G H I J K L M N O P Q R S T U V W X Y
Для шифрования с помощью криптосистемы Виженера используется ключевое слово. Например, для зашифрования исходного слова PURPLE с ключом k=CRYPTO, сначала находим пересечение Р-строки и С-столбца и получаем R, далее продолжаем находить пересечения следующих букв и таким образом, зашифрованный текст будет выглядеть следующим образом: RLPEES
А квадрат Бьюфорта представлен ниже:
Z Y X …C B A
A Z Y …D C B
B A Z …E D C
… … … … …
W V U…Z Y X
X W V…A Z Y
Y X W…B A Z
Irenka вне форума Ответить с цитированием
Старый 19.05.2010, 03:45   #2
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Вот это чудо в символах для компилятора:
Код:
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
#include<string.h>
#include<ctype.h>

void main()
{
  char a[130],q[130],c[130],d[26][30];
  FILE *pf,*pg, *pt;
  int l=0,i=0,j=0,m=0,k[15],e[60],t;

  clrscr();
  pf=fopen("ss.txt","r");
  while (!feof(pf))
  {
    fgets(d[i],30,pf);
    i++;
  }
  for (i=0;i<130;i++)
    c[i]=0;
  cout<<"\n";

  cout<<"=======================\n";
  cout<<"vvedite kluchevoe slovo \n\n";
  gets(a);
  l=strlen(a);

  char ch;

  do
  {
    printf("\n\n");
    do
    {
      cout<<"=========================\n";
      cout<<"1. VVOD S KLAVIATURI\n";
      cout<<"=========================\n";
      cout<<"2. VVOD IZ FAILA\n";
      cout<<"=========================\n";
      cout<<"0. VIHOD\n\n";
      cout<<"=========================\n";
      cout<<"VASH VIBOR:";
      cin>>ch;
    }
    while(!strchr("120",tolower(ch)));

    switch(ch)
    {

    case'1':
    {
      clrscr();


      cout<<"\n\n=======================\n";
      cout<<"\nvvedite frazu dlya shifrovaniya \n\n";

      gets(q);
      m=strlen(q);

      for (i=0;i<m;i++)
      {
      if ((q[i]==' ')||(q[i]==',')||(q[i]=='.'))
	for (j=i;j<m;j++)
	  q[j]=q[j+1];
      }
      m=strlen(q);

      for(i=0;i<l;i++)
      for(j=0;j<26;j++)
	if (a[i]==d[0][j])
	  k[i]=j;

      for (i=0;i<m;i++)
	for (j=0;j<26;j++)
	  if (q[i]==d[j][0])
	    e[i]=j;
      j=0;i=0;

      while (i<m)
      {
	c[i]=d[e[i]][k[j]];
	i++;j++;
	if (j==l)
	  j=0;
      }
      m=strlen(c);

      cout<<"=======================\n";
      cout<<"\n\nzashifrovannaya fraza \n\n";

      for (i=0;i<m;i++)
	cout<<c[i];
      getch();

      pg=fopen("ww.txt","w");
      fprintf(pg,"%s",c);
      fclose(pg);

      cout<<"\n\n=======================\n";
      printf("\nnazmite lubyu klavishu");

      getch();
      clrscr();
      break;
  }

  case'2':
  {
    clrscr();


    cout<<"\n=======================\n";
    cout<<"\nfraza dlya shifrovaniya \n\n";

    pt=fopen("l.txt","r");
    while (!feof(pt))
    {
      fgets(q,130,pt);
      printf("%s",q);
    }
    fclose(pt);

    cout<<"\n\n=======================\n";
    cout<<"\nzashifrovannaya fraza \n\n";

    pt=fopen("l.txt","r");
    pg=fopen("ww.txt","w");
    while (!feof(pt))
    {
      fscanf(pt,"%s",q);

      m=strlen(q);
      for (i=0;i<m;i++)
      {
	if ((q[i]==' ')||(q[i]==',')||(q[i]=='.'))
	  for (j=i;j<m;j++)
	    q[j]=q[j+1];
      }
      m=strlen(q);
      for(i=0;i<l;i++)
	for(j=0;j<26;j++)
	  if (a[i]==d[0][j])
	    k[i]=j;
      for (i=0;i<m;i++)
	for (j=0;j<26;j++)
	  if (q[i]==d[j][0])
	    e[i]=j;
      j=0;i=0;
      while (i<m)
      {
	c[i]=d[e[i]][k[j]];
	i++;j++;
	if (j==l)
	  j=0;
      }
      printf("%s",c);
      fprintf(pg,"%s",c);
    }
    fclose(pt);
    fclose(pg);

    cout<<"\n\n=======================\n";
    printf("\nnazmite lubyu klavishu");

    getch();
    clrscr();
    break;
  }

  case'0':
  {
    t=1;
    exit(1);
  }
}

}
while (t!=1);
}
Irenka вне форума Ответить с цитированием
Старый 19.05.2010, 03:51   #3
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Для case'1' шифрируется текст правильно, т.к. там только одна строка вводится и это есть проще. Но для case'2' зашифрованная с удаленными лишними знаками срока, почему-то, выводится с 1/2 предпоследнего слова, последним и опять 1/2 предпоследнего.
Почему?
Читается инфа с файла, вроде, нормально и выводится правильно. А вот с зашифрованием трабл!!
Почему?
Irenka вне форума Ответить с цитированием
Старый 19.05.2010, 11:47   #4
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Где-то здесь
Код:
pt=fopen("l.txt","r");
    pg=fopen("ww.txt","w");
    while (!feof(pt))
    {
      fscanf(pt,"%s",q);

      m=strlen(q);
      for (i=0;i<m;i++)
      {
	if ((q[i]==' ')||(q[i]==',')||(q[i]=='.'))
	  for (j=i;j<m;j++)
	    q[j]=q[j+1];
      }
      m=strlen(q);
      for(i=0;i<l;i++)
	for(j=0;j<26;j++)
	  if (a[i]==d[0][j])
	    k[i]=j;
      for (i=0;i<m;i++)
	for (j=0;j<26;j++)
	  if (q[i]==d[j][0])
	    e[i]=j;
      j=0;i=0;
      while (i<m)
      {
	c[i]=d[e[i]][k[j]];
	i++;j++;
	if (j==l)
	  j=0;
      }
      printf("%s",c);
      fprintf(pg,"%s",c);
    }
    fclose(pt);
    fclose(pg);
ошибка, наверное
Если кто найдет, то сообщите, плизззз
Irenka вне форума Ответить с цитированием
Старый 24.05.2010, 19:58   #5
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Почему несколько раз шифруется частично фраза? Что-то, наверное, в цикле, но что? Моей внимательности не хватает, уже несколько недель мучаюсь!!
Irenka вне форума Ответить с цитированием
Старый 27.05.2010, 22:03   #6
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Получилось что-то такое:
Код:
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<iostream.h>
#include<string.h>
#include<ctype.h>

void main()
{
  char a[130],q[130],c[130],d[26][30];
  FILE *pf,*pg, *pt;
  int l=0,i=0,j=0,m=0,k[15],e[60],t;

  clrscr();
  pf=fopen("ss.txt","r");
  while (!feof(pf))
  {
    fgets(d[i],30,pf);
    i++;
  }
  for (i=0;i<130;i++)
    c[i]=0;
  cout<<"\n";

  cout<<"=======================\n";
  cout<<"vvedite kluchevoe slovo \n\n";
  gets(a);
  l=strlen(a);

  char ch;

  do
  {
    printf("\n\n");
    do
    {
      cout<<"=========================\n";
      cout<<"1. VVOD S KLAVIATURI\n";
      cout<<"=========================\n";
      cout<<"2. VVOD IZ FAILA\n";
      cout<<"=========================\n";
      cout<<"0. VIHOD\n\n";
      cout<<"=========================\n";
      cout<<"VASH VIBOR:";
      cin>>ch;
    }
    while(!strchr("120",tolower(ch)));

    switch(ch)
    {

    case'1':
    {
      clrscr();


      cout<<"\n\n=======================\n";
      cout<<"\nvvedite frazu dlya shifrovaniya \n\n";

      gets(q);
      m=strlen(q);

      for (i=0;i<m;i++)
      {
      if ((q[i]==' ')||(q[i]==',')||(q[i]=='.'))
	for (j=i;j<m;j++)
	  q[j]=q[j+1];
      }
      m=strlen(q);

      for(i=0;i<l;i++)
      for(j=0;j<26;j++)
	if (a[i]==d[0][j])
	  k[i]=j;

      for (i=0;i<m;i++)
	for (j=0;j<26;j++)
	  if (q[i]==d[j][0])
	    e[i]=j;
      j=0;i=0;

      while (i<m)
      {
	c[i]=d[e[i]][k[j]];
	i++;j++;
	if (j==l)
	  j=0;
      }
      m=strlen(c);

      cout<<"=======================\n";
      cout<<"\n\nzashifrovannaya fraza \n\n";

      for (i=0;i<m;i++)
	cout<<c[i];
      getch();

      pg=fopen("ww.txt","w");
      fprintf(pg,"%s",c);
      fclose(pg);

      cout<<"\n\n=======================\n";
      printf("\nnazmite lubyu klavishu");

      getch();
      clrscr();
      break;
  }

  case'2':
  {
    clrscr();


    cout<<"\n=======================\n";
    cout<<"\nfraza dlya shifrovaniya \n\n";

    pt=fopen("fraz1.txt","r");
    while (!feof(pt))
    {
      fgets(q,130,pt);
      printf("%s",q);
    }
    fclose(pt);

    cout<<"\n\n=======================\n";
    cout<<"\nzashifrovannaya fraza \n\n";

    pt=fopen("fraz1.txt","r");
    pg=fopen("ww.txt","w");
    while (!feof(pt))
    {
      fscanf(pt,"%s",q);
     // fgets(q,130,pt);
      m=strlen(q);//  cout<<m;
      for (i=0;i<m;i++)
      {
	if ((q[i]==' ')||(q[i]==',')||(q[i]=='.'))
	  for (j=i;j<m;j++)
	    q[j]=q[j+1];
      }
      m=strlen(q);
      for(i=0;i<l;i++)
	for(j=0;j<26;j++)
	  if (a[i]==d[0][j])
	    k[i]=j;
      for (i=0;i<m;i++)
	for (j=0;j<26;j++)
	  if (q[i]==d[j][0])
	    e[i]=j;
      j=0;i=0;
    //  m=strlen(q);
    // cout<<m;
       while (i<m)
      {
	q[i]=d[e[i]][k[j]];
	i++;j++;
	if (j==l)
	  j=0;
      }
       m=strlen(q); //   cout<<m;
     for (i=0;i<m;i++){
      printf("%c",q[i]);
      fprintf(pg,"%c",q[i]);}
	}

    fclose(pt);
    fclose(pg);

    cout<<"\n\n=======================\n";
    printf("\nnazmite lubyu klavishu");

    getch();
    clrscr();
    break;
  }

  case'0':
  {
    t=1;
    exit(1);
  }
}

}
while (t!=1);
}
Огромное спасибо за помощь
Irenka вне форума Ответить с цитированием
Старый 27.05.2010, 22:11   #7
thomson
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 17
По умолчанию

кстати, если будете его сдавать, шифр правильно называется "шифр Виженера" или лучше всего "полиалфавитный шифр"
я его тоже когда то через case писал, сначала весь алфавит в цифры потом наоборот
thomson вне форума Ответить с цитированием
Старый 27.05.2010, 22:20   #8
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Неа, это криптографический метод шифрования Бьюфорта. И квадрат Бьюфорта представлен ниже:
zyxwvutsrqponmlkjihgfedcba
azyxwvutsrqponmlkjihgfedcb
bazyxwvutsrqponmlkjihgfedc
cbazyxwvutsrqponmlkjihgfed
dcbazyxwvutsrqponmlkjihgfe
edcbazyxwvutsrqponmlkjihgf
fedcbazyxwvutsrqponmlkjihg
gfedcbazyxwvutsrqponmlkjih
hgfedcbazyxwvutsrqponmlkji
ihgfedcbazyxwvutsrqponmlkj
jihgfedcbazyxwvutsrqponmlk
kjihgfedcbazyxwvutsrqponml
lkjihgfedcbazyxwvutsrqponm
mlkjihgfedcbazyxwvutsrqpon
nmlkjihgfedcbazyxwvutsrqpo
onmlkjihgfedcbazyxwvutsrqp
ponmlkjihgfedcbazyxwvutsrq
qponmlkjihgfedcbazyxwvutsr
rqponmlkjihgfedcbazyxwvuts
srqponmlkjihgfedcbazyxwvut
tsrqponmlkjihgfedcbazyxwvu
utsrqponmlkjihgfedcbazyxwv
vutsrqponmlkjihgfedcbazyxw
wvutsrqponmlkjihgfedcbazyx
xwvutsrqponmlkjihgfedcbazy
yxwvutsrqponmlkjihgfedcbaz
Irenka вне форума Ответить с цитированием
Старый 28.05.2010, 08:50   #9
thomson
Пользователь
 
Регистрация: 27.05.2010
Сообщений: 17
По умолчанию

да. этот шифр является модификацией шифра Виженера, отличаются они только ключом...
они вместе взятые являются полиалфавитными шифрами, поэтому я не ошибся, назвав его "полиалфавитным"
з.ы. неужели учитесь на специальности, связанной с информационной безопасностью?
thomson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ассемблер. вывод строки на экран. Rikki-Tikki Помощь студентам 4 18.04.2011 23:51
Файловый Ввод-вывод и строки coll3ctor Общие вопросы C/C++ 17 02.05.2010 11:02
INT 10H Вывод строки ADA Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 14.05.2009 09:44
Вывод строки с опред. позиции Rekky Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 9 13.05.2009 10:29