Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 19.05.2016
Сообщений: 8
1

Шифр Виженера, работает некорректно при размере текста больше 35 символов

31.05.2016, 21:09. Показов 2757. Ответов 3
Метки нет (Все метки)

при вводе символов, когда размер текста выходит примерно за 35, в результате начинают теряться или появляться лишние символы, хотя исходный текст и результат должны быть равной длины
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
{
AnsiString text1 = Edit1->Text;
AnsiString key1 = Edit2->Text;
AnsiString key = key1.LowerCase();
AnsiString newtext;
AnsiString alphabet = Edit4->Text;
AnsiString text = text1.LowerCase();
 
int n;
int m;
int x;
int a=text.Length();
int b=alphabet.Length();
bool istext=0;
bool iskey=0;
 
for (int i=1; i <= a; i++)         //перебор символов исходного текста
{
istext=0;
iskey=0;
    for (int j=1; j <= b; j++)     //перебор символов алфавита
{
        if (text[i]==alphabet[j])                   //находим символ текста в алфавите
        {
         n=j;
         istext=1;
        }
        int y=i%key.Length();
        y=y?y:key.Length();
        if (key[y]==alphabet[j])                 //находим символ ключа в алфавите
        {
         m=j;
         iskey=1;
        }
}
if (istext && iskey)
{
    x =((n+m)%b);
    x=x?x:b;
    newtext=newtext+alphabet[x];
}
}
Edit3->Text = newtext;
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2016, 21:09
Ответы с готовыми решениями:

Шифр Виженера: неверный результат шифрования символов
private static int smesh = (int)'a';//смещение алфавита относительно таблицы юникодов ...

Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно
Помогите, пожалуйста! Проблема: при сдвиге более, чем на длину алфавита выдаёт всякие символы, хотя...

Шифр Виженера (работает только с латиницей)
Срочно нужна помощь, не могу понять где ошибка! Шифрует только английский текс на русском выдает...

Шифр Виженера - программа вылетает при чтении из файла
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

3
случайный прохожий
1511 / 1013 / 373
Регистрация: 20.07.2013
Сообщений: 2,943
31.05.2016, 23:04 2
А длина ключа выравнивается до длины текста?
https://ru.wikipedia.org/wiki/... 1%80%D0%B0
0
0 / 0 / 0
Регистрация: 19.05.2016
Сообщений: 8
01.06.2016, 00:18  [ТС] 3
мы берем длину ключа по модулю
C++
1
2
int y=i%key.Length();
        y=y?y:key.Length();
0
случайный прохожий
1511 / 1013 / 373
Регистрация: 20.07.2013
Сообщений: 2,943
01.06.2016, 22:47 4
Сделал с нуля (обычно не люблю чужой код исправлять):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  // алфавит задается для простоты первым и последним символом
  // при желании можно задавать по-другому, тогда длина алфавита будет вычисляться как
  // alphabet.Length() и шифрование / расшифровка может усложниться в реализации
  AnsiString text = "ATTACKATDAWN", key = "LEMON", alphabet = "AZ", temp = "";
  // n - количество символов в алфавите
  int i, n = alphabet[2] - alphabet[1] + 1;
 
  // выравниваем длину ключа до длины текста
  for (i = 1; i <= text.Length() / key.Length(); i++)
    temp += key;
  temp += key.SubString(1, text.Length() % key.Length());
 
  // присваиваем ключу новое (выровненное) значение
  key = temp;  // получаем LEMONLEMONLE
 
  // шифруем
  for (i = 1; i <= text.Length(); i++)
    temp[i] = char((key[i] + text[i]) % n + alphabet[1]);
 
  // показываем зашифрованный текст
  ShowMessage(temp);  // получаем LXFOPVEFRNHR
 
  // расшифровываем
  for (i = 1; i <= text.Length(); i++)
    text[i] = char((temp[i] - key[i] + n) % n + alphabet[1]);
 
  // показываем расшифрованный текст
  ShowMessage(text);  // получаем ATTACKATDAWN
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.06.2016, 22:47

Шифрование текста алгоритмом Виженера не работает с кириллицей
Код должен шифровать текст алгоритмом Виженера. Но не работает, на латинице работал, когда начал...

Шифр Цезаря и шифр Виженера
1. Используя шифр Цезаря расшифруйте слово ЛГПЗРГ. Шифр Цезаря для русского алфавита со сдвигом на...

Шифр Виженера, шифр Скитала
Я много прочитал информации и захотел реализовать эти шифры на Buider C++, а вот как это сделать....

Шифр Виженера
Составьте программы (желательно отдельно), одна из которых шифрует, а другая расшифровывает текст...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.