我是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中使用线程。 我怎么能这样做?
修改
答案 0 :(得分:3)
使用线程来散列密码并不是一种特别直观或明显有用的方法,因此不清楚为什么任何人都希望这样做。
大概是哈希的计算以某种方式分解:也许一个线程处理以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;
}
要使用gcc在Linux上构建它,请使用命令g++ -pthread filename.c++ -o filename
答案 1 :(得分:0)
在Linux shell上执行:
man pthread_create
请仔细阅读,并注意提供有关如何使用线程的非常具有描述性的示例。另请参阅另请参见部分中的函数手册页。
如果你在Windows上,你可以看到pthreads-win32 here
的装饰之后,您必须确定代码的哪些部分可以并行化,并将该代码分配给不同的线程。