Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Создать программу шифровки-дешифровки (http://www.tehnari.ru/f41/t78160/)

gabriela007 08.09.2012 19:59

Создать программу шифровки-дешифровки
 
Код:

program Project2;
{$APPTYPE CONSOLE}
Uses
SysUtils,windows;
Var
      n,kolsimvolov,i,j,akey : Integer;
      text,textkey,key : String;

Begin
  SetConsoleOutputCP(1251);
  Writeln ('введите количество символов в блоке');
  Readln(n);
  Writeln ('Введите ключ');
  Readln(key);
  Writeln ('Введите текст');
  Readln (text);
  kolsimvolov:=Length(text);
  i:=0;
  textkey:='';
  Repeat
    For j:=1 to n do
      begin
        akey:=Byte(key[j]);
        If akey = 0 then Break;
        If i + akey <= kolsimvolov then
          textkey:=textkey + text[i + akey];
      end;
    i:=i + n; 
  Until (i>=kolsimvolov);
  Writeln ('Зашифрованный текст: ');
  Writeln (textkey);
  Readln;
End.

помогите найти ошибку.не выводит зашифрованный текст

Vladimir_S 08.09.2012 20:54

Несколько вопросов и уточнений:
1. Что понимается под "количеством символов в блоке"? Что такое вообще "блок"?
2. Приведите пример используемого ключа.
3. Приведите пример используемого текста.
И вообще - напишите-ка словами, и поподробнее, как Вы понимаете алгоритм шифрования.

gabriela007 08.09.2012 21:15

открытый текст "шифрование_перестановкой".ключ правило перестановки: группы из 8 букв с порядковыми номерами 1.2...8 переставить порядок 3-8-1-5-2-7-6-4
шифртекст "фншоиавр_сиееерпннтваоко"

Gruvi 08.09.2012 21:18

хмм могу предположить что ключ неправильно задается, программно правильно, но логически нет.
и еще кажется что в
Цитата:

For j:=1 to n do
begin
akey:=Byte(key[j]);
If akey = 0 then Break;
If i + akey <= kolsimvolov then
textkey:=textkey + text[i + akey];
end;
i:=i + n;
где-то тут ошибка, времени разбираться нету ,взглянул чисто символически.

Vladimir_S 08.09.2012 21:27

Цитата:

Сообщение от gabriela007 (Сообщение 790303)
открытый текст "шифрование_перестановкой".ключ правило перестановки: группы из 8 букв с порядковыми номерами 1.2...8 переставить порядок 3-8-1-5-2-7-6-4
шифртекст "фншоиавр_сиееерпннтваоко"

Извините, но из этой пулеметной очереди ничего не понял. Рад бы помочь, но если для Вас столь затруднительно написать топик типа
Исходный текст: ........
Вводимый ключ: ........
Далее каждую букву текста мы ......... (здесь максимально подробно).
Ожидаемый результат: ...........
то, боюсь, помочь Вам не смогу.

gabriela007 08.09.2012 22:23

исходный текст apple
вводимый ключ 53214
далее мы на первое место ставим 5 букву исходного слова,на второе место третью букву и т.д.......
ожидаемый результат eppal

Vladimir_S 09.09.2012 12:30

Вложений: 1
Цитата:

Сообщение от gabriela007 (Сообщение 790343)
исходный текст apple
вводимый ключ 53214
далее мы на первое место ставим 5 букву исходного слова,на второе место третью букву и т.д.......
ожидаемый результат eppal

Так, ну это уже что-то. Начинает проясняться. Уже установлено, что ключ - это последовательность цифр. Теперь дело за малым - приковать Вас наручниками к батарее и, используя ВСЕ средства, под пыткой вырвать информацию о блоках.
Ладно, допустим так. Текст разбивается на блоки с количеством символов, равным длине ключа, и поблочно кодируется. Прекрасно! Но возникает вопрос: а что делать с остатком текста? Ведь полное количество символов текста вовсе не обязано быть кратным длине ключа! И что? Забегая вперед, скажу, что в моем варианте это решается так:
1. Если абсолютный номер обрабатываемого символа превышает kolsimvolov, то обработка не делается.
2. Если текущее значение i плюс кодовый сдвиг символа превышает kolsimvolov, то символ не кодируется и оставляется исходным.
Кроме того, при вводе ключа необходимо проверять истинность двух утверждений:
1. Количество символов ключа равно длине блока.
2. Ключ не содержит повторяющихся символов.
Обе проверки вставлены.
Теперь об ошибках.
Главная из них - абсолютно неправильное использование оператора BYTE, он же ORD. Этот оператор возвращает вовсе не числовое значение символа-цифры, а его код. Например, последовательно применение его к символам строки
53214
вернет
53 51 50 49 52
Вот так. А нужную Вам задачу решает процедура VAL.
Ниже приведен вариант кода. Экранные сообщения там на английском, потому что мне с кириллицей заморачиваться всегда напряжно. Вернете, если надо.
Код:

Uses
SysUtils,windows; 
Var
      n,kolsimvolov,i,j,akey,Code : Integer;
      text,textkey,key,S : String;
      p:boolean;

Begin
  SetConsoleOutputCP(1251);
  Write('Enter the number of symbols per block: ');
  Readln(n);
  Repeat
  Write('Enter the key: ');
  Readln(key);
  If Length(key)<>n then writeln('Key must contain ',n,' symbols!');
  p:=true;
  i:=0;
  repeat
    inc(i);
    j:=i;
    repeat
    inc(j);
    if j<=Length(key) then
      if (key[i]=key[j]) then p:=false;
    until Not(p) or (j=Length(key));
  until i=Length(key)-1;
  If Not(p) then writeln('All key symbols must be different!');
  Until (Length(key)=n) and p;
  Write('Enter the text: ');
  Readln(text);
  kolsimvolov:=Length(text);
  i:=0;
  textkey:='';
  Repeat
    For j:=1 to n do
      begin
        S:=key[j];
        VAL(S,akey,Code);
        If (i+j)<=kolsimvolov then
        begin
          If i+akey <= kolsimvolov then
            textkey:=textkey + text[i+akey]
          else textkey:=textkey+text[i+j];
        end;
      end;
    i:=i + n;
  Until (i>=kolsimvolov);
  Writeln('Encoded text:  '+textkey);
  Readln; 
End.


gabriela007 24.09.2012 19:34

в этой же задачи нужно выполнить расшифровку данного слова.подкиньте хотя бы идею

Vladimir_S 24.09.2012 20:11

Цитата:

Сообщение от gabriela007 (Сообщение 796005)
в этой же задачи нужно выполнить расшифровку данного слова.подкиньте хотя бы идею

Ох, Gabriela, даже и не знаю - опять во всё это влезать, вспоминать. Что ж Вы сразу-то? А теперь я из отпуска на работу вышел, времени мало, попробую, конечно, но вот когда - не ведаю.

gabriela007 24.09.2012 21:30

сказали сегодня что еще и раскодировка нужна((((в задание только кодировка была....вот насчет второго даже идей нет(((

Vladimir_S 25.09.2012 12:53

Вложений: 1
Цитата:

Сообщение от gabriela007 (Сообщение 796040)
сказали сегодня что еще и раскодировка нужна((((в задание только кодировка была....вот насчет второго даже идей нет(((

Ладно, держите. Правда, я там малость и кодирующую часть переделал. Обнаружилось, что если количество символов в исходном тексте не кратно длине блока, то при кодировке/декодировке последний символ может пропасть. А потому в этой ситуации исходный текст дополняется пробелами до получения кратности. Что, кстати, сильно упрощает дальнейшую работу с текстом.
Код:

Uses
 SysUtils,windows;
Var
  n,kolsimvolov,i,j,k,l,akey,Code : Integer;
  text,textkey,textunkey,key,key1,S : String;
  p:boolean;

Begin
  SetConsoleOutputCP(1251);
  Write('Enter the number of symbols per block: ');
  Readln(n);
  Repeat
  Write('Enter the key: ');
  Readln(key);
  If Length(key)<>n then writeln('Key must contain ',n,' symbols!');
  p:=true;
  i:=0;
  repeat
    inc(i);
    j:=i;
    repeat
    inc(j);
    if j<=Length(key) then
      if (key[i]=key[j]) then p:=false;
    until Not(p) or (j=Length(key));
  until i=Length(key)-1;
  If Not(p) then writeln('All key symbols must be different!');
  Until (Length(key)=n) and p;
  Write('Enter the text: ');
  Readln(text);
  kolsimvolov:=Length(text);
  If (kolsimvolov mod n)>0 then
  for k:=Length(text)+1 to ((Length(text) div n)+1)*n do
    begin
    text:=text+' ';
    Inc(kolsimvolov);
    end;
  textkey:='';
  For k:=0 to (kolsimvolov div n)-1 do
  begin
    i:=n*k;
    For j:=1 to n do
    begin
      S:=key[j];
      VAL(S,akey,Code);
      textkey:=textkey + text[i+akey]
    end;
  end;
  Writeln('Encoded text:  '+textkey);
  Repeat
  Write('Enter the key: ');
  Readln(key1);
  If key1<> key then writeln('Wrong key!');
  Until key1=key;
  textunkey:='';
  for l:=0 to (kolsimvolov div n)-1 do
  begin
    i:=l*n;
    for j:=1 to n do
    begin
      k:=0;
      repeat
      Inc(k);
      S:=key[k];
      VAL(S,akey,Code);
      until akey=j;
      textunkey:=textunkey+textkey[i+k]
    end;
  end;
  Writeln('Decoded text:  '+textunkey);
  Readln;
End.



Часовой пояс GMT +4, время: 17:46.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.