Шифрование методом Виженера - C (СИ)
Формулировка задачи:
Здравствуйте! Помогите доработать прогу на си. Она должна шифровать (хотя бы!!!) и дешифровать текст методом Виженера:
#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]; } }
Решение задачи: «Шифрование методом Виженера»
textual
Листинг программы
#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; }
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы
- Определяются переменные: strLen, keyLen, i, k, str, key, codeStr
- Устанавливается кодировка консоли в CP-1251
- Выводится приглашение для ввода исходной строки
- Вводится исходная строка с помощью функции fgets
- Выводится приглашение для ввода ключа
- Вводится ключ с помощью функции fgets
- Вычисляется длина исходной строки и ключа
- Добавляется символ '\0' в конец строки и ключа
- Инициализируется цикл для шифрования строки
- Если значение k становится больше длины ключа, то k сбрасывается в 0
- Если символ строки находится в диапазоне от 'a' до 'z', то он шифруется с использованием Виженера
- Вычисляется следующий символ для шифрования
- Шифрование продолжается до тех пор, пока все символы исходной строки не будут обработаны
- Выводится зашифрованная строка
- Строка выводится в исходном виде для проверки
- Вводится пауза для завершения программы
- Возвращается 0 для успешного завершения программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д