c - C 中的 Vigenere 代码因多字符键而崩溃

标签 c encryption vigenere

如果我使用一个字符长的键,一切正常,但如果我使用更长的键,程序就会崩溃。 对于此输入:'2A282E2A282E' 应该输出这个:'aaaaaa'

#include <stdio.h>
#define KL 3
main()
{
    unsigned char ch;
    FILE *fpIn, *fpOut;
    int i;
    unsigned char key[KL] = {0x4B, 0x49, 0x4F};

    fpIn = fopen("ctext.txt", "r");
    fpOut = fopen("dtext.txt", "w");

    i=0;
    while(fscanf(fpIn, "%02X", &ch) != EOF)
    {

        fprintf(fpOut, "%c", ch ^ key[i % KL]); 
        i++;

    }

    fclose(fpIn);
    fclose(fpOut);
    return(0) ;
}

最佳答案

当我用 GCC 编译你的程序时,我收到警告“格式 '%X' 需要类型为 'unsigned int *' 的参数,但参数 3 的类型为 'unsigned char *'”。这是一个可能导致崩溃的错误,因为 char 通常是一个字节宽,而 int 通常是四个字节。 fscanf 将尝试将四个字节的数据放入您的单字节空间,并愉快地覆盖后面的任何数据。

正如 BLUEPIXY 在评论中建议的那样,您只需将 unsigned char ch 替换为 unsigned ch

除此之外,当我尝试它时它起作用了,我没有发现其他明显的问题,除了你应该检查 fopen 的返回值。

关于c - C 中的 Vigenere 代码因多字符键而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33346128/

相关文章:

c++ - VS 2015 的 HYPRE blas 构建错误

C 将 float 转换为整数

PHP 安全 - 密码和凭据管理?

Python3 - 索引超出范围(维吉尼亚密码)

java - 这种 vigenere 密码在 Java 中是否可行?

c - 传递包含 "!!!!"的字符串时 argv 的奇怪行为

c - "Simplify"到一行

java - 加密/安全通信 Android 应用 <-> REST Web 服务

c# - IIS 因 Windows Azure 存储加密而随机挂起

python - Vigenère Cipher 函数实现