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

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

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

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

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

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

В несколько измененном виде шифр Полибия получил своеобразное название "тюремный шифр". Для его использования нужно только знать естественный порядок расположения букв алфавита (как в указанном выше примере для английского языка). Стороны квадрата обозначаются не буквами (ABCDE), а числами (12345). Число 3, например, передается путем тройного стука. При передаче буквы сначала "отстукивается число, соответствующее строке, в которой находится буква, а затем номер соответствующего столбца. Например, буква "F" передается двойным стуком (вторая строка) и затем одинарным (первый столбец).

При произвольном расположении букв в квадрате возникает одно затруднение: либо нужно помнить отправителю и получателю сообщения заданный произвольный порядок следования букв в таблице (ключ шифра), что вообще говоря затруднительно, либо иметь при себе запись этих букв. Во втором случае появляется опасность ознакомления с ключом посторонних лиц. Поэтому в ряде случаев ключ составляется следующим образом. Берется некоторое "ключевое слово", которое легко запомнить, например, "CRYPTOLOGY", удаляют из него повторы букв (получают "CRYPTOLOG") и записывают его в начальных клетках квадрата. В оставшиеся клетки записываются остальные буквы алфавита в естественном порядке.

A B C D E A C R Y P T B O L G A B C D E F H I E U V W X Z

В таком шифре ключом является указанное "ключевое слово" ("пароль").
Irenka вне форума Ответить с цитированием
Старый 27.05.2010, 23:26   #2
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Есть программка с таблицей. Она шифрует и дешифрует текст, но на паскале и без файлов.
Шифровальная таблица представляла собой квадрат с пятью столбцами и пятью строками, которые нумеровались цифрами от 1 до 5. В каждую клетку такого квадрата записывалась одна буква. В результате каждой букве соответствовала пара чисел, и шифрование сводилось к замене буквы парой чисел.
Вот она:
Код:
const
  TPolibius: array['A' .. 'E', 'A' .. 'E'] of char = (
    ('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')
  );
function PolibiusEncipher(toCode: string): string;
var
  i: integer;
  ix, jx: char;
  s: string;
begin
  s := '';
  for i := 1 to length(toCode) do begin
 
    for ix := 'A' to 'E' do
      for jx := 'A' to 'E' do
        if TPolibius[ix, jx] = toCode[ i ] then begin
          s := s + ix + jx; break;
        end;
 
  end;
  PolibiusEncipher := s
end;
 
function PolibiusDecipher(toDecode: string): string;
var
  i: integer;
  s: string;
begin
  s := '';
  i := 1;
  while i <= length(toDecode) do begin
    s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];
    inc(i, 2);
  end;
  PolibiusDecipher := s
end;
 
var
  s: string;
 
begin
  s := PolibiusEncipher('POLIBIUS');
  writeln(s);
  writeln('s = ', PolibiusDecipher(s));
end.
Irenka вне форума Ответить с цитированием
Старый 27.05.2010, 23:27   #3
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>

const char TPolibius[5][5]=
  {{'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'}};


void PolibiusEnc(char* str, char* str2){
	int i;
	int ix,jx;

	for(i=0;i<strlen(str);i++)
		for(ix=0; ix<5; ix++)
			for(jx=0; jx<5; jx++)
				if(str[i]==TPolibius[ix][jx])
				{
					char tmp[2]="";
					tmp[0]='1'+ix;
					strcat(str2,tmp);
					tmp[0]='1'+jx;
					strcat(str2,tmp);
					strcat(str2," ");

				}

}

void main()
{

  FILE *pp, *pt;
  char s[130];
  char a[130]="";
  char b[130]="";
  int t, i;
  char ch;


  clrscr();
  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";
	    cout<<"\nvvedite frazu dlya shifrovaniya \n\n";

	    gets(s);
	    PolibiusEnc(s,b);

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

	    for(i=0;i<strlen(b);i++)
	      cout<<b[i];
	    pp=fopen("rez1.txt","w");
	    fprintf(pp,"%s",b);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\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(s,130,pt);
	      printf("%s",s);
	    }
	    fclose(pt);

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

	    pt=fopen("fraz1.txt","r");
	    pp=fopen("rez1.txt","w");
	    while(!feof(pt))
	    {
	      fscanf(pt,"%s",s);
	      PolibiusEnc(s,a);
	    }
	    printf("%s",a);
	    fprintf(pp,"%s",a);
	    fclose(pt);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\nnazmite lubyu klavishu";

	    getch();
	    clrscr();
	    break;
      }

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

    }
  }
  while (t!=1);
}

Последний раз редактировалось Irenka; 27.05.2010 в 23:29.
Irenka вне форума Ответить с цитированием
Старый 27.05.2010, 23:33   #4
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Как реализовать дешифрирование зашифрированного тюремным шифром текста? Как реализовать подпрограммку, которая на паскале выглядит так:
Код:
function PolibiusDecipher(toDecode: string): string;
var
  i: integer;
  s: string;
begin
  s := '';
  i := 1;
  while i <= length(toDecode) do begin
    s := s + TPolibius[toDecode[ i ], toDecode[succ(i)]];
    inc(i, 2);
  end;
  PolibiusDecipher := s
end;
Да и как дешифрацию и шифрацию реализовать с введением ключа? Тогда же нельзя массив делать константным, да?

Последний раз редактировалось Irenka; 27.05.2010 в 23:35.
Irenka вне форума Ответить с цитированием
Старый 28.05.2010, 11:18   #5
Z1000000
Форумчанин
 
Регистрация: 04.05.2010
Сообщений: 495
По умолчанию

Цитата:
Да и как дешифрацию и шифрацию реализовать с введением ключа? Тогда же нельзя массив делать константным, да?
создаешь функцию от ключа. И по-нему восстанавливаешь шифровальную таблицу. То есть заполняешь массив динамически. Создать его можно и статически, ведь размер его всегда один и тот же.
Нажми на весы, поставь +
Для благодарностей : WebMoney WMR R252732729948
Z1000000 вне форума Ответить с цитированием
Старый 29.05.2010, 16:39   #6
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

С расшифрованием трабл:
Код:
void PolibiusDec(char* str, char* str2){
        int i;
        i=1;
        while (i<strlen(str))
        {
          str=str+TPolibius[str2[i]][str2[i+1]];
          i+=2;
        }
}
Строка не выводится. Результата нет. Что переделать?
Irenka вне форума Ответить с цитированием
Старый 29.05.2010, 17:44   #7
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Почему не работает?
Irenka вне форума Ответить с цитированием
Старый 29.05.2010, 19:21   #8
Irenka
Пользователь
 
Аватар для Irenka
 
Регистрация: 17.05.2010
Сообщений: 39
По умолчанию

Помогите доделать код, пожалуйста. Времени же у Вас мало займет, а человека спасете))
Irenka вне форума Ответить с цитированием
Старый 29.05.2010, 23:23   #9
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>

const char TPolibius[5][5]=
  {{'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'}};

void PolibiusDec(char* str, char* str2)
{
  int i;

  i=0;

  while (i<strlen(str2))
  {
    strncat(str,&TPolibius[str2[i]-'1'][str2[i+1]-'1'],1);
    i+=2;
  }
}

void main()
{

  FILE *pp, *pt;
  char s[130]="";
  char a[130]="";
  char b[130]="";
  int t, i;
  char ch;


  clrscr();
  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";
	    cout<<"\nvvedite frazu dlya shifrovaniya \n\n";

	    gets(b);
	    PolibiusDec(a,b);

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

	    for(i=0;i<strlen(a);i++)
	      cout<<a[i];
	    pp=fopen("rez2.txt","w");
	    fprintf(pp,"%s",a);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\nnazmite lubyu klavishu";

	    getch();
	    clrscr();
	    break;
      }

      case'2':
      {
	    clrscr();

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

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

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

	    pt=fopen("rez1.txt","r");
	    pp=fopen("rez2.txt","w");
	    while(!feof(pt))
	    {
	      fscanf(pt,"%s",b);
	      PolibiusDec(s,b);
	    }
	    printf("%s",s);
	    fprintf(pp,"%s",s);
	    fclose(pt);
	    fclose(pp);

	    cout<<"\n=======================\n";
	    cout<<"\nnazmite lubyu klavishu";

	    getch();
	    clrscr();
	    break;
      }

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

    }
  }
  while (t!=1);
}
И еще раз спасибо Всем за внимание))

Если кто-то поможет с написанием ф-ций с ключем, то жду ответов...
Irenka вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
списки , помогите доделать код. paladinn Общие вопросы C/C++ 0 20.06.2009 09:07
Помогите доделать код на Си osichev Общие вопросы C/C++ 0 08.06.2009 20:39
Помогите доделать код!!НА СИ osichev Помощь студентам 0 08.06.2009 20:27
Помогите доделать код! Al3x Общие вопросы C/C++ 6 22.12.2008 19:06
Шифр Razora Свободное общение 10 26.06.2007 15:52