• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

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

gabriela007

Новые
Регистрация
3 Сен 2012
Сообщения
16
Реакции
0
Баллы
0
Создать программу шифровки-дешифровки

Код:
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.
помогите найти ошибку.не выводит зашифрованный текст
 
Несколько вопросов и уточнений:
1. Что понимается под "количеством символов в блоке"? Что такое вообще "блок"?
2. Приведите пример используемого ключа.
3. Приведите пример используемого текста.
И вообще - напишите-ка словами, и поподробнее, как Вы понимаете алгоритм шифрования.
 
открытый текст "шифрование_перестановкой".ключ правило перестановки: группы из 8 букв с порядковыми номерами 1.2...8 переставить порядок 3-8-1-5-2-7-6-4
шифртекст "фншоиавр_сиееерпннтваоко"
 
хмм могу предположить что ключ неправильно задается, программно правильно, но логически нет.
и еще кажется что в
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;
где-то тут ошибка, времени разбираться нету ,взглянул чисто символически.
 
открытый текст "шифрование_перестановкой".ключ правило перестановки: группы из 8 букв с порядковыми номерами 1.2...8 переставить порядок 3-8-1-5-2-7-6-4
шифртекст "фншоиавр_сиееерпннтваоко"
Извините, но из этой пулеметной очереди ничего не понял. Рад бы помочь, но если для Вас столь затруднительно написать топик типа
Исходный текст: ........
Вводимый ключ: ........
Далее каждую букву текста мы ......... (здесь максимально подробно).
Ожидаемый результат: ...........
то, боюсь, помочь Вам не смогу.
 
исходный текст apple
вводимый ключ 53214
далее мы на первое место ставим 5 букву исходного слова,на второе место третью букву и т.д.......
ожидаемый результат eppal
 
исходный текст 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.
 

Вложения

  • FP02C.webp
    FP02C.webp
    12 KB · Просмотры: 96
в этой же задачи нужно выполнить расшифровку данного слова.подкиньте хотя бы идею
 
в этой же задачи нужно выполнить расшифровку данного слова.подкиньте хотя бы идею
Ох, Gabriela, даже и не знаю - опять во всё это влезать, вспоминать. Что ж Вы сразу-то? А теперь я из отпуска на работу вышел, времени мало, попробую, конечно, но вот когда - не ведаю.
 
сказали сегодня что еще и раскодировка нужна((((в задание только кодировка была....вот насчет второго даже идей нет(((
 
сказали сегодня что еще и раскодировка нужна((((в задание только кодировка была....вот насчет второго даже идей нет(((
Ладно, держите. Правда, я там малость и кодирующую часть переделал. Обнаружилось, что если количество символов в исходном тексте не кратно длине блока, то при кодировке/декодировке последний символ может пропасть. А потому в этой ситуации исходный текст дополняется пробелами до получения кратности. Что, кстати, сильно упрощает дальнейшую работу с текстом.
Код:
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.
 

Вложения

  • Decode.webp
    Decode.webp
    16.4 KB · Просмотры: 45
Назад
Сверху