Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.90/73: Рейтинг темы: голосов - 73, средняя оценка - 4.90
Daniel406
13 / 13 / 0
Регистрация: 06.10.2010
Сообщений: 23
1

Шифрование методом Виженера

14.04.2011, 01:19. Просмотров 15131. Ответов 6
Метки нет (Все метки)

Здравствуйте! Помогите доработать прогу на си. Она должна шифровать (хотя бы!!!) и дешифровать текст методом Виженера:
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
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
 
int main(int argc, char *argv[]){
setlocale(LC_ALL, "RU");
int const kol=27;
char table[26]="abcdefghijklmnopqrstuvwxyz";
char buf[26][26];
int i=0, j=0, k;
fflush(stdin);
for(int i=0; i<kol; i++){
    for(int j=0; j<kol; j++){
            k=i+j;
            if(k>=kol) k=k-kol;
                if((i>=1&&k==0)||(i>=2&&k==1)||(i>=3&&k==2)||(i>=4&&k==3)||(i>=5&&k==4)||(i>=6&&k==5)||(i>=7&&k==6)||(i>=8&&k==7)||(i>=9&&k==8)||(i>=10&&k==9)||(i>=11&&k==10)||(i>=12&&k==11)||(i>=13&&k==12)||(i>=14&&k==13)||(i>=15&&k==14)||(i>=16&&k==15)||(i>=17&&k==16)||(i>=18&&k==17)||(i>=19&&k==18)||(i>=20&&k==19)||(i>=21&&k==20)||(i>=22&&k==21)||(i>=23&&k==22)||(i>=24&&k==23)||(i>=25&&k==24)||(i>=26&&k==25)) buf[i][j-1]=table[k];
                else buf[i][j]=table[k];
        }
}
 for(int i=0; i<26; i++){
    for(int j=0; j<26; j++){
            printf("%c",buf[i][j]);
        }
        printf("\n");
  }
char text[250], key[250], shifr[250];
printf ("Введите ключ: ");
    for(int i=0; i<3; i++){
        scanf("%c", key);
    }
printf ("Введите текст: ");
        for(int i=0; i<6; i++){
                scanf("%c", shifr);
        }
    int M_shifr, M_key, p=0, p1=0;
    for(int t=0; t<strlen(shifr); t++){
        i=0; j=0;
                    while(i!=kol){
                            if(buf[0][i]==shifr[p]){
                    M_shifr=i; p++;
                }
                            else i++;
                    }
                    if(p1>strlen(key)) p1=0;
                        while(j!=kol){
                                if(buf[i][0]==key[p1]){
                        M_key=j; p1++;
                    }
                                else j++;
                        }
                text[t]=buf[M_shifr][M_key];
        }
}
2
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.04.2011, 01:19
Ответы с готовыми решениями:

Шифрование по методу Виженера
Всем доброй ночи. Написал программу шифрования по методу Виженера по строчным буквам русского...

Шифрование методом гаммирования
Доброго времени суток! Вся соль в том, что реализовать шифрование нужно таким образом, чтобы ГАММА...

Шифрование методом Шамира
Помогите пожалуйста, на языке СИ реализовать шифрование по методу Шамира. с самим методом...

Таблица Виженера
Здравствуйте,можете ли подсказать ошибку вывода? #include&lt;iostream.h&gt; #include&lt;conio.h&gt;...

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

6
kazak
3070 / 2391 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
Завершенные тесты: 1
14.04.2011, 12:51 2
Лучший ответ Сообщение было отмечено как решение

Решение

Предлагаю вариант попроще.
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
   size_t strLen, keyLen, i, k;
   char str[250], key[250];
   char codeStr[250];
 
   system("chcp 1251");
   printf("Ââåäèòå ñòðîêó: ");
   fgets(str, 249, stdin);
   printf("Ââåäèòå êëþ÷: ");
   fgets(key, 249, stdin);
   strLen = strlen(str);
   keyLen = strlen(key);
   str[--strLen] = '\0';
   key[--keyLen] = '\0';
   for (i = 0, k = 0; i < strLen; i++, k++)
   {
      if (k == (keyLen))
         k = 0;
      if (str[i] >= 'a' && str[i] <= 'z')
         codeStr[i] = (str[i] + key[k] - 2*'a') % 26 + 'a';
   }
   codeStr[strLen] = '\0';
   printf("Çàøèôðîâàííàÿ ñòðîêà\n%s\n", codeStr);
   strcpy(str, codeStr);
   for (i = 0, k = 0; i < strLen; i++, k++)
   {
      if (k == (keyLen))
         k = 0;
      if (codeStr[i] >= 'a' && codeStr[i] <= 'z')
         str[i] = (codeStr[i] - key[k] + 26) % 26 + 'a';
   }
   printf("Ðàñøèôðîâàííàÿ ñòðîêà\n%s\n", str);
   system("pause");
   return 0;
}
Добавлено через 4 минуты
Цитата Сообщение от Daniel406 Посмотреть сообщение
C++
1
if((i>=1&&k==0)||(i>=2&&k==1)||(i>=3&&k==2)||(i>=4&&k==3)||(i>=5&&k==4)||(i>=6&&k==5)||(i>=7&&k==6)||(i>=8&&k==7)||(i>=9&&k==8)||(i>=10&&k==9)||(i>=11&&k==10)||(i>=12&&k==11)||(i>=13&&k==12)||(i>=14&&k==13)||(i>=15&&k==14)||(i>=16&&k==15)||(i>=17&&k==16)||(i>=18&&k==17)||(i>=19&&k==18)||(i>=20&&k==19)||(i>=21&&k==20)||(i>=22&&k==21)||(i>=23&&k==22)||(i>=24&&k==23)||(i>=25&&k==24)||(i>=26&&k==25))
Это можно записать короче
C++
1
if (i >= (k-1))
8
Daniel406
13 / 13 / 0
Регистрация: 06.10.2010
Сообщений: 23
14.04.2011, 19:19  [ТС] 3
kazak, огромное тебе спасибо Ещё можешь объяснить что это за строки:
//system("chcp 1251");
//system("pause");

Добавлено через 2 часа 0 минут
и эти:
str[--strLen] = '\0';
key[--keyLen] = '\0';
1
kazak
3070 / 2391 / 255
Регистрация: 11.03.2009
Сообщений: 5,444
Завершенные тесты: 1
15.04.2011, 01:15 4
system выполняет команду операционной системы. chcp 1251 сменить кодовую страницу - для работы с русским языком. pause - сделать паузу. str[--steLen] = '\0'; удаляет последний символ в строке (в данном случае символ перевода строки оставленного fgets'ом), попутно уменьшая размер, чтобы не вызывать повторно strlen.
3
Daniel406
13 / 13 / 0
Регистрация: 06.10.2010
Сообщений: 23
15.04.2011, 01:36  [ТС] 5
kazak, огромное тебе человеческое спасибо
1
dimanok1994
0 / 0 / 0
Регистрация: 14.12.2014
Сообщений: 1
14.12.2014, 18:30 6
codeStr[i] = (str[i] + key[k] - 2*'a') % 26 + 'a';

а можно узнать подробнее, как осуществляется шифрование?)
что задаётся таким образом:
- 2*'a' и + 'a' ?
0
asemvip
0 / 0 / 0
Регистрация: 10.12.2012
Сообщений: 27
05.03.2015, 19:33 7
kazak, а можешь пожалуйста написать что написано после printf , и комментарию кода пожалуйста))
0
05.03.2015, 19:33
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2015, 19:33

Шифрование методом Виженера
Пожалуйста может у кого то есть исходник шифрования методом Виженера В КОНСОЛИ срочно надо до...

Шифрование Методом Виженера На C++
Здравствуйте. Мне нужна программа на тему Шифрование методом виженера. Я пытался найти в интернете...

Шифрование методом Виженера
Здравствуйте, для начала расскажу что из себя представляет шифр Виженера: берется таблица Виженера,...


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

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

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