Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将无符号字符数组转换为字符数组_C_Hash_Hashcode_Sha1 - Fatal编程技术网

C 将无符号字符数组转换为字符数组

C 将无符号字符数组转换为字符数组,c,hash,hashcode,sha1,C,Hash,Hashcode,Sha1,我创建了一个C++项目,但我使用C中的CUDA代码。因此,我需要一个将无符号字符*转换为字符*的示例。下面是一个在C++中获取哈希的示例,但在C代码中,我将使用“malloc”而不是“new” 程序描述:在程序的输入端接收到需要破解的哈希。我使用hex_-to_-sting函数将其转换,并将计算的哈希值与sha1new函数进行比较 我的目标是对sha1算法进行几次迭代 例如: 1次迭代:单词“zzzz”=散列“cb990257247b592eaaed54b84b32d96b7904fd95” 2

我创建了一个C++项目,但我使用C中的CUDA代码。因此,我需要一个将无符号字符*转换为字符*的示例。下面是一个在C++中获取哈希的示例,但在C代码中,我将使用“malloc”而不是“new”

程序描述:在程序的输入端接收到需要破解的哈希。我使用hex_-to_-sting函数将其转换,并将计算的哈希值与sha1new函数进行比较

我的目标是对sha1算法进行几次迭代

例如:

1次迭代:单词“zzzz”=散列“cb990257247b592eaaed54b84b32d96b7904fd95”

2迭代:单词“CB990257247B592EAED54B84B32D96B7904FD95”-散列“775a2dae52c3ef080726dd427f81bd482fdf96b5”

我想将SHA1 NEW的输出转换为文本格式,然后再次将其传输到SHA1 NEW

sha1算法-从这里升级的代码:

sha1new()函数:

__device__ __host__ inline void sha1new(uint8* msg, uint8 length, uint8 sha1[20]) {
    CUDA_SHA1_CTX ctx;
    cuda_sha1_init(&ctx);
    cuda_sha1_update(&ctx, msg, length);
    cuda_sha1_final(&ctx, sha1);
}
十六进制到字符串:

void hex_to_string(uint8* msg, size_t msg_sz, char* hex, size_t hex_sz)
{
    memset(msg, '\0', msg_sz);
    for (int i = 0; i < hex_sz; i += 2)
    {
        uint8_t msb = (hex[i + 0] <= '9' ? hex[i + 0] - '0' : (hex[i + 0] & 0x5F) - 'A' + 10);
        uint8_t lsb = (hex[i + 1] <= '9' ? hex[i + 1] - '0' : (hex[i + 1] & 0x5F) - 'A' + 10);
        msg[i / 2] = (msb << 4) | lsb;
    }
}
void十六进制到字符串(uint8*msg,size\t msg\u sz,char*hex,size\t hex\u sz)
{
memset(msg,'\0',msg_sz);
对于(int i=0;iuint8_t msb=(hex[i+0]sha1散列是160位信息,可以存储在20个字节中。由于人类不读取二进制数据,因此它通常以十六进制形式打印,从而产生一个包含40个字符的字符串,范围为0-9和A-f(或A-f)

您必须意识到哈希算法本身对二进制数据有效。十六进制格式仅用于打印(或存储在文本文件中等)

因此,在执行哈希算法的多次迭代时,必须使用二进制数据,然后才能将其转换为十六进制格式

因此,类似这样的情况(注意:代码没有经过测试,因为我没有sha1new函数):

char*word=“zzzz”;
无符号字符*sha1hash=(无符号字符*)malloc(20);
//第一次迭代将字作为输入,并产生160位的散列
sha1new(单词、strlen(单词)、sha1hash);
//下面的iteraitons将散列作为输入,新的has作为输出
for(int i=1;i<迭代次数;i++){
sha1new(sha1hash,20,sha1hash);
//注意:这只适用于SHA1新函数接受相同的
//缓冲区作为输入和输出,否则就必须复制
}
//现在打印散列
对于(int i=0;i<20;i++){
printf(“%02x”,(int)sha1hash[i]);
}
//别忘了释放记忆
免费(sha1hash);
sha1hash=NULL;

>不能将字符数组转换为未签名的字符数组。尽管可以将其转换。但我不知道是否要将其转换为字节数据,还是希望将字节数据转换为十六进制数据。由于混合C和C++(标记为C但使用的是代码<新< /代码>),问题不清楚。我们不知道什么是
sha1new
函数。请提供答案并澄清您的问题,以便得到一个好的答案。@wovano现在检查它
uint8 sha1[20]
它正是一个sha1二进制数组。:)您需要的是字节到十六进制的转换:一个字节->两个十六进制字符。这导致初始数组的长度为20*2。@Roberto Caboni我有#define uint8 unsigned char:)@Bishamon,您不断更新您的问题,因此现在很难回答。请阅读并清楚地解释您需要的内容。您的最新代码(在撰写此评论时)不起作用,但需要一个与我之前解释的完全不同的答案。在我的程序中,需要进行黑客攻击的哈希是输入的。我从“zzzz”中创建了一个哈希,并从该哈希中创建了一个哈希。现在我转换输入哈希,并将其与从“zzzz”中接收到的哈希进行比较,但这不符合您的算法。现在,我将此信息添加到问题检查描述的描述中
   char* testhash = "cb990257247b592eaaed54b84b32d96b7904fd95";
   char* word = "zzzz";
   unsigned char* sha1hash = new unsigned char[41];
   sha1new((unsigned char*)word, 4, sha1hash);
   uint8 sha1Unhexed[21];
   hex_to_string(sha1Unhexed, 20, testhash, 40);
   for (int i = 0; i < 20; i++)
   {
       if (sha1Unhexed[i] != sha1hash[i])
           std::cout << "not equal" << std::endl;
   }