我有一个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位数字?
答案 0 :(得分:2)
直接的答案是使用处理大整数的库。对于C the OpenSSL BN_
functions执行大数字操作,仅举一个明显的操作。
不那么直接的答案是简单地使用结果数组的256位/ 32字节的64位/ 8字节(最左边)位并将其放入64位“长”数字(int64_t
可能是最好的)。然后,您只需使用x
运算符检索该值的模%
即可。
请注意,结果不分布在限制x
上且不是2的幂。在这种情况下,您可能需要丢弃等于或大于r
的任何数字x * n
,其中n
是x * n
仍适合64位的最大值。如果你不丢弃这些值,那么你的结果可能会更低(<微小)。
当然,如果你的结果恰好是2的幂p
,那么你也可以取p
(最左边)位并将这些位解释为大小相同或更高的无符号整数。