Шифрование методом Виженера - 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 для успешного завершения программы