Преобразовать массив без знака в массив символов - PullRequest
0 голосов
/ 12 апреля 2020

Я создал C ++ проект, но я работаю с кодом для CUDA в C. Поэтому мне нужен пример преобразования без знака char * в char *. Ниже приведен пример получения ha sh в C ++, но в C code я буду использовать «mallo c» вместо «new»

Описание программы: Ха sh, который необходимо взломать, поступает на вход программы. Я конвертирую его с помощью функции hex_to_sting и сравниваю значение ha sh, вычисленное с помощью функции sha1new

Моя цель - выполнить несколько итераций алгоритма sha1.

Пример:

1 итерации: слово "ZZZZ" = га sh "cb990257247b592eaaed54b84b32d96b7904fd95";

2 итерации: слово "cb990257247b592eaaed54b84b32d96b7904fd95" - га sh «775a2dae52c3ef080726dd427f81bd482fdf96b5 ";

Я хочу преобразовать вывод sha1new в текстовый формат и снова перенести его в алгоритм sha1new

sha1 - немного обновленный код здесь: https://github.com/mochimodev/cuda-hashing-algos/blob/master/sha1.cu

Функция 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);
}

hex_to_string:

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;
    }
}

Его работа для одной итерации sha1 (не выводится "не равно") ):

   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;
   }

1 Ответ

0 голосов
/ 12 апреля 2020

Ша1 га sh - это 160 бит информации, которая может храниться в 20 байтах. Поскольку люди не читают двоичные данные, они часто печатаются в шестнадцатеричной форме, в результате получается строка из 40 символов в диапазоне от 0 до 9 и af (или AF).

Вы должны понимать, что хеширование Сам алгоритм работает на двоичных данных. Шестнадцатеричная форма используется только для печати (или сохранения в текстовом файле и т. Д. c.).

Так что при выполнении нескольких итераций алгоритма ha sh необходимо использовать двоичные данные. После этого вы можете преобразовать его в шестнадцатеричный формат.

Итак, что-то вроде этого (примечание: код не тестировался, потому что у меня нет функции sha1new):

char * word = "zzzz";
unsigned char * sha1hash = (unsigned char *)malloc(20);
// first iteration has word as input and yields a hash of 160 bits
sha1new(word, strlen(word), sha1hash);
// following iteraitons have the hash as input and a new has as output
for (int i = 1; i < number_of_iterations; i++) {
   sha1new(sha1hash, 20, sha1hash);
   // NOTE: this only works is the sha1new function accepts the same
   // buffer as input and output, otherwise you'd have to make copies
}

// now print the hash
for (int i = 0; i < 20; i++) {
   printf("%02x", (int)sha1hash[i]);
}

// and don't forget to free the memory
free(sha1hash);
sha1hash = NULL;
...