首页 > 解决方案 > c中的凯撒密码表现出罕见的行为

问题描述

我在 c 中做一个凯撒密码来练习,我做了一个功能正常的密码;但它显示出一种奇怪的行为。代码如下:

#define lenght 18
char * caesar ( char * cyphertext, int key){
        static char result [lenght];
        for ( int i= 0; i < lenght ; i++){
                result [i] =(char)(((int) cyphertext[i]) + key) % 255;
        }
        return result;
}
int main(){
        char * text = caesar("Hola buenas tardes", 23 );
        printf("%s \n" , text );
        char * check = caesar( text , 256 - 23);
        printf("%s \n" , check);
        return 0;
        }

加密后的版本是_x7y|x7x{|; 一个较短的数字;但是当我使用解密密钥运行第二个凯撒密码时,
它会毫无问题地将其解密为原始状态。我一直在环顾四周,可能是关于字符的存储方式。我将非常感谢任何帮助

标签: ccryptographystorage

解决方案


加密后的版本是_x7y|x7x{|; 一个较短的数字;

不,打印的是上面的内容。printf或者更准确地说,这就是您的终端显示printf打印内容的方式。如果您想确切地确定加密版本是什么,那么您应该在调试器中运行您的程序,并使用它来检查编码版本的字节。

您的方法会将可打印 ASCII 范围内的一些字符代码(十进制 32 - 126 代码)编码为该范围之外的代码。您的终端如何处理这些字节取决于您的配置和环境,但如果它需要 UTF-8 编码的数据,那么它将在输出中跳过无效的代码序列,如果它需要 ISO-8859 编码,那么一些输出代码将被解释为 C1 集中的控制字符。还有其他可能性。

通常,Caesar-cypher 程序会小心地将所有可打印字符映射到其他可打印字符,而忽略其他字符。典型的学术活动范围更窄,要求一个程序只映射大写和小写拉丁字母,保留大小写,而忽略所有其他(标点符号、数字、控制字符)。因此,这留作练习。


推荐阅读