Esempio n. 1
0
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);
}
Esempio n. 2
0
//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');
}
Esempio n. 3
0
/******************************************************************
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);
}
Esempio n. 4
0
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;
}
Esempio n. 5
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;
}
Esempio n. 6
0
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;
}