我有一个 16MB 的文件。我想每次取出 16 字节数据 block ,使用 SHA256 对其进行哈希处理,然后使用结果指向要哈希的 16 字节 block 的下一个位置。
例如,
#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;
}
在我的代码中,“结果”是 SHA256 的哈希结果。我想将它转换为 256 位数字并按 1024(或其他任意整数)对其进行 mod。然后我使用结果作为 fseek 中的输入来定位到下一个文件指针。
我想知道如何将“结果”转换为 256 位数字?
最佳答案
直接的答案是使用一个处理大整数的库。对于C the OpenSSL BN_
functions仅举一个明显的例子,对大数执行操作。
不太直接的答案是简单地使用结果数组的 256 位/32 字节中的 64 位/8 字节(最左边)位,并将其放入 64 位“长”数字( int64_t
可能是最好的)。然后你可以简单地检索模 x
使用 %
获得该值运算符。
请注意,结果未在限制上很好地分布 x
那不是二的幂。在这种情况下,您可能需要丢弃任何数字 r
等于或大于 x * n
哪里n
是最大值,其中 x * n
仍然适合 64 位。如果您不丢弃这些值,那么您有(微小)更高的机会得到较低的值。
当然,如果你的结果恰好是幂 p
2 那么你不妨采取 p
(最左边的)位并将这些位解释为大小相同或更大的无符号整数。
关于将 sha 256 哈希转换为 c 中的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37465886/