我正在编写一个适用于 Vigenere 加密的代码。在输入密钥进行加密时,出现一个问题,相同密钥的数组溢出,我不能继续前进,我已经伤透了脑筋。
输入密钥时,必须将其写入密钥数组,然后在 Encryption_Viz 函数中使用,但会发生溢出。
或者像这样:
#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#define STR_LEN 100
char alphavite[] = "abcdefghijklmnopqrstvuwxyz";
void Input_By_File(char *started_string)
{
FILE* pFile;
char mystring[100];
pFile = fopen("text.txt", "r");
if (pFile == NULL) perror("\nError opening file");
else {
if (fgets(mystring, 100, pFile) != NULL)
{
for (int i = 0; i < STR_LEN; i++)
{
started_string[i] = mystring[i];
}
puts(started_string);
}
fclose(pFile);
}
}
void Input_By_Yourself(char* started_string)
{
getchar();
gets_s(started_string, STR_LEN);
printf(">Вы ввели строку: '%s'\n\n", started_string);
}
void Output_Start_Info()
{
printf(" Добро пожаловать в программу для шифровки/расшифровки текста!\n\nВ нашей программе представлен следующий виды шифрования:");
printf("\n\n");
printf(">Шифр Вижинера\n");
}
void Input_Start_String(char* started_string)
{
int key;
printf("\n\nВыбирете метод ввода данных: \n1 — Ввести вручную\n2 — Загрузить из файла\n");
scanf_s("%i", &key);
switch (key)
{
case 1: printf("\n\nПожалуйста введите текст, который хотите де-/за-шифровать, на английском языке: "); Input_By_Yourself(started_string);
break;
case 2: printf("\n\nПроисходит загрузка файла (text.txt) с текстом, который хотите де-/за-шифровать.\n"); printf("Ваш файл содержит следующую строку: "); Input_By_File(started_string);
break;
default: printf("Вы ввели неправильный ключ, попробуйте сначала.");
break;
}
}
int Input_Type_of_Encryption()
{
int key = 0;
printf("\n\nПожалуйста, введите номер вида шифрования, который вы хотите использовать для данной строки: ");
scanf_s("%i", &key);
return key;
}
int Type_Of_Work()
{
int key;
printf("\n\nПожалуйста, выберите тип выполняемой работы:\n1 — Зашифровать текст\n2 — Расшифровать текст\n");
scanf_s("%i", &key);
return key;
}
/*char Key_For_Encryption()
{
char key[STR_LEN + 1] = "";
printf("\n\nВведите ключ для шифрования: ");
Input_By_Yourself(key);
return key[STR_LEN];
}*/
void Encryption_Viz(char *started_string, char *encrypte_string)
{
char key[STR_LEN] = "";
printf("\n\nВведите ключ для шифрования: ");
Input_By_Yourself(key);
char long_string[] = " ";
int s = strlen(started_string);
int e = strlen(key);
if (s >= e)
{
for(int i = 0; i < s; i++)
{
long_string[i] = key[((e+1)%(i+1))];
}
}
else
{
for (int i = 0; i < s; i++)
{
long_string[i] += key[i];
}
}
printf("%s ", long_string);
}
int Decryption(char* text, int k, char* key, int a, int j)
// text - шифр-текст, key- ключ, k - длина блока text, a - длина ключа, j - каков будет размер блока расшифрованного сообщения
{
int i;
for (i = 0; i < k; i++)
{
if (j == a - 1)
j = 0;
if (text[i] != 32)
{
if (text[i] >= 'A' && text[i] <= 'Z')
{
if (key[j] >= 'A' && key[j] <= 'Z')
{
text[i] = ((text[i] - key[j] + 26) % 26) + 65;
j++;
}
else if (key[j] >= 'a' && key[j] <= 'z')
{
text[i] = text[i] + 32;
text[i] = ((text[i] - key[j] + 26) % 26) + 65;
j++;
}
}
else if (text[i] >= 'a' && text[i] <= 'z')
{
if (key[j] >= 'a' && key[j] <= 'z')
{
text[i] = ((text[i] - key[j] + 26) % 26) + 97;
j++;
}
else if (key[j] >= 'A' && key[j] <= 'Z')
{
text[i] = text[i] - 32;
text[i] = ((text[i] - key[j] + 26) % 26) + 97;
j++;
}
}
}
}
return j;
}
int main()
{
char started_string[STR_LEN + 1] = "";
char encrypted_string[STR_LEN + 1] = "";
setlocale(LC_ALL, "Russian");
Output_Start_Info();
switch (Type_Of_Work())
{
case 1:
Input_Start_String(started_string);
Encryption_Viz(started_string, encrypted_string);
break;
case 2:
Input_Start_String(started_string);
Decryption();
break;
default: printf("Проверьте правильность введного ключа.");
break;
}
return 0;
}