C中的Vigenere代码与多字符键

时间:2015-10-26 12:45:53

标签: 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) ;
}

2 个答案:

答案 0 :(得分:1)

当我使用GCC编译您的程序时,我会收到警告&#34;格式&#39;%X&#39;期望类型&#39; unsigned int *&#39;的参数,但参数3的类型为&#39; unsigned char *&#39;&#34;。这是一个可能导致崩溃的错误,因为char通常是一个字节宽,而int通常是四个字节。 fscanf将尝试在您的单字节空间中放置四个字节的数据,愉快地覆盖之后的任何数据。

正如BLUEPIXY在评论中建议的那样,您只需将<FooterTemplate[\r\s\S]+?</FooterTemplate> 替换为unsigned char ch

除此之外,它在我尝试时有效,除了你应该检查来自fopen的返回值之外,我没有看到其他明显的问题。

答案 1 :(得分:0)

我必须阅读&#39;%c&#39;没有&#39;%02X&#39;并将字符转换为十六进制值。 最终的代码解决了:

#include <stdio.h>
#define KL 3

int ctox(char c)               //this is the convertin part
{
if(c>='0'&&c<='9') return c-'0';
return 10+c-'A';
}

main()
{
    unsigned char ch, c1, c2;
    FILE *fpIn, *fpOut;
    int i=0;
    unsigned char key[KL] = {0x4B, 0x49, 0x4F} ;

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



    while(fscanf(fpIn, "%c%c", &c1, &c2) != EOF)    //the read in part corrected
    {
    ch = 16*ctox(c1) + ctox(c2);

    printf("HEX %c%c ", c1, c2); 
    printf("DEC %3d ", ch);       // this three line just for examination
    printf("i %d\n", i);

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

    }

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

谢谢你们所有人。