Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <openssl/sha.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #include "Base64Encode.h"
- #include "Base64Decode.h"
- int nextPassword(int charlistLength, const char* charlist, int passwordLength, int* passwordIndex, char* password)
- {
- if(passwordLength > 1) {
- if(nextPassword(charlistLength, charlist, passwordLength - 1, passwordIndex + 1, password + 1) > 0) {
- return 1;
- }
- }
- (*passwordIndex)++;
- if(*passwordIndex >= charlistLength) {
- *passwordIndex = 0;
- *password = *charlist;
- return 0;
- }
- *password = charlist[*passwordIndex];
- return 1;
- }
- void status(int c, char* password)
- {
- time_t t;
- time(&t);
- struct tm *d = localtime(&t);
- printf("\r%d @ %04d-%02d-%02d %02d:%02d:%02d with ", c, d->tm_year+1900, d->tm_mon+1, d->tm_mday, d->tm_hour, d->tm_min, d->tm_sec);
- putchar('"');
- while(*password) {
- // Simple UTF-16 part -> UTF-8
- if(*password > 0x80 || *password < 0) {
- putchar(0xc3);
- putchar(*password - 0x40);
- } else {
- putchar(*password);
- }
- password++;
- }
- putchar('"');
- putchar('\n');
- }
- int main()
- {
- // start of config
- const int charlistLength = 77;
- char charlist[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.,______!$%#=@";
- charlist[65] = 0xe5; // å in UTF-16 is [0x00, 0xe5], but we only use the lower part.
- charlist[66] = 0xe4; // ä
- charlist[67] = 0xf6; // ö
- charlist[68] = 0xc5; // Å
- charlist[69] = 0xc4; // Ä
- charlist[70] = 0xd6; // Ö
- const int saltLength = 16;
- const char* saltB64 = "PBEN2sa8NDIpdtvhjLYtjQ==";
- const char* goal = "lbU0e7K9mQ54tlh+rZVF8YkCrOX0/d2frkuhBJUUmgtvJG0HEyPQXC+Q/X74HYwNF32gHCUbZmdXNmFwX+Y2yA==";
- int passwordLength = 1;
- int maxPasswordLength = 30;
- int skip = 62900-1;
- // end of config
- setvbuf(stdout, NULL, _IONBF, 0);
- int passwordIndex[maxPasswordLength];
- char password[maxPasswordLength + 1];
- int c = 0;
- for(;passwordLength <= maxPasswordLength; passwordLength++) {
- for(int i = 0; i < passwordLength; i++) {
- passwordIndex[i] = 0;
- password[i] = charlist[0];
- }
- passwordIndex[passwordLength - 1] = -1;
- password[passwordLength] = 0;
- char* salt;
- Base64Decode(saltB64, &salt);
- unsigned char initData[saltLength + passwordLength*2 + 1];
- unsigned char* data = initData;
- unsigned char* passwordStart = initData + saltLength;
- memcpy(initData, salt, saltLength);
- while(nextPassword(charlistLength, charlist, passwordLength, passwordIndex, password))
- {
- if(skip >= 0) {
- if(skip-- > 0) {
- c++;
- continue;
- }
- status(c + 1, password);
- }
- for(int i = 0; i < passwordLength; i++) {
- passwordStart[i*2] = password[i];
- passwordStart[i*2 + 1] = 0;
- }
- data = initData;
- unsigned char hashData1[SHA512_DIGEST_LENGTH + 4];
- unsigned char hashData2[SHA512_DIGEST_LENGTH + 4];
- unsigned char* hash = hashData1;
- unsigned char* loopIndex;// = data + SHA512_DIGEST_LENGTH;
- SHA512(data, saltLength + passwordLength*2, hash);
- for(int i = 0; i < 100000; i++) {
- if(i & 1) {
- hash = hashData1;
- data = hashData2;
- } else {
- hash = hashData2;
- data = hashData1;
- }
- loopIndex = data + SHA512_DIGEST_LENGTH;
- loopIndex[0] = (i >> 0) & 0xff;
- loopIndex[1] = (i >> 8) & 0xff;
- loopIndex[2] = (i >> 16) & 0xff;
- loopIndex[3] = (i >> 24) & 0xff;
- SHA512(data, SHA512_DIGEST_LENGTH + 4, hash);
- }
- const char* hash2 = (const char*) hash;
- char* b64;
- Base64Encode(hash2, &b64, SHA512_DIGEST_LENGTH);
- putchar('.');
- if(++c % 100 == 0) {
- status(c, password);
- }
- if(strcmp(b64, goal) == 0) {
- printf("\n%d @ '%s' => '%s'\n", c, password, b64);
- return 0;
- }
- }
- }
- return 1;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement