나는 운동을하고있다. 목표는 DES 암호화 된 암호를 해독하기 위해 C로 프로그램을 만드는 것입니다. 지금 다음 실행 흐름이 있습니다.pthread bus error
- 로드 사전.
- 사전 검색.
- 처음 4 문자의 무차별 강제 검색.
- 사전 검색에는 무차별 대항 공격 ( 개 조합 검색)이 결합되었습니다. 7-6 자의 사전 단어 만.
- 처음 5 자의 무차별 강제 검색.
- 사전 검색에는 무차별 대항 공격 ( 개 조합 검색)이 결합되었습니다. 5 ~ 4 자의 사전 단어 만
- 최대 8 자의 무차별 강제 검색.
이 프로그램은 잘 작동하지만 나는 여러에게 스레드를 사용하여을 향상시키고 자 : 1 실 - 주요 2 스레드 - 무력 검색 3 스레드를 결합 사전 및 사전 - 무력 검색
을기본 사전 검색 스레드 기능을 사용하여 시작했지만 사전 오류 메시지에서 단어 을 읽어야하는 버스 오류 (Mac OS X)로 실패합니다.
#include <pthread.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#define _XOPEN_SOURCE
#define MAXLINE 40
#define MAXPASS 9
/* dictionary search thread function */
void * dictionary(void * argv)
{
/* initializing SALT */
char salt[3]; // defining salt (length is always 2 chars + "\0")
strncpy(salt, argv, 2); // copying the first 2 characters from encrypted password to salt
salt[2] = '\0'; // placing null character to make salt a string
/* defining and initializing password */
char password[14];
strcpy(password, argv);
/* defining candidate */
char candidate[MAXPASS];
/* opening file */
FILE *fp;
if ((fp = fopen("/usr/share/dict/words", "r")) == NULL)
{
printf("Error: Can not open file.\n");
return (void *) -1;
}
printf("Open file: Ok\n");
char line[MAXLINE];
printf("Counting words: ");
/* counting words the file contains */
int ctr = 0; // words counter variable
int len; // store length of the current line
while (fgets(line, MAXLINE, fp) != NULL && line[0] != '\n')
{
if ((len = strlen(line)) <= MAXPASS && len >= 4)
ctr++; // will be real+1 when the loop ends
}
ctr--; // adjusting to real words count
rewind(fp); // go back to the beginning of file
printf("%d words\n", ctr);
/* create an array of strings and fill it with the words from the dictionary */
printf("Creating array for file contents: ");
char words[ctr][MAXPASS];
int i = 0; // loop counter variable
printf("Ok\n");
/************************************* BUS ERROR *********************************************/
printf("Reading file contents: ");
while (fgets(line, MAXLINE, fp) != NULL && line[0] != '\n')
{
if ((len = strlen(line)) <= MAXPASS && len >= 4)
{
line[len-1] = '\0';
strcpy(words[i], line);
printf("%d: %s\n", i, words[i]);
i++;
}
}
printf("Ok\n");
printf("Loaded %d words...\n", ctr);
/* closing file */
printf("Close file: ");
if (fclose(fp) != 0)
{
fprintf(stderr, "Error: Can not close file\n");
return (void *) -2;
}
printf("Ok\n");
/* starting search dictionary search */
printf("Starting Dictionary Search...\n");
int match = 0;
char * encrypted;
int n;
for (i = 0; i <= ctr && !match; i++)
{
encrypted = crypt(words[i], salt);
if ((strcmp(encrypted, password)) == 0) // if candidate == password
{
match = 1;
strcpy(candidate, words[i]);
printf("Password: %s\n", candidate);
return (void *) 1;
}
}
return (void *) 0;
}
int main(int argc, char * argv[])
{
/* if there are less/more than 1 argument, notify the user and exit with an error code 1 */
if (argc != 2) // first argument is always the name of the program
{
printf("Error 1: Wrong number of arguments\n");
return 1;
}
/* if the length of the argument is less/more than 13 characters, notify the user and exit with an error code 2 */
int length = strlen(argv[1]);
if (length != 13)
{
printf("Error 2: The length of an encrypted password should be 13 characters\n");
return 2;
}
pthread_t dct; // dictionary thread identifier
void *status; // thread return value
/* creating dictionary thread */
pthread_create(&dct,NULL,dictionary,argv[1]);
printf("Waiting for thread to terminate...\n");
pthread_join(dct,&status);
//printf("Return Value: %d\n",(int)status);
return 0;
}
다른 웹 사이트가 아닌 여기에 코드를 붙여 넣으십시오. http://stackoverflow.com/은 고품질 질문과 답변을 저장하는 곳입니다. 코드 호스트가 문을 닫거나 이전 게시물이 만료되면 어떻게됩니까? 이것은 미래에 다른 사람들에게 도움이되지 않으며 (더) 쓸모 없게 될 것입니다. 감사! – sarnold
훨씬 좋았어, 고마워 .Cody. – sarnold
pastebin에 코드를 게시 해 주셔서 죄송 합니다만, stackoverflow를 처음 사용하고 코드 서식을 지정하는 데 어려움이 있습니다 ... – user903673