我制作了加密和解密Vigenere密码的程序,但我遇到了一些问题。
K
字母。我认为这是因为空间,但我不知道如何解决它。这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>
int main(int argc, char **argv) {
char message[100];
int choice;
int i, j;
char pass[33];
int value;
char repeat = 1;
while (repeat == 1) {
printf("Enter operation\n");
printf("Encrypt - 1 \n");
printf("Decrypt - 2\n");
scanf("%d", &choice);
if (choice == 1) {
printf("Please enter message to encrypt\n");
while (getchar() != '\n');
fgets(message, 100, stdin);
printf("Enter password\n");
scanf("%s", &pass);
for (i = 0, j = 0; i < strlen(message); i++, j++) {
if (message[i] == ' ')
continue;
if (j >= strlen(pass)) {
j = 0;
}
if (!isupper(message[i])) {
value = (((message[i]) - 97) + ((pass[j]) - 97));
}
if (!islower(message[i])) {
value = (((message[i]) - 65) + ((pass[j]) - 65));
}
printf("%c", 97 + (value % 26));
}
printf("\nWould you like to repeat? [1/0]\n");
scanf("%d", &repeat);
} else
if (choice == 2) {
printf("Enter message do decrypt\n");
while (getchar() != '\n');
fgets(message, 100, stdin);
printf("Zadejte heslo\n");
scanf("%s", &pass);
for (i = 0, j = 0; i < strlen(message); i++, j++) {
if (message[i] == ' ')
continue;
if (j >= strlen(pass)) {
j = 0;
}
if (!isupper(message[i])) {
value = (((message[i]) - 96) - ((pass[j]) - 96));
}
if (!islower(message[i])) {
value = (((message[i]) - 64) - ((pass[j]) - 64));
}
if (value < 0) {
value = value * -1;
}
printf("%c", 97 + (value % 26));
}
printf("\nWould you like to repeat? [1/0]\n");
scanf("%d", &repeat);
}
}
return (EXIT_SUCCESS);
}
[
答案 0 :(得分:1)
代码中的主要问题是您将翻译应用于测试不正确的字符:您应该翻译大写字母是否确实是大写字母,如果您没有小写字母则不然。如编码,非字母翻译两次。
将代码更改为:
if (islower((unsigned char)message[i])) {
value = (((message[i]) - 'a') + ((pass[j]) - 'a'));
}
if (isupper((unsigned char)message[i])) {
value = (((message[i]) - 'A') + ((pass[j]) - 'a'));
}
另外,请确保使用字符常量而不是硬编码的ASCII值,并将密码设为小写。
在解密案例中,抵消似乎不正确。您也应该使用'A'
和'a'
。
答案 1 :(得分:0)
首先,消息损坏。如果在正在进行加密的循环中添加一些printf()
语句,您应该能够了解出现了什么问题。您可以随时将它们注释掉,或者在以后随时删除它们。
最后的K可以是加密的\ n,它将与消息一起读入。
要以五个字符为一组显示加密信息,请记住实际显示的字符数(确保增加计数的指令位于未显示字符时将被跳过的位置);当此值达到5时,显示一个空格并将计数器重置为零。