调整C中的现有GOST代码以散列文件

时间:2015-07-21 19:49:23

标签: c algorithm hash cryptography

我正在尝试使用C手动编写GOST哈希函数。我遇到了Markku-Juhani Saarinen(来自link)的以下代码。

main(int argc, char *argv[])

但是,没有 main()函数可用于编译可执行文件。我想要一个类型为main()的主要用于调用带有生成的可执行文件的文件,并将文件的内容进行哈希处理。

我一遍又一遍地看过代码,但我一直在调用代码的功能,我不知道如何继续。请问,关于我如何填写运行此代码的主函数的任何想法?

修改

我尝试了以下void main(int argc, char *argv[]){ if (argc!=2) { fprintf(stderr, "Error: Provide name of one source file.\n"); exit(EXIT_FAILURE); } char *clear_file = argv[1]; const char *FILENAME_IN = clear_file; FILE *infile; infile = fopen(FILENAME_IN, "r"); GostHashCtx *ctx = malloc(sizeof(GostHashCtx)); unsigned char *digest, *buf; char c; if(infile == NULL){ fprintf(stderr, "Error: Source file not found.\n"); exit(EXIT_FAILURE); } gosthash_init(); gosthash_reset(ctx); //printf("CTX.PB=%d\n\n",ctx->partial_bytes); int quit = 0; while (quit == 0) { int p = 0; buf = malloc(256); strcpy(buf, ""); while(((c = fgetc(infile)) != EOF) && (p < 256)) { *(buf+p) = c; p++; } //*(buf+p) = '\0'; if(c == EOF) quit = 1; gosthash_update(ctx, buf, 256); free(buf); } digest = malloc(256); strcpy(digest, ""); gosthash_final(ctx, digest); printf("%s\n", digest); free(ctx); free(digest); } 代码,但它似乎不起作用:

digest

为了验证输出,我使用在线工具将结果字符串gosthash_init快速转换为HEX,但结果对于GOST散列的已知测试值不正确。 请问,为什么会出现这种情况?

3 个答案:

答案 0 :(得分:1)

好的,首先你必须调用GostHashCtx来填充查找表。然后你分配你需要的gosthash_update类型的上下文 - 在你的情况下你可能只需要一个。您可以提前重置它以确保上下文填充零值。

现在,您可以调用gosthash_final一次或多次来散列文件中的所有字节(当然是顺序)。最后,您调用gosthash_reset来创建哈希。这些步骤执行实际的散列。

如果您想哈希其他内容,请先致电gosthash_update,然后再次gosthash_final和{{1}}。

答案 1 :(得分:0)

当你到达文件的末尾时,如果文件长度不是256的倍数,你就不会填充缓冲区,但仍然会调用大小为256的gosthash_update,意味着它将散列在缓冲区的其余部分中的任何随机垃圾中。尝试将其更改为gosthash_update(ctx, buf, p);

也无需拨打malloc - 只需使用本地变量即可。您可以使用open / read而不是fopen / fgetc来简化操作:

char buf[2048];  /* or any size you like */
int len;
int fd = open(FILENAME_IN, O_RDONLY);
GostHashCtxt ctx;
gosthash_init();
gosthash_reset(&ctx);
while ((len = read(fd, buf, sizeof(buf)) > 0)
    gosthash_update(&ctx, buf, len);
gosthash_final(&ctx, buf);
write(1, buf, 32);

请注意,生成的摘要是 NOT 以空字符结尾的字符串 - 它是32字节的二进制数据。因此,您无法使用printf("%s",

安全地打印它

答案 2 :(得分:0)

如果其他人遇到同样的问题,我会在这里发布main()函数的最终代码。再次感谢@ChrisDodd和@MaartenBodewes的帮助。

编辑:我已将其作为CW进行任何改进。 (由于指令gosthash_final(ctx, digest);,当前代码在Windows下使用 MinGW 正常工作但在某些环境(如openSUSE Linux)中执行 分段错误 我追溯到gosthash_compress()函数中对gosthash_final()的调用。)

/* I used this function to get the hash result in HEX format */
void hexify(unsigned char *in, char *out) {
    char hex[64], tmp[3];
    int i; 
    hex[0]='\0';
    for(i=0; i<32; i++ )
    {
        sprintf(tmp, "%02X", in[i]);
        strcat(hex, tmp); 
    }
    strcpy(out, hex);
}

int main(int argc, char *argv[]){
    if (argc!=2) {
        fprintf(stderr, "Error: Provide name of one source file.\n");
        exit(EXIT_FAILURE);
    }

    char *clear_file = argv[1];
    const char *FILENAME_IN = clear_file;

    FILE *infile;
    infile = fopen(FILENAME_IN, "r");

    GostHashCtx *ctx = malloc(sizeof(GostHashCtx));
    unsigned char digest[32], buf[16];

    char hex[64];
    hex[0]='\0';

    if(infile == NULL){
        fprintf(stderr, "Error: Source file not found.\n");
        exit(EXIT_FAILURE);
    }

    gosthash_init();
    gosthash_reset(ctx); 

    size_t nread;
    while ((nread = fread(buf, 1, sizeof(buf), infile)) > 0)
        gosthash_update(ctx, buf, nread);
    fclose(infile);

    digest[0]='\0';
    gosthash_final(ctx, digest);

    hexify(digest, hex); 

    printf("HASH= %s\n", hex);

    free(ctx);
    return 0;
}