diff --git a/crack.c b/crack.c new file mode 100644 index 0000000000000000000000000000000000000000..0a6ed30b40c2e4e1fc64e2ab72c5cfe7b2bf55e9 --- /dev/null +++ b/crack.c @@ -0,0 +1,342 @@ +#include<stdio.h> +#include<math.h> +#include "sha256.c" +//check if a char[] matches any hash in an hash array +int trymatch(unsigned char guess[],unsigned char pwdhash[],int n) +{ + SHA256_CTX ctx; + unsigned char buf[32]; + int same=0; + sha256_init(&ctx); + sha256_update(&ctx, guess, strlen(guess)); + sha256_final(&ctx, buf); + for(int k=0;k<n;k++) + { + same=1; + for(int l=0;l<=31;l++) + { + if(buf[l]!=pwdhash[k*32+l]) + { + same=0; + break; + } + } + if(same==1) + { + printf("%s %d\n",guess,k+1); + break; + } + } + return same; +} + +int main(int argc, char * argv[]) +{ + /*after doing some research, letters and numbers are two things people like best when thinking about a password.after googling and the analysis of common_passwords.txt, + I finally generate a possibilty order of every letter appearing in common words, as shown below.the order combiles the possibility of appearance of a letter and its properties(e.g.,'e','a','o','i','u' are vewels, so I put them on the first 5 levels)*/ + + unsigned char posgeneral[]={"eaoiutnhsrdlcmwyfgpbvkjxzq"}; + unsigned char posfirstletter[]={"taswihobmfcpdlngreyujkvqxz"}; +if(argc==1) +{ + unsigned char pwdhash[999]; + FILE *fp= fopen("pwd4sha256","r"); + if(fp==NULL) + { + printf("epmty file"); + return 1; + } + int c; + int index=0; + while((c = fgetc(fp)) != EOF) + { + pwdhash[index++]=c; + } + unsigned char guess[7]="zhim"; + int findnum=0; + for(int i=0;i<pow(10,4);i++) + { + guess[0]=(i/1000)%10+48; + guess[1]=(i/100)%10+48; + guess[2]=(i/10)%10+48; + guess[3]=i%10+48; + findnum+=trymatch(guess,pwdhash,10); + } + for(int i=0;i<pow(26,4);i++) + { + guess[0]=posfirstletter[i%26]; + guess[1]=posgeneral[(i/26)%26]; + guess[2]=posgeneral[(int)(i/pow(26,2))%26]; + guess[3]=posgeneral[(int)(i/pow(26,3))%26]; + findnum+=trymatch(guess,pwdhash,10); + } + for(int i=0;i<4;i++) + { + for(int j=0;j<10*pow(26,3);j++) + { + guess[i]=j%10+48; + guess[(i+1)%4]=posgeneral[(j/10)%26]; + guess[(i+2)%4]=posgeneral[(j/10/26)%26]; + guess[(i+3)%4]=posgeneral[(int)(j/10/pow(26,2))%26]; + findnum+=trymatch(guess,pwdhash,10); + } + for(int j=0;j<26*pow(10,3);j++) + { + guess[i]=posgeneral[j%26]; + guess[(i+1)%4]=(j/26)%10+48; + guess[(i+2)%4]=(j/26/10)%10+48; + guess[(i+3)%4]=(j/26/100)%10+48; + findnum+=trymatch(guess,pwdhash,10); + } + } + for(int i=0;i<4;i++) + { + for(int j=0;j<pow(10,2)*pow(26,2);j++) + { + guess[i]=j%10+48; + guess[(i+1)%4]=(j/10)%10+48; + guess[(i+2)%4]=posgeneral[(j/10/26)%26]; + guess[(i+3)%4]=posgeneral[(j/10/26/26)%26]; + findnum+=trymatch(guess,pwdhash,10); + } + } + for(int i=0;i<2;i++) + { + for(int j=0;j<pow(10,2)*pow(26,2);j++) + { + guess[i]=j%10+48; + guess[(i+2)%4]=(j/10)%10+48; + guess[(i+1)%4]=posgeneral[(j/10/26)%26]; + guess[(i+3)%4]=posgeneral[(j/10/26/26)%26]; + findnum+=trymatch(guess,pwdhash,10); + } + } + + fp= fopen("pwd6sha256","r"); + if(fp==NULL) + { + printf("epmty file"); + return 1; + } + while((c = fgetc(fp)) != EOF) + { + pwdhash[index++]=c; + } + findnum=0; + + for(int i=0;i<pow(26,6);i++) + { + guess[0]=posfirstletter[i%26]; + guess[1]=posgeneral[(i/26)%26]; + guess[2]=posgeneral[(int)(i/pow(26,2))%26]; + guess[3]=posgeneral[(int)(i/pow(26,3))%26]; + guess[4]=posgeneral[(int)(i/pow(26,4))%26]; + guess[5]=posgeneral[(int)(i/pow(26,5))%26]; + findnum+=trymatch(guess,pwdhash,30); + } + for(int i=0;i<pow(10,6);i++) + { + guess[0]=(int)(i/pow(10,6))%10+48; + guess[1]=(int)(i/pow(10,5))%10+48; + guess[2]=(int)(i/pow(10,4))%10+48; + guess[3]=(int)(i/pow(10,3))%10+48; + guess[4]=(int)(i/pow(10,2))%10+48; + guess[5]=(i/10)%10+48; + findnum+=trymatch(guess,pwdhash,30); + } + + for(int i=0;i<6;i++) + { + for(int j=0;j<10*pow(26,5);j++) + { + guess[i]=j%10+48; + guess[(i+1)%6]=posgeneral[(j/10)%26]; + guess[(i+2)%6]=posgeneral[(j/10/26)%26]; + guess[(i+3)%6]=posgeneral[(int)(j/10/pow(26,2))%26]; + guess[(i+4)%6]=posgeneral[(int)(j/10/pow(26,3))%26]; + guess[(i+5)%6]=posgeneral[(int)(j/10/pow(26,4))%26]; + findnum+=trymatch(guess,pwdhash,30); + } + for(int j=0;j<26*pow(10,5);j++) + { + guess[i]=posgeneral[j%26]; + guess[(i+1)%6]=(j/26)%10+48; + guess[(i+2)%6]=(j/26/10)%10+48; + guess[(i+3)%6]=(j/26/100)%10+48; + guess[(i+3)%6]=(j/26/1000)%10+48; + guess[(i+3)%6]=(j/26/10000)%10+48; + findnum+=trymatch(guess,pwdhash,30); + } + } + for(int i=0;i<6;i++) + { + for(int j=0;j<pow(10,2)*pow(26,4);j++) + { + guess[i]=j%10+48; + guess[(i+1)%6]=(j/10)%10+48; + guess[(i+2)%6]=posgeneral[(j/10/26)%26]; + guess[(i+3)%6]=posgeneral[(j/10/26/26)%26]; + guess[(i+4)%6]=posgeneral[(j/10/26/26/26)%26]; + guess[(i+5)%6]=posgeneral[(j/10/26/26/26/26)%26]; + findnum+=trymatch(guess,pwdhash,30); + } + } + for(int i=0;i<6;i++) + { + for(int j=0;j<pow(10,2)*pow(26,4);j++) + { + guess[i]=j%10+48; + guess[(i+2)%4]=(j/10)%10+48; + guess[(i+1)%4]=posgeneral[(j/10/26)%26]; + guess[(i+3)%4]=posgeneral[(j/10/26/26)%26]; + guess[(i+4)%4]=posgeneral[(j/10/26/26/26)%26]; + guess[(i+5)%4]=posgeneral[(j/10/26/26/26/26)%26]; + findnum+=trymatch(guess,pwdhash,30); + } + } + + + + + return 0; + } + else if(argc==2) + { + unsigned char guess[7]; + int guessnum; + sscanf(argv[1],"%d",&guessnum); + for(int i=0;i<pow(26,6);i++) + { + guess[0]=posfirstletter[i%26]; + guess[1]=posgeneral[(i/26)%26]; + guess[2]=posgeneral[(int)(i/pow(26,2))%26]; + guess[3]=posgeneral[(int)(i/pow(26,3))%26]; + guess[4]=posgeneral[(int)(i/pow(26,4))%26]; + guess[5]=posgeneral[(int)(i/pow(26,5))%26]; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + for(int i=0;i<pow(10,6);i++) + { + guess[0]=(int)(i/pow(10,6))%10+48; + guess[1]=(int)(i/pow(10,5))%10+48; + guess[2]=(int)(i/pow(10,4))%10+48; + guess[3]=(int)(i/pow(10,3))%10+48; + guess[4]=(int)(i/pow(10,2))%10+48; + guess[5]=(i/10)%10+48; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + + for(int i=0;i<6;i++) + { + for(int j=0;j<10*pow(26,5);j++) + { + guess[i]=j%10+48; + guess[(i+1)%6]=posgeneral[(j/10)%26]; + guess[(i+2)%6]=posgeneral[(j/10/26)%26]; + guess[(i+3)%6]=posgeneral[(int)(j/10/pow(26,2))%26]; + guess[(i+4)%6]=posgeneral[(int)(j/10/pow(26,3))%26]; + guess[(i+5)%6]=posgeneral[(int)(j/10/pow(26,4))%26]; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + for(int j=0;j<26*pow(10,5);j++) + { + guess[i]=posgeneral[j%26]; + guess[(i+1)%6]=(j/26)%10+48; + guess[(i+2)%6]=(j/26/10)%10+48; + guess[(i+3)%6]=(j/26/100)%10+48; + guess[(i+3)%6]=(j/26/1000)%10+48; + guess[(i+3)%6]=(j/26/10000)%10+48; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + } + for(int i=0;i<6;i++) + { + for(int j=0;j<pow(10,2)*pow(26,4);j++) + { + guess[i]=j%10+48; + guess[(i+1)%6]=(j/10)%10+48; + guess[(i+2)%6]=posgeneral[(j/10/26)%26]; + guess[(i+3)%6]=posgeneral[(j/10/26/26)%26]; + guess[(i+4)%6]=posgeneral[(j/10/26/26/26)%26]; + guess[(i+5)%6]=posgeneral[(j/10/26/26/26/26)%26]; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + } + for(int i=0;i<6;i++) + { + for(int j=0;j<pow(10,2)*pow(26,4);j++) + { + guess[i]=j%10+48; + guess[(i+2)%4]=(j/10)%10+48; + guess[(i+1)%4]=posgeneral[(j/10/26)%26]; + guess[(i+3)%4]=posgeneral[(j/10/26/26)%26]; + guess[(i+4)%4]=posgeneral[(j/10/26/26/26)%26]; + guess[(i+5)%4]=posgeneral[(j/10/26/26/26/26)%26]; + guessnum--; + printf("%s\n",guess); + if(guessnum==0) + return 0; + } + } + for(int i=0;i<95;i++) + for(int i2=0;i2<95;i2++) + for(int i3=0;i3<95;i3++) + for(int i4=0;i4<95;i4++) + for(int i5=0;i5<95;i5++) + for(int i6=0;i6<95;i6++) + { + guess[0]=i+32; + guess[1]=i2+32; + guess[2]=i3+32; + guess[3]=i4+32; + guess[5]=i5+32; + guess[6]=i6+32; + } + } + else if(argc==3) + { + unsigned char pwdhash[50000]; + FILE *fp= fopen(argv[2],"r"); + if(fp==NULL) + { + printf("epmty file"); + return 1; + } + int c; + int index=0; + while((c = fgetc(fp)) != EOF) + { + pwdhash[index++]=c; + } + int hashnum=index/32; + + + fp= fopen(argv[1],"r"); + unsigned char test[10001]; + while(fgets(test,10000,fp)!=NULL) + { + if(test[strlen(test)-1]=='\n') + test[strlen(test)-1]='\0'; + trymatch(test,pwdhash,hashnum); + } + + return 0; + } + else + printf("invalid command"); +} \ No newline at end of file