将sha 256 hash转换为c中的数字

时间:2016-05-26 16:03:02

标签: c hash type-conversion

我有一个16MB的文件。我想每次采用16字节的数据夹,使用SHA256对其进行哈希处理,然后使用结果指向要进行哈希处理的16字节块的下一个位置。

例如,

#include <openssl/aes.h>
#include <openssl/sha.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


#define BLOCKSIZE 1048576
#define SUBBLOCKSIZE 16

int main(void) {

  SHA256_CTX ctx;
  int SHA256_Init(SHA256_CTX *ctx);
  u_int8_t results[32];

  FILE *infile;
  char buf[SUBBLOCKSIZE];
  int bufsize = SUBBLOCKSIZE;

  infile = fopen("sample.dat", "r");
  int i = 0;
  int n;

  while (fread(buf, SUBBLOCKSIZE, 1, infile) != NULL) {
    SHA256_Init(&ctx);
    n = strlen(buf);
    SHA256_Update(&ctx, (u_int8_t *)buf, n);
    SHA256_Final(results, &ctx);

    //fseek here.....

    i++;
  }

  return 0;
}

在我的代码中,'results'是SHA256的哈希结果。我想将其转换为256位数字并将其修改为1024(或其他任意整数)。然后我使用结果作为fseek中的输入来定位到下一个文件指针。

我想知道如何将“结果”转换为256位数字?

1 个答案:

答案 0 :(得分:2)

直接的答案是使用处理大整数的库。对于C the OpenSSL BN_ functions执行大数字操作,仅举一个明显的操作。

不那么直接的答案是简单地使用结果数组的256位/ 32字节的64位/ 8字节(最左边)位并将其放入64位“长”数字(int64_t可能是最好的)。然后,您只需使用x运算符检索该值的模%即可。

请注意,结果分布在限制x上且不是2的幂。在这种情况下,您可能需要丢弃等于或大于r的任何数字x * n,其中nx * n仍适合64位的最大值。如果你不丢弃这些值,那么你的结果可能会更低(<微小)。

当然,如果你的结果恰好是2的幂p,那么你也可以取p(最左边)位并将这些位解释为大小相同或更高的无符号整数。