void enigma2_decrypt(ENIGMA2 *ep,char *buf,int len) { if(!ep||!len) return; enigma(ep->r,buf,len); str_rotor(buf,len,ep->crc%len); rev_enigma(ep->t,buf,len); }
//funkcje: int ZaszyfrujPlaintext(struct EnigmaStruct* data) { do { WczytajLinie(); bufout = (char*) malloc(1024*sizeof(char)); int a =enigma(bufin, bufout, data); ZapiszLinie(); }while(bufin[0] != '\n'); }
/****************************************************************** main - cracks the enigma ciphertext stored in ctext, prints the result. *******************************************************************/ int main(int argc, char *argv[]){ char *ptext = malloc(sizeof(char)*(strlen(ctext)+1)); EnigmaKey *ref; ref = break_enigma(ctext); printf("final key: \n"); printEnigmaKey(ref); enigma(ref,ctext,ptext); printf("decryption: %s\n",ptext); free(ptext); free(ref); }
static int pack_decode(char *string,int length,T_Connect *conn) { switch(conn->CryptFlg & DO_CRYPT) { case 1: enigma(conn->t.t,string,length); break; case 2: enigma_decrypt(conn->t.r,string,length); break; case 3: enigma2_decrypt(&conn->t,string,length); break; default: break; } return 0; }
/****************************************************************** Given a piece of ciphertext 'ctext', return the enigma decryption key - assumes enigma M3 with unchangeable reflector, 3 rotors from 5 to choose from ******************************************************************/ EnigmaKey *break_enigma(char* ctext){ int i,j; char *ptext = malloc(sizeof(char)*(strlen(ctext)+1)); EnigmaKey key; EnigmaKey *bestkey = malloc(sizeof(EnigmaKey)); EnigmaKey store; char ind1,ind2,ind3,set1,set2,set3; float bestscore,score; initEnigmaKey(bestkey); printf("searching for rotors: "); for(i=0;i<60;i++){ for(ind1=0;ind1<26;ind1++){ for(ind2=0;ind2<26;ind2++){ for(ind3=0;ind3<26;ind3++){ key = *bestkey; key.rotors[0] = perms[i][0]-1; key.rotors[1] = perms[i][1]-1; key.rotors[2] = perms[i][2]-1; key.indicator[0] = ind1; key.indicator[1] = ind2; key.indicator[2] = ind3; store = key; enigma(&store,ctext,ptext); score = -scoreTextKP(ptext,otext,strlen(ptext)); base = nbest_add(base,&key,score); } } } printf("."); fflush(stdout); } // we have the optimal indicators and rotors, search for the optimal ringsettings printf("\nsearching ring settings: ."); EnigmaKey *currentkey; NBestList *elem; bestscore = 99e99; for(elem = base; elem != NULL; elem = elem->next){ currentkey = &(elem->key); ind2 = currentkey->indicator[1]; ind3 = currentkey->indicator[2]; for(set2=0; set2<26;set2++){ for(set3=0; set3<26;set3++){ key = *currentkey; key.ringsettings[0] = 0; key.ringsettings[1] = set2; key.ringsettings[2] = set3; key.indicator[1] = (set2+ind2)%26; key.indicator[2] = (set3+ind3)%26; store = key; enigma(&store,ctext,ptext); score = -scoreTextKP(ptext,otext,strlen(ptext)); if(score < bestscore){ bestscore = score; *bestkey = key; } } } } // we have the indicators, rotors and ringsettings. Solve for the plugboard char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char first; char *rest; for(i=0;i<25;i++){ first = alphabet[i]; rest = &alphabet[i+1]; for(j=0;j<25-i;j++){ store = *bestkey; appendToPlugboard(&store,first,rest[j]); enigma(&store,ctext,ptext); score = -scoreTextKP(ptext,otext,strlen(ptext)); if(score < bestscore){ bestscore = score; appendToPlugboard(bestkey,first,rest[j]); } } } printf(".\n"); free(ptext); freeList(base); return bestkey; }
int main(int ac,char *av[]) { char buf[131702]; int len,i,len1; ENIGMA t; ENIGMA2 egm; struct timeval beg,end; enigma_init(t,"abcdefg",0); printf("t1:"); for(i=0;i<256;i++) { if(!(i&7)) putchar('\n'); printf("%3d:%02X\t",i,255&t[0][i]); } printf("\nt3:"); for(i=0;i<256;i++) { if(!(i&7)) putchar('\n'); printf("%3d:%02X\t",i,255&t[2][i]); } putchar('\n'); enigma2_init(&egm,"abcdefg",0); printf("\ncrc=%d\n",egm.crc); // enigma2_init(&egm,"\x01\xff\x35\xf8\xef\x97\x22\x14\x80\x7f\t\b\r\n\377\177\225",17); memset(buf,'B',sizeof(buf)); buf[sizeof(buf)-1]=0; #ifndef TEST_SPEED while(!ferror(stdin)) { fgets(buf,sizeof(buf),stdin); if(feof(stdin)) break; TRIM(buf); #endif len=strlen(buf); gettimeofday(&beg,0); enigma(t,buf,len); gettimeofday(&end,0); len1=len>32?32:len; printf("enigma encode :"); for(i=0;i<len1;i++) printf("%02X ",buf[i]&255); printf("\nenigma encode 64K:"); for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255); printf("\ntimeval=%ld\n",interval(&beg,&end)); enigma(t,buf,len); printf("enigma decode:\n%.100s\n",buf); //test frenz gettimeofday(&beg,0); enigma_encrypt(t,buf,len); gettimeofday(&end,0); printf("\nencrypt :"); for(i=0;i<len1;i++) printf("%02X ",buf[i]&255); printf("\nencrypt 64K:"); for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255); printf("\ntimeval=%ld\n",interval(&beg,&end)); enigma_decrypt(t,buf,len); printf("decrypt :\n%.100s\n",buf); //test enigma2 gettimeofday(&beg,0); enigma2_encrypt(&egm,buf,len); gettimeofday(&end,0); printf("enigma2 encode :"); for(i=0;i<len1;i++) printf("%02X ",buf[i]&255); printf("\nenigma2 encode 64K:"); for(i=0;i<len1;i++) printf("%02X ",buf[i+65536]&255); printf("\ntimeval=%ld\n",interval(&beg,&end)); enigma2_decrypt(&egm,buf,len); printf("enigma2 decode:\n%.100s\n",buf); #ifndef TEST_SPEED } #endif return 0; }