我正在尝试使用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散列的已知测试值不正确。
请问,为什么会出现这种情况?
答案 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;
}