【问题标题】:Copy Function in C not creating matching ChecksumsC中的复制函数不创建匹配的校验和
【发布时间】:2020-08-07 10:32:58
【问题描述】:

我写了一个简单的复制程序,复制文件并生成MD5,它运行并正确生成MD5。

但是,在验证复制功能生成的文件时,它与源 MD5 不匹配。我在我的代码中看不到任何原因,有人可以帮忙吗?

#include <stdio.h>
#include <openssl/md5.h>
#include <assert.h>

#define BUFFER_SIZE 512

int secure_copy(char *filepath, char *destpath);

int main(int argc, char * argv[]) {
    secure_copy(argv[1], argv[2]);
    return 0;
}

int secure_copy(char *filepath, char *destpath) {
    FILE *src, *dest;
    src = fopen(filepath, "r");
    assert(src != NULL);

    dest = fopen(destpath, "w");
    assert(dest != 0);

    MD5_CTX c;
    char buf[BUFFER_SIZE];
    ssize_t bytes, out_writer;
    unsigned char out[MD5_DIGEST_LENGTH];
    MD5_Init(&c);

    while((bytes = fread(buf, 1, BUFFER_SIZE, src)) != 0) {
        MD5_Update(&c, buf, bytes);
        out_writer = fwrite(buf, 1, BUFFER_SIZE, dest);
        assert(out_writer != 0);
    }

    MD5_Final(out, &c);
    printf("MD5: ");
    for (int i=0; i < MD5_DIGEST_LENGTH; i++)
    {
        printf("%02x",  out[i]);
    }
    printf("\n");
    fclose(src);
    fclose(dest);
    return 0;
}

输出

$ ./md5speed doc.txt /home/doc.txt
MD5: 4c55e4b9185eece3cc000c4023f8f6fe

当使用md5sum 验证复制的文件时,我得到一个完全不同的哈希值。

md5sum doc.txt 
29cb4da30c3e28fdb81463b5f0a76894  doc.txt

虽然文件仍然打开并且内容未损坏。

【问题讨论】:

  • 你应该使用"rb""wb" 这样文件将被二进制处理。
  • 如果没有二进制文件,您的 MD5_Update 将在已翻译 cr/lf 的数据上运行。但是,写入会再次添加 cr(或 lf),因此生成的文件就可以了。
  • 啊,是的,谢谢!这些东西的结合现在正在起作用。你能解释一下用字节替换 Buffer 大小的效果吗?
  • 与根本问题无关,但您对assert 的使用不合适。 assert 应该用于检测代码中的逻辑错误,而不是输入/输出错误。
  • 谢谢,它只是一个快速的程序,通过/usr/bin/time -v在shell中测试函数的速度

标签: c openssl md5


【解决方案1】:

关于:

while((bytes = fread(buf, 1, BUFFER_SIZE, src)) != 0)

out_writer = fwrite(buf, 1, BUFFER_SIZE, dest);

在最后一次读取时,读取量可能小于 BUFFER_SIZE,因此应始终使用bytes 变量作为要写入的字节数。

此外,调用fread() 和/或fwrite() 时可能会发生某些错误。此类错误由返回的变量(字节、外写程序)中的负值(和/或小于这些函数的第三个参数的值)指示.代码要健壮,必须检查这些值并处理发生的任何错误,包括 EOF

【讨论】:

    【解决方案2】:

    如 cmets 所述,将 fwrite 函数更改为使用 bytes 而不是 BUFFER_SIZE 并结合将文件操作模式“rb”和“wb”更改为二进制。

    【讨论】:

      猜你喜欢
      • 2014-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 2019-06-05
      • 1970-01-01
      相关资源
      最近更新 更多