Как создать простую программу, используя потоки в C? - PullRequest
2 голосов
/ 04 ноября 2011

Я новичок в разработке на C, знаю только основы и мне нужно создать программу, которая обнаружит простой хэш-пароль, подобный этому:

#define _GNU_SOURCE
#include <stdio.h>
#include <string.h>
#include <crypt.h>
#include <stdlib.h>

#define SIZE_HASH 256
#define SIZE_PASSWORD 4

/* Get the hash from a passwod and put the result in hash. The array hash shoud have at lest 14 elements. */
void calculate_hash_password(const char *password, char *hash);

void increment_password(char *password);
void test_password(const char *p_hash, const char *password);

int main(int argc, char *argv[]) {
  int i;
  char password[SIZE_PASSWORD + 1];

  if (argc != 2) {
    printf("Use: %s <hash>", argv[0]);
    return 1;
  }

  for (i = 0; i < SIZE_PASSWORD; i++) {
    password[i] = 'a';
  }
  password[SIZE_PASSWORD] = '\0';

  while (1) {
    test_password(argv[1], password);
    increment_password(password);
  }
  return 0;
}

void test_password(const char *p_hash, const char *password) {
  char hash_calculado[SIZE_HASH + 1];

  calculate_hash_password(password, hash_calculado);
  if (!strcmp(p_hash, hash_calculado)) {
    printf("Achou! %s\n", password);
    exit(0);
  }
}

void increment_password(char *password) {
  int i;

  i = SIZE_PASSWORD - 1;
  while (i >= 0) {
    if (password[i] != 'z') {
      password[i]++;
      i = -2;
    } else {
      password[i] = 'a';
      i--;
    }
  }
  if (i == -1) {
    printf("Não achou!\n");
    exit(1);
  }
}


void calculate_hash_password(const char *password, char *hash) {
  struct crypt_data data;
  data.initialized = 0;
  strcpy(hash, crypt_r(password, "aa", &data));
}

Я должен сделать то же самое, что и этот, но используя потоки в C. Как я могу это сделать?

EDIT error

Ответы [ 2 ]

3 голосов
/ 04 ноября 2011

Использование потоков для хеширования паролей не является особенно интуитивным или заведомо полезным подходом, поэтому неясно , почему кто-то захочет это сделать.

Предположительно, расчеты для хеширования разбитыдо некоторой степени: возможно, один поток обрабатывает пароли, начинающиеся с A до M, а другой - N до Z, или какое-то подобное разбиение.Одной из идей будет запускать одну и ту же функцию несколько раз с параметром, который определяет, какой раздел выполнять.Вот простая, работающая программа, которая демонстрирует структуру.

#include <iostream>
#include <pthread.h>    

static void *calc_func (void *arg)
{                               
        int param = (int) arg;
        if (param == 1) 
        {
                // do first partition of calculation
                // ...  
                std::cout << "partition 1" << std::endl;
        }                       
        else            
        {
                // do second partition of calculation
                // ...  
                std::cout << "partition 2" << std::endl;
        }                       
}                               

int main (...)
{                       
        // ...          
        pthread_t threadh[2];

        if (pthread_create (&threadh[0], NULL, calc_func, (void *)1) != 0)
        {               
                std::cerr << "error creating thread 1" << std::endl;
        }                       

        if (pthread_create (&threadh[1], NULL, calc_func, (void *)2) != 0)
        {                               
                std::cerr << "error creating thread 2" << std::endl;
        }               
        // wait for threads to exit
        pthread_join (threadh[0], NULL);
        pthread_join (threadh[1], NULL);
        return 0;       
}

Чтобы собрать ее в Linux с помощью gcc, используйте команду g++ -pthread filename.c++ -o filename

0 голосов
/ 04 ноября 2011

В оболочке Linux выполните:

man pthread_create

Внимательно прочитайте ее и обратите внимание, что это очень наглядный пример того, как использовать потоки.См. Также справочные страницы по функциям в разделе СМОТРИ ТАКЖЕ .

Если вы работаете в Windows, вы можете увидеть декорацию pthreads-win32 здесь

После этого вам нужно решить, какие части вашего кода можно распараллелить, и назначить этот код различным потокам.

...