将SHA256哈希转换为c中的数字

将SHA256哈希转换为c中的数字,c,hash,type-conversion,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 BLOC

我有一个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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义块大小1048576
#定义子块大小16
内部主(空){
SHA256_CTX CTX;
int SHA256_Init(SHA256_CTX*CTX);
u__int8_t结果[32];
文件*填充;
char buf[子块大小];
int bufsize=子块大小;
infle=fopen(“样本数据”,“r”);
int i=0;
int n;
while(fread(buf,SUBBLOCKSIZE,1,infle)!=NULL){
SHA256_Init(&ctx);
n=strlen(buf);
SHA256_更新(&ctx,(u_int8_t*)buf,n);
SHA256_最终结果(结果和ctx);
//在这里找。。。。。
i++;
}
返回0;
}
在我的代码中,“results”是SHA256的哈希结果。我想将其转换为256位的数字,并将其修改为1024(或其他任意整数)。然后,我在fseek中将结果用作输入,以定位到下一个文件指针


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

直接的答案是使用一个处理大整数的库。对于C来说,对大数字执行操作,仅举一个明显的例子

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

请注意,结果在不是二次幂的极限
x
上分布不均匀。在这种情况下,您可能需要丢弃任何大于或等于
x*n
r
,其中
n
是最大值,其中
x*n
仍适合64位。如果您不放弃这些值,那么您有一个(微小的)更高的机会,结果将是一个较低的值


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

resulta[32]
是您的256位数字。如果您希望它是十六进制表示,请使用
SHA224_Data
函数。@MichaelWalz,这样我就可以使用它了?例如,int newloc=results%1024?如果您想要一个256位的数字(表示为一个普通数字,而不是一个数组),请准备编写自己的长数学函数集,并只处理
结果
。当然不是。为什么要得到模1024的摘要?@Luke,
int newloc=results%1024不起作用,因为您在这里修改
结果的地址
我阅读了BN文档,只找到了从BN到其他格式(如BN_bn2bin())的转换。有没有一个函数可以将字节转换为BN?那怎么办(是的,OpenSSL API文档很烂,甚至在我的个人资料页面上都这么说)。请注意,上面没有包含任何其他加密建议。例如,SHA-256没有输出与先前输入相同的周期。你的计划当然不是这样的;完全有可能重新生成相同的位置并进入一个无休止的循环。为了避免这种情况,您可以使用排序算法(使用伪随机数生成器)。因为我不知道这个用例,所以我不能对此发表评论。