C 将无符号字符数组转换为字符数组
我创建了一个C++项目,但我使用C中的CUDA代码。因此,我需要一个将无符号字符*转换为字符*的示例。下面是一个在C++中获取哈希的示例,但在C代码中,我将使用“malloc”而不是“new” 程序描述:在程序的输入端接收到需要破解的哈希。我使用hex_-to_-sting函数将其转换,并将计算的哈希值与sha1new函数进行比较 我的目标是对sha1算法进行几次迭代 例如: 1次迭代:单词“zzzz”=散列“cb990257247b592eaaed54b84b32d96b7904fd95” 2迭代:单词“CB990257247B592EAED54B84B32D96B7904FD95”-散列“775a2dae52c3ef080726dd427f81bd482fdf96b5” 我想将SHA1 NEW的输出转换为文本格式,然后再次将其传输到SHA1 NEW sha1算法-从这里升级的代码: sha1new()函数: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
__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;i uint8_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;
}