Exemplo n.º 1
0
void VSP_LOOP::SizeEdgeList(int NumberOfEdges)
{

    // Delete any old list
    
    if ( NumberOfEdges_ != 0 ) {
       
       delete [] EdgeList_;
       delete [] EdgeIsUpwind_;
       delete [] EdgeDirection_;
       delete [] EdgeUpwindWeight_;
    
    }
    
    // Allocate space for list
    
    NumberOfEdges_ = NumberOfEdges;

    EdgeList_ = new int[NumberOfEdges_ + 1];    
    EdgeIsUpwind_ = new int[NumberOfEdges_ + 1];
    EdgeDirection_ = new int[NumberOfEdges_ + 1];
    
    EdgeUpwindWeight_ = new double[NumberOfEdges_ + 1];
    
    zero_int_array(EdgeList_, NumberOfEdges_);
    zero_int_array(EdgeIsUpwind_, NumberOfEdges_);
    zero_int_array(EdgeDirection_, NumberOfEdges_);
    
    zero_double_array(EdgeUpwindWeight_, NumberOfEdges_);

}
void break_enigma(	unsigned char initial[2],
			const unsigned char * rotors[6],
			const unsigned char reflector[26],
			unsigned char plain_text[TEXT_LEN],
			unsigned char cipher_text[TEXT_LEN]) {
	
	//List of all the possible connections and whether they are there or not.
	char matrix[26][26];
	//If any of these reach 26 we have a full contradiction and can stop.
	int count[26] = { 0 };
	
	//Have we made progress this run through?
	int  progress = 2;//We need to check both plain and cipher text, decrement on no progress
	char full_contradiction ;


	int i, j, enj;
	unsigned char c, d;
	int fast, mid, slow;

	enigma_s.rotors = rotors;
	enigma_s.reflector = reflector;

	unsigned char* text = plain_text;
	unsigned char* other_text = cipher_text;
	unsigned char* tmp_text;
	#if defined(DEBUG) || defined(VERBOSE)
	printf("Plaintext: ");
	printCharArray(plain_text, TEXT_LEN);
	printf("Ciphertext: ");
	printCharArray(cipher_text, TEXT_LEN);
	printf("Initial: ");
	printCharArray(initial, 2);
	sleep(2u);
	#endif


		
	for(slow=0; slow<26; slow++) {
	for(mid=0;  mid <26; mid ++) {
	for(fast=0; fast<26; fast++) {
		zero_char_array((char*) matrix, 26*26);
		zero_int_array(count, 26);
		#ifdef DEBUG
		printf("Trying position: %d, %d, %d.\n", fast, mid, slow);
		#endif
		
		progress = 2;
		full_contradiction = 0;
		set_tri_matrix(matrix, initial[0], initial[1]);
		count[initial[0]] = 1;
		
		//TODO: Is this necessary?
		if(initial[0] == initial[1]) {count[initial[1]] = 1;}
		
		while(progress && !full_contradiction) {
			progress--;
			for(i=0; i<TEXT_LEN; i++) {
				c = text[i];
				d = other_text[i];
				for(j=0; j<26; j++) {
					if(get_tri_matrix(matrix, c, j)) {
						enj = get_encipherment((fast+i)%26, mid, slow, j);
						if(!get_tri_matrix(matrix, enj, d)) {
							set_tri_matrix(matrix, enj, d);
							progress = 2;
							count[enj] += 1;
							if(enj != d) {count[d] += 1;}
							#ifdef DEBUG
							printf("Encipherment %c -> %c -> %c -> %c gives ", c+65, j+65, enj+65, d+65);
							printf("new link: %c, %c\n", enj+65, d+65);
							printf("Counters for %c, %c are: %d, %d.\n\n", enj+65, d+65, count[enj], count[d]);
							#endif
						}
					}
				}
			}
			for(i=0; i<26; i++) {
				if(count[i] == 26) {
					#ifdef DEBUG
					printf("Full contradiction on %c.\n", i+65);
					#endif
					full_contradiction = 1;
				}
			}
			tmp_text   = other_text;
			other_text = text;
			text 	   = tmp_text;
		}
		if(!full_contradiction) {
			//It would be possible to get a rating on how likely a position is correct
			//by counting the number of 1s/25s that arise.
			printf("Potential position: %d, %d, %d\n", fast, mid, slow);
		}
		#ifdef DEBUG
		printf("Progress: %d\n", progress);
		sleep(3u);
		#endif
	}
	}
	}
}