C语言中位与无符号字符数组的比较
我有一个在sha256哈希中测试部分冲突的函数。编译到名为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 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我提供的链接提供了一个完整的例子,一个很好的理由,包括一个供我们工作的。。。。