Шифрование методом Виженера - 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;
}

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы
  2. Определяются переменные: strLen, keyLen, i, k, str, key, codeStr
  3. Устанавливается кодировка консоли в CP-1251
  4. Выводится приглашение для ввода исходной строки
  5. Вводится исходная строка с помощью функции fgets
  6. Выводится приглашение для ввода ключа
  7. Вводится ключ с помощью функции fgets
  8. Вычисляется длина исходной строки и ключа
  9. Добавляется символ '\0' в конец строки и ключа
  10. Инициализируется цикл для шифрования строки
  11. Если значение k становится больше длины ключа, то k сбрасывается в 0
  12. Если символ строки находится в диапазоне от 'a' до 'z', то он шифруется с использованием Виженера
  13. Вычисляется следующий символ для шифрования
  14. Шифрование продолжается до тех пор, пока все символы исходной строки не будут обработаны
  15. Выводится зашифрованная строка
  16. Строка выводится в исходном виде для проверки
  17. Вводится пауза для завершения программы
  18. Возвращается 0 для успешного завершения программы

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.4 из 5
Похожие ответы