C语言中位与无符号字符数组的比较

C语言中位与无符号字符数组的比较,c,openssl,C,Openssl,我有一个在sha256哈希中测试部分冲突的函数。编译到名为sha256的文件后,终端中的调用如下所示: ./sha256 2612c7 函数sha256重复生成随机字节到无符号字符*变量,在这种情况下,让我们调用它buffer,并将第一个k位与给定的参数进行比较。buffer中的散列由OpenSSL生成 在本例中,给出的参数是2612c7,它存在于argv[1]中k=24,因为2612c7是24位。我需要重复比较buffer中的随机散列值与argv[1]并查看它们是否相同,这表示第一个k位发生

我有一个在sha256哈希中测试部分冲突的函数。编译到名为
sha256
的文件后,终端中的调用如下所示:

./sha256 2612c7
函数
sha256
重复生成随机字节到
无符号字符*
变量,在这种情况下,让我们调用它
buffer
,并将第一个
k
位与给定的参数进行比较。
buffer
中的散列由OpenSSL生成

在本例中,给出的参数是
2612c7
,它存在于
argv[1]
k=24,因为
2612c7
是24位。我需要重复比较
buffer
中的随机散列值与
argv[1]
并查看它们是否相同,这表示第一个
k
位发生冲突


我有点困惑,
argv[1]
作为什么形式存在?或者只是如何在总体上进行比较

我写了这个函数:

int match(unsigned char * buffer, unsigned char * hash_value) {
    int i = 0;

    while(hash_value[i] != '\0') {
        if(hash_value[i] != buffer[i]) {
            return 0;
        }
        i++;
    }

    return 1;
}
我用
match(buffer,(unsigned char*)argv[2])
调用
match
,但即使使用非常小的
k
值(例如
/sha256 2
),也没有发现冲突


以下是完整的代码:

#define _GNU_SOURCE

#include <unistd.h>
#include <sys/syscall.h>
#include <linux/random.h>

#include <openssl/conf.h>
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/rand.h>

#include <string.h>
#include <stdio.h>
#include <stdlib.h>

/* utitlity function to help matching */
int match(unsigned char * md_value, unsigned char * hash_value) {
    int i = 0;

    while(hash_value[i] != '\0') {
        if(hash_value[i] != md_value[i]) {
            return 0;
        }
        i++;
    }

    return 1;
}

/* ./this.o <digest method> <hash value> */
int main(int argc, char *argv[]) {  
    /* hash function initiation */
    EVP_MD_CTX *mdctx;
    const EVP_MD *md;
    unsigned char md_value[EVP_MAX_MD_SIZE];
    int md_len;

    /* seeding for random number generator */
    void *seed = NULL;
    int rseed;

    /* random generator initiation */
    unsigned char buffer[128];

    /* utility variables for counting */
    int i = 0;

    /* parameter checking */
    if (argv[2] == NULL) {
        printf("No hash value given\n");
        exit(1);
    } else if (argv[1] == NULL) {
        printf("No digest method given\n");
        exit(1);
    }

    /* get hash method */
    OpenSSL_add_all_algorithms();
    md = EVP_get_digestbyname(argv[1]);
    if (md == NULL) {
        printf("Unknown message digest %s\n", argv[1]);
        exit(1);
    }

    /* random generator initialization */
    if(RAND_load_file("/dev/random", 32) != 32) {
        printf("random initialization failed");
        exit(1);
    }

    do {

        /* generate random text */
        if(RAND_bytes(buffer, sizeof(buffer)) != 1) {
            printf("failed generating random text");
            exit(1);
        } 

        /* hash the random text */
        mdctx = EVP_MD_CTX_create();
        EVP_DigestInit_ex(mdctx, md, NULL);
        EVP_DigestUpdate(mdctx, buffer, strlen(buffer));
        EVP_DigestFinal_ex(mdctx, md_value, &md_len);
        EVP_MD_CTX_destroy(mdctx);

        /* reseed random */
        rseed = syscall(SYS_getrandom, seed, (size_t) 128, (unsigned int) 1);
        RAND_seed(seed, rseed);

        i++;
    } while(match(md_value, (unsigned char *) argv[2]) == 0);

    printf("collision found: %d tries\n", i);

    return 0;
}
定义GNU源
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
/*有助于匹配的实用功能*/
int匹配(无符号字符*md_值,无符号字符*哈希_值){
int i=0;
while(哈希值[i]!='\0'){
if(散列值[i]!=md\u值[i]){
返回0;
}
i++;
}
返回1;
}
/*/这个*/
intmain(intargc,char*argv[]){
/*哈希函数初始化*/
EVP_MD_CTX*mdctx;
工程执行副总裁(总经理)总经理(总经理);;
无符号字符md_值[EVP_MAX_md_SIZE];
国际货币基金组织;
/*随机数发生器的种子设定*/
void*seed=NULL;
内接;
/*随机发生器启动*/
无符号字符缓冲区[128];
/*用于计数的效用变量*/
int i=0;
/*参数检查*/
如果(argv[2]==NULL){
printf(“没有给出哈希值\n”);
出口(1);
}else if(argv[1]==NULL){
printf(“未给出摘要方法”);
出口(1);
}
/*获取散列方法*/
OpenSSL_添加_所有算法();
md=EVP_get_digestbyname(argv[1]);
if(md==NULL){
printf(“未知消息摘要%s\n”,argv[1]);
出口(1);
}
/*随机发生器初始化*/
if(随机加载文件(“/dev/random”,32)!=32){
printf(“随机初始化失败”);
出口(1);
}
做{
/*生成随机文本*/
if(RAND_字节(缓冲区,sizeof(缓冲区))!=1){
printf(“生成随机文本失败”);
出口(1);
} 
/*散列随机文本*/
mdctx=EVP_MD_CTX_create();
EVP_DigestInit_ex(mdctx,md,NULL);
EVP_DigestUpdate(mdctx、缓冲区、strlen(缓冲区));
执行副总裁(mdctx、md值和md长度);
执行副总裁MD CTX销毁(mdctx);
/*随机种子*/
rseed=syscall(SYS_getrandom,seed,(size_t)128,(unsigned int)1);
兰杜种子(种子,种子);
i++;
}while(匹配(md_值,(无符号字符*)argv[2])==0);
printf(“发现冲突:%d次尝试\n”,i);
返回0;
}

请注意,该函数实际上是使用
/a.out SHA2562612C7
调用的,为了简单起见,我简化了上面的示例。

match()
函数中,它看起来不像是递增的
I
。如何准确填充
缓冲区?A会有帮助的。很抱歉,我忘了记下来,
I
不是问题@DavidBowling@dbush我提供的链接提供了一个完整的例子,一个很好的理由,包括一个供我们工作的。。。。