使用Vigenère的密码C实现加密消息的程序

时间:2017-03-09 10:40:38

标签: c cs50

我试图制作一个程序,即使用Vigenere的密码。每3个字母都错了。有人可以给我一个暗示吗?谢谢你的帮助。

#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>


int main(int argc, string argv[])
{

int n = 0;
int j = 0;
int p;
int l;
int x = 0;


if(argc != 2)
{
    printf("missing command-line argument\n");
    return 1;
} else
{
    printf("plaintext: ");
}    

string text = get_string();
string key = (argv[1]);

printf("ciphertext: ");


for (j = 0, x = 0, n = strlen(text); j < n; j++)
{

  p = (((text[j] - 65) + ((key[x] - 65) % strlen(key))) % 26) + 65;
  l = (((text[j] - 97) + ((key[x] - 97) % strlen(key))) % 26) + 97;

if(isalpha(text[j]))
{
  if( isupper (text[j]))
  {
    printf("%c", p);
    x++;
  }
  if( islower (text[j]))
  {
    printf("%c", l);
    x++;
  }
}else
{
  printf("%c", text[j]);
}
 if(x == strlen(key))
 {
  x = 0;
 }
 }
 printf("\n");
 return 0;
 }

如果int p,int l错误或者是另一个问题,我无法判断。

听取是输入/输出的例子

:)使用“a”作为关键字将“a”加密为“a”

:(使用“baz”作为关键字将“barfoo”加密为“caqgon”    预期输出,但不是“密文:casgop \ n”

:(使用“BaZ”作为关键字将“BaRFoo”加密为“CaQGon”    预期输出,但不是“密文:CaSGoo \ n”

:(使用“BAZ”作为关键字将“BARFOO”加密为“CAQGON”    预期输出,但不是“密文:CASGOP \ n”

:(使用“baz”作为关键字将“世界!$?”加密为“xoqmd!$?”    预期输出,但不是“密文:xosmd!$?\ n”

:(加密“世界,打个招呼!”作为“xoqmd,rby gflkp!”使用“baz”作为关键字    预期输出,但不是“密文:xosmd,tby iflmp!\ n”

1 个答案:

答案 0 :(得分:0)

查看密码的维基百科描述,打破数学,你有17(R)+ 25(Z)mod 26,这是16(Q)...所以基本上用Z加密任何字母会得到你R之前的字母是Q.

但是你的代码没有做那些数学 - 它在错误的地方有一个虚假的“%strlen(key)”,这就是为什么你认为它应该是一个S.你想要在{{{ 1}}喜欢这样,因此你可以抛弃变量key

x

另外,你会注意到我更换了65&amp; 97使用字符使代码更具可读性。