0

该程序应该使用 vigenere cypher 加密某个消息。该程序应该对消息和关键字都“区分大小写”。如果程序遇到任何特殊字符或数字,也应该将它们原封不动地打印出来。

最后一部分似乎正在工作,其余部分,即使数学似乎是正确的,它也没有按预期打印。我还将 ASCII 值转换为 AZ/0-26,执行密码公式,然后将它们转换回 ASCII。

    // key validation
    string kw = argv[1];
    int kwl = strlen(kw);
    for (int i = 0; i < kwl; i++)
    {
        if (!isalpha(kw[i]))
        {
            printf("Usage: ./vigenere keyword\n");
            return 1;
        }
    }

    // get message and length
    string mssg; 
    mssg = GetString();
    int lngth = strlen(mssg);


    // cryptography 
    int k = 0;
    for (int j = 0; j < lngth; j++)
    {
        if (isalpha(mssg[j]))
        {
            if (islower(mssg[j]))
            {
                if (islower(kw[k % kwl]))       
                    printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 97)) & 26) + 97);
                else
                    printf("%c", (((mssg[j] - 97) + (kw[k % kwl] - 65)) & 26) + 97);
                k++;
            }
            else if (isupper(mssg[j]))
            {
                if (isupper(kw[k % kwl]))
                    printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 65)) & 26) + 65);
                else
                    printf("%c", (((mssg[j] - 65) + (kw[k % kwl] - 97)) & 26) + 65);
                k++;
            }
        }    
        else
            printf("%c", mssg[j]);
    }

    printf("\n");

    return 0;
}
4

1 回答 1

0

我仍然在数学的某个地方遇到错误

错误是你有& 26而不是% 26.

于 2017-03-10T12:42:04.210 回答