使用Caesar的密码加密文本

时间:2017-02-26 11:17:50

标签: c algorithm encryption

我正在编写这个C程序,它接受命令行参数,然后加密用户稍后输入的文本。

我们通过加密中使用的命令行输入一个数字。例如,如果我们从命令行输入数字1然后用户想要加密说“aaaa”,则加密文本将是“bbbb”,只是每个都移动了一个字符。我输出了输出,但没有打印出文字。我的错是什么?

这是我的代码

int main(int argc , string argv[])
    {
       if(argc != 2)
         {
            return -1;
         }
    int k = atoi(argv[1]);
    printf("Enter the text to be encrypted : ");
    string text = get_string();
    int length = strlen(text);
    for(int i=0 ; i<length ; i++)
       {
           int p = text[i];
           int c = (p + k) % 26; 
           printf("%c",c);
        }
   }

1 个答案:

答案 0 :(得分:5)

这段代码:

int c = (p + k) % 26; 
printf("%c",c);

很可能不会打印任何有价值的东西,因为结果值将在0..25范围内,在ASCII中是不同的控制字符。你要做的是检查字符是ASCII小写还是ASCII大写,然后才进行旋转,并确保结果也在相同的范围内:

unsigned int c = text[i];
if (c >= 'A' && c <= 'Z') {
    c = ((c - 'A') + k) % 26 + 'A';
}
else if (c >= 'a' && c <= 'z') {
    c = ((c - 'a') + k) % 26 + 'a';
}
printf("%c", c);

如果值介于'A''Z'之间,我们会减去'A'的代码,以便这些代码从0映射到25(请注意我们和#39;在这里假设从AZ的字符代码按字母顺序连续排序 - 这适用于ASCII,但不适用于带有EBCDIC的IBM大型机,所以请考虑自己被警告! ),然后在那里进行模数学运算,然后再次添加'A'的代码以进入原始范围。

我们在else if中为小写字母执行相同的操作。