C中的Vigenere密码不起作用
我正在尝试制作维格纳密码。 有关资料如下: 我的代码在少数情况下似乎不起作用。 我的代码列在下面,请不要给我一个如何制作维格纳密码的链接,而是一个修复我的密码的方法。例如,如果我将键设为z,则根据字母表,它的值为25。现在,如果我把要加密的文本作为c,它是2,新文本的值是27,应该显示b,但对我来说不是。因此,如果值超过25,它不会显示我想要的内容,否则它会工作。对于实际输出示例: ab作为密钥应将ca更改为cbC中的Vigenere密码不起作用,c,string,ascii,cs50,vigenere,C,String,Ascii,Cs50,Vigenere,我正在尝试制作维格纳密码。 有关资料如下: 我的代码在少数情况下似乎不起作用。 我的代码列在下面,请不要给我一个如何制作维格纳密码的链接,而是一个修复我的密码的方法。例如,如果我将键设为z,则根据字母表,它的值为25。现在,如果我把要加密的文本作为c,它是2,新文本的值是27,应该显示b,但对我来说不是。因此,如果值超过25,它不会显示我想要的内容,否则它会工作。对于实际输出示例: ab作为密钥应将ca更改为cb #include<stdio.h> #include&
#include<stdio.h>
#include<cs50.h>
#include<ctype.h>
#include<string.h>
#include<stdlib.h>
int main( int argc , string argv[]){
//string plaintext;
string key;
if(argc != 2){
printf("Please run the programme again this time using a command line argument!\n");
return 1;
}
key = argv[1];
int keys[strlen(key)];
for(int m = 0; m< strlen(key);m++){
if(isalpha(key[m])==false){
printf("Re-Run The programme without any symbols.\n");
return 1;
}
}
for(int b = 0; b < strlen(key);b++){
if(isupper(key[b]) == false){
keys[b] = key[b] - 'a';
}
else{
keys[b] = key[b] - 'A';
}
}
//printf("Enter a string which should be encrypted: \n");
string plaintext = GetString();
int plength = strlen(plaintext);
int klength = strlen(key);
string ciphertext = key;
for(int u = 0; u<plength;u++){
if(isalpha(plaintext[u])==false){
printf("%c",plaintext[u]);
continue;
}
int value = u % klength;
ciphertext[u] = (keys[value] + plaintext[u]);
//By the more than 90 I am referring to 'z'
if(ciphertext[u]>90){
ciphertext[u] = ciphertext[u] ;
}
printf("%c",ciphertext[u]);
}
printf("\n");
return 0;
}
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符串argv[]){
//字符串明文;
字符串键;
如果(argc!=2){
printf(“这次请使用命令行参数再次运行程序!\n”);
返回1;
}
key=argv[1];
整数键[strlen(键)];
对于(int m=0;m
谢谢
Kalyan通过从键的代码中持续减去大写字母的
'A'
,以及小写字母的'A'
,可以正确处理键中的值。它给你:A | A=>0,B | B=>1,Z | Z=>25。直到这里都很好
但是加密时,您只需将此值添加到字符的代码中,而无需在任何时候进行换行
让我们使用您的示例:键中的键是'z'=>值25,很好。以字符“c”为例。其ASCII(*)代码为0x63或99。99+25=124在ascii表格中给出“|”
!要正确包装它,您必须确保以任何方式“z”+1=>“a”。你的代码可能是
/* test wrapping for lowercase letters */
if ((islower(plaintext[u]) && (ciphertext[u]>'z')) {
ciphertext[u] = ciphertext[u] - 'z' + 'a' - 1;
}
/* same for uppercase */
if ((isupper(plaintext[u]) && (ciphertext[u]>'Z')) {
ciphertext[u] = ciphertext[u] - 'Z' + 'A' - 1;
}
(*)该示例假定使用ASCII码,因为它是当今最常见的,但是代码只假设所有大写字母都是按顺序排列的,所有小写字母也都是按顺序排列的,不要求它们的精确值,也不要求大小写顺序。您的格式/缩进需要注意。您需要向我们展示一些输入、预期输出和实际输出。关于Vigenere密码还有很多其他问题,其中一些问题列在页面右侧的“相关”问题部分,其中一个问题很可能会解释您的问题所在。(您的行如果(密文[u]>90){
不应使用90
;可能您指的是'Z'
)请注意,在ASCII和相关代码集(如CP 1252、8859-1、8859-15和Unicode)中,小写字母Z的字符代码是122);大写字母Z为90。请使用额外的信息更新问题,例如导致问题的密钥、示例输入数据、实际输出数据(我们不必编译代码来了解您看到的内容,尤其是因为我们可能看不到您看到的内容,因为我们有不同的计算机)和所需的输出数据。然后删除到目前为止您所做的评论。当您提出问题时,澄清会出现在问题中,而不是评论中。对于key=abc
和text=dog
,实际输出=dpi
,而不是预期的输出=eqj
。出现了一个一个错误-我不确定它是否正确如果keya
应该移位1,那么keyz
应该是不可操作的移位26-对吗?无论如何,用一个off来修正一个错误通常是相当直接的。不幸的是,这里要复杂得多:你有If(ciphertext[u]>90){ciphertext[u]=ciphertext[u];}
这不会改变任何东西。请注意,dog
中的所有字母都有一个值>90
。分别处理小写和大写字母。Jonathan一个接一个都符合计划,>90我不知道该怎么办,请提供代码来修复vigenere密码。我理解它,非常感谢,但我不确定我想去哪里你能把它整合到我的代码中并重新发布答案吗?@KalyanNadimpalli这应该取代你的if(ciphertext[u]>90){ciphertext[u]=ciphertext[u];}
我也这么认为,但它不起作用,因为他们说未识别的变量b。b只是上一个变量的局部变量,用于循环OK,非常感谢它起作用,请将代码中的b更改为u。@KalyanNadimpalli愚蠢的复制粘贴…(或愚蠢的我…)。已编辑