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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.12.2012, 01:48   #1
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
Восклицание Шифр Гронсфельда (!)

Пожалуйста, помогите! Очень срочно
Написать программу на С++, осуществляющую шифрование и дешифрование каких-либо данных. Тип шифрования – шифр Гронсфельда.
Если кому-то поможет, то есть код на Паскале:
Код:
program Kriptograf; 

function Shifr ( Kod, K : string ): string; 
	var i,t,d : integer; 
	begin 
		for i :=1 to length (Kod) do begin 
			d :=ord (Kod[i]); 
			t := (ord(Kod[i]) + (ord (K [(pred(i) mod length(K)) + 1]) - ord('0')));
			if t >= 256 then 
				dec (T,256); 
			Kod[i]:= Chr(t); 
		end; 
		Shifr := Kod; 
	end;

var a,k,s: string;

Begin

	writeln('vvedite slovo'); 
	readln(a); 
	writeln('vvedite klu4'); 
	readln(k); 
	s:= Shifr(a,k); 
	writeln('s= ', Shifr (a, k)); 
	readln; 
End.

//расшифровывающая 
program Kriptograf;

function DeShifr (DeKod,K:string):string; 
	var i,t:integer; 
	begin 
		for i:=1 to length(DeKod) do begin 
			t:=(Ord(DeKod[i])-(ord(K[(pred(i) mod length(K))+1])-ord('0')));
			if t<0 then 
				Inc(t,256); 
			DeKod[i]:=Chr(t); 
		end; 
		DeShifr:=DeKod; 
	end;

var a,k,s:string;

Begin 
	writeln('vvedite zashifrovannui text'); 
	readln(a); 
	writeln('vvedite klu4'); 
	readln(k); 
	s:= DeShifr(a ,k );
	writeln('s= ', DeShifr (a,k)); 
	readln; 
End.
guzel20 вне форума Ответить с цитированием
Старый 18.12.2012, 11:32   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

В C++ ключ лучше сразу принимать как массив чисел. Не очень понятно, откуда у Вас 256 - если использовать всю таблицу символов, на выходе можно получить строку, содержащую управляющие символы. Лучше так:
Код:
const char* alphabet = "АБВГД...ЭЮЯ";
const int NUM_LETTERS = 33;
//...
  int symCode;
  for(symCode=0; symCode<NUM_LETTERS; ++symCode)
    if(alphabet[symCode]==plaintext[i]) break;
  cyphertext[i] = alphabet[(symCode+key[i%keyLength])%NUM_LETTERS];
Расшифрование аналогично, только плюс меняется на минус.
Abstraction вне форума Ответить с цитированием
Старый 18.12.2012, 13:24   #3
guzel20
Пользователь
 
Аватар для guzel20
 
Регистрация: 05.12.2012
Сообщений: 25
По умолчанию

Не совсем понятно, что за переменные: plaintext, cyphertext и key.
И чему они равны в начале.
guzel20 вне форума Ответить с цитированием
Старый 18.12.2012, 14:01   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Не совсем понятно, что за переменные: plaintext, cyphertext и key.
plaintext - открытый текст, состоящий из символов алфавита;
cyphertext - шифртекст;
key - ключ (массив целых чисел); keyLength - его длина.
Abstraction вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифр? KoBRaAndrey Работа с сетью в Delphi 0 12.12.2009 16:16
Шифр Progs1024 Паскаль, Turbo Pascal, PascalABC.NET 9 12.10.2009 19:51
че за шифр? Анастасия123456789 Помощь студентам 4 11.05.2009 19:19
Шифр Гронсфельда zloygeniyrus Паскаль, Turbo Pascal, PascalABC.NET 0 06.04.2009 16:53
Шифр Гронсфельда zloygeniyrus Помощь студентам 0 06.04.2009 16:45