Example #1
0
int
solve_query(int32_t *s, int32_t *sa, int32_t *q, int d, int m, int k,
    int32_pair_t *rv)
{
    int j, ltk, nv;

    int *filter = malloc(sizeof(int)*d);
    memset(filter, 0xff, sizeof(int)*d);

    ltk = nv = 0;
    for (int ik = 0; ik < m+1 - m/k; ik += m/k) {
        int r = sa_search_low(sa, s, d*(m+1), q + ik, m/k);
        int t = sa_search_high(sa, s, d*(m+1), q + ik, m/k);
        for(; r < t && nv < d; r++) {
            j = sa[r]/(m+1);
            if (sa[r]%(m+1) == ik && filter[j] != 1) {
                filter[j] = 1;
                nv ++;
                int x = hamming_distance(q, s + j*(m+1), m, k, ik);
                if (x < k) {
                    rv[ltk].id = j;
                    rv[ltk].n = x;
                    ltk++;
                }
            }
        }
    }
    free(filter);
    fprintf(stderr, "#hits: %d (%d)\n", ltk, nv);
    return ltk;
}
Example #2
0
double norm_hamming_distance(const unsigned char *in, unsigned int in_length, unsigned int key_length)
{
	unsigned int num_blocks;
	unsigned int hamming = 0;
	double hamming_norm = 0;
	unsigned int i, j, k;
	unsigned char tmp1[key_length];
	unsigned char tmp2[key_length];

	num_blocks = in_length / key_length;

	j = 0;
	for(k=0; k<num_blocks; k++) {
		for(i=0; i<key_length; i++) {
			tmp1[i] = in[i+k*key_length];
			tmp2[i] = in[(i+k*key_length+key_length)%in_length];
		}

		hamming += hamming_distance(tmp1, tmp2, key_length);
	}

	hamming_norm = (double) hamming / (double) num_blocks / (double) key_length;
// 	printf("num_blocks = %d, key_len = %d, hamming = %d, hamming_norm = %f\n", num_blocks, key_length, hamming, hamming_norm);

	return hamming_norm;
}
static unsigned int get_key_len(const unsigned char *buf, size_t len,
		size_t key_max_len)
{
	unsigned int key_len, best_key_len = 0;
	unsigned int nblocks, block1, block2;
	unsigned int hamming;
	float score, best_score = GET_KEY_LEN_NOSCORE;

	for (key_len = 2; key_len < key_max_len; key_len++) {
		hamming = 0;
		nblocks = len / key_len;
		if (nblocks < GET_LEY_LEN_MINBLOCKS)
			break;
		for (block1 = 0; block1 < nblocks; block1++)
			for (block2 = block1 + 1; block2 < nblocks; block2++)
				hamming += hamming_distance(
					&buf[key_len * block1],
					&buf[key_len * block2],
					key_len
				);
		score = (float)hamming /
				(key_len * (nblocks * (nblocks - 1) / 2));
		if (score < best_score || best_score == GET_KEY_LEN_NOSCORE) {
			best_score = score;
			best_key_len = key_len;
		}
	}
	return best_key_len;
}
void
build_table()
{
  int i;
  int j;

  for (i=0; i < TABLE_SIZE; ++i)
    for (j=0; j < TABLE_SIZE; ++j)
      HAM_TABLE[i][j] = hamming_distance(i, j);
}
Example #5
0
long hamming_test()
{
	char *word1 = "this is a test";
	char *word2 = "wokka wokka!!!";
	long result = hamming_distance(word1, word2, 14);
	if(result == 37)
		printf("Hamming Test successful");
	else
		printf("Hamming Test unsuccessful");
	printf(" with %ld\n", result);
} 
Example #6
0
void pdist_hamming(const double *X, double *dm, int m, int n) {
  int i, j;
  const double *u, *v;
  double *it = dm;
  for (i = 0; i < m; i++) {
    for (j = i + 1; j < m; j++, it++) {
      u = X + (n * i);
      v = X + (n * j);
      *it = hamming_distance(u, v, n);
    }
  }
}
Example #7
0
void cdist_hamming(const double *XA,
		   const double *XB, double *dm, int mA, int mB, int n) {
  int i, j;
  const double *u, *v;
  double *it = dm;
  for (i = 0; i < mA; i++) {
    for (j = 0; j < mB; j++, it++) {
      u = XA + (n * i);
      v = XB + (n * j);
      *it = hamming_distance(u, v, n);
    }
  }
}
Example #8
0
int test_hamming_distance(int argc, char *argv[])
{
    if (argc != 3){
        std::cout << "Usage: ch6 <str1> <str2>" << std::endl;
        return -1;
    }
    string str1 {argv[1]};
    string str2 {argv[2]};

    std::cout << hamming_distance(str1, str2) << std::endl;

    return 0;
}
int main() {
  char str1[MAX_DNA];
  char str2[MAX_DNA];
  FILE *fp = fopen("rosalind_point_mutations.txt", "r");

  fgets(str1, MAX_DNA, fp);
  fgets(str2, MAX_DNA, fp);

  printf("The hamming distance is:\n");
  printf("%d\n", hamming_distance(str1, str2));

  return 0;
}
Example #10
0
static PyObject * jellyfish_hamming_distance(PyObject *self, PyObject *args)
{
    const char *s1, *s2;
    unsigned result;

    if (!PyArg_ParseTuple(args, "ss", &s1, &s2)) {
        return NULL;
    }

    result = hamming_distance(s1, s2);

    return Py_BuildValue("I", result);
}
Example #11
0
/**
 * delete_search
 *
 * Terminate the current search and free all the memory involved.
 */
void Wordrec::delete_search(SEARCH_RECORD *the_search) {
  float closeness;

  closeness = (the_search->num_joints ?
    (hamming_distance(reinterpret_cast<uinT32*>(the_search->first_state),
                      reinterpret_cast<uinT32*>(the_search->best_state), 2) /
      (float) the_search->num_joints) : 0.0f);

  free_state (the_search->first_state);
  free_state (the_search->best_state);

  free_hash_table(the_search->closed_states);
  FreeHeapData (the_search->open_states, (void_dest) free_state);

  memfree(the_search);
}
Example #12
0
int main () {
	ulong *f1;
	ulong *f2;
	ulong i, j, m; /* M is the number of variables in the boolean function */
	printf ("Enter the number of variables in your boolean function: ");
	scanf ("%lu", &m);
	f1 = allocate_table (m);
	f2 = allocate_table (m);
	ulong n = 1UL << m;
	for ( j = 0; j < 2; j++ ) {
		for ( i = 0; i < n; i++ ) {
			printf ("Enter the [%lu] boolean value of [%lu] boolean table: ", i, j);
			if ( j == 0) {
				scanf ("%lu", &f1[i]);
				if ( f1[i] != 0 && f1[i] != 1 ) {
					printf ("Program accepts only boolean values[0/1]\n");
					i = i - 1;
				}
			}
			else {
				scanf ("%lu", &f2[i]);
				if ( f2[i] != 0 && f2[i] != 1 ) {
					printf ("Program accepts only boolean values[0/1]\n");
					i = i - 1;
				}
			}
		}
	}
	printf ("\nTruth Table\n");
	printf ("f1\tf2\n");
	for ( i = 0; i < n; i++ ) {
		for ( j = 0; j < 2; j++ ) {
			if ( j == 0 )
				printf ("%lu\t", f1[i]);
			else 
				printf ("%lu\n", f2[i]);
		}
	}
	printf ("\nThe hamming distance of the two tables is %lu\n", hamming_distance(f1, f2, m));	
	free(f1);
	free(f2);
	return 0;
}
Example #13
0
/*
 * Find the most likely key size for some repeated key xor'd cipher text up
 * to a certain maximum key size. Based on the hamming distance between blocks.
 * See http://crypto.stackexchange.com/a/8118 for why that is.
 * @param cipher_text pointer to cipher text
 * @param len length of cipher text
 *        precondition: length of cipher text >= len
 *        currently, also require that len >= 6 * max_key_size because that's
 *        how many blocks it's taking to get accurate results
 * @param max_key_size largest key size to check
 * @return most likely key size for the given cipher text
 */
static uint8_t find_likely_key_size(const uint8_t *cipher_text, size_t len,
        size_t max_key_size)
{
    if (!cipher_text)
        return 0;
    assert(len >= 6 * max_key_size);    // TODO - handle this
    size_t likely_key_size = 0;
    uint32_t min_hamming = UINT32_MAX;
    for (size_t key_size = 1; key_size <= max_key_size; ++key_size) {
        uint32_t hamming = 0;
        // Take 6 block's worth - that was the smallest size that worked...
        for (size_t i = 0; i < 6; i++) {
            hamming += hamming_distance(cipher_text + 2 * i * key_size,
                    cipher_text + (2 * i + 1) * key_size, key_size);
        }
        hamming = hamming * 100 / key_size; // 100 is just a rounding factor
        if (hamming < min_hamming) {
            min_hamming = hamming;
            likely_key_size = key_size;
        }
    }
    return likely_key_size;
}
Example #14
0
File: 6.c Project: sfelton/matasano
int main(int argc, char* argv[]){
    printf("~~~~~~~~BREAK REPEATING KEY XOR~~~~~~~~\n");

    //Read in file to memory
    char* file_b64;
    FILE* fp;
    int file_length = 0;
    fp = fopen(encrypted_file, "r");
    if (fp == NULL){
        printf("ERROR: Cannot open encrypted file, %s\n", encrypted_file);
        return 1;
    }

    char* line;
    ssize_t read;
    size_t len;
    //Get length of file
    while ((read = getline(&line, &len, fp)) != -1){
        //Remove trailing newline
        line = strsep(&line, "\n");
        file_length += strlen(line);
    }
    fseek(fp, 0, SEEK_SET);
    file_b64 = malloc(file_length);
    while ((read = getline(&line, &len, fp)) != -1){
        //Remove trailing newline
        line = strsep(&line, "\n");
        strcat(file_b64, line);
    }
    
    /*
    fseek(fp, 0, SEEK_END);
    file_length = ftell(fp);
    fseek(fp, 0, SEEK_SET);

    file_b64 = malloc(file_length);
    fread(file_b64, 1, file_length, fp);
    */

    fclose(fp);
    
    //Decode base64 into memory
    unsigned char* data;
    decode_base64(&data, file_b64);


    //Find the key size
    unsigned int KEYSIZE = 0;
    int hd;
    float normalized;
    float lowest = FLT_MAX;
    for (unsigned int key_size = 2; key_size <= 40; ++key_size){
        //Hamming Distance of every combination of 1st 4 blocks of key_size
        hd  = hamming_distance(data, data+(key_size), key_size);
        hd += hamming_distance(data, data+(2*key_size), key_size);
        hd += hamming_distance(data, data+(3*key_size), key_size);
        
        hd += hamming_distance(data+key_size, data+(2*key_size), key_size);
        hd += hamming_distance(data+key_size, data+(3*key_size), key_size);
        
        hd += hamming_distance(data+(2*key_size), data+(3*key_size), key_size);
        
        normalized = (float)hd/key_size;
        if (normalized < lowest) {
            lowest = normalized;
            KEYSIZE = key_size;
        }
//        printf("DEBUG: key size %d - hd %f\n", key_size, normalized);
    }

    if (KEYSIZE == 0) {
        printf("ERROR: Could not find a keysize\n");
        return 1;
    }
    
    printf("KEYSIZE = %d\n", KEYSIZE);

    //Allocate space for a key
    unsigned char* key = malloc(KEYSIZE);

    //Break each byte of the key individually
    for (unsigned int i = 0; i < KEYSIZE; ++i){
        //Create block of every ith KEYSIZE block
        size_t tb_size = get_base64_decoded_length(file_b64)/KEYSIZE;
        tb_size++;
//        if (i < get_base64_decoded_length(file_b64)%KEYSIZE) tb_size++;

        unsigned char* transposed_block = malloc(tb_size);
        unsigned int file_index = i;
        for (unsigned int j = 0; j < tb_size; ++j){
            memcpy(transposed_block+j,data+file_index,1);
            file_index += KEYSIZE;
        }

        //Find single byte key for transposed block
        float lowest_score = 0;
        float second_lowest_score = 0;
        unsigned int lowest_score_key = 256;
        unsigned int second_lowest_score_key = 256;
        unsigned char* result = malloc(tb_size);
        for (unsigned int k = 0; k < 256; ++k){
            repeated_xor( result, 
                          transposed_block, tb_size, 
                          (unsigned char *)&k, 1);
            float score = score_letter_frequency_adams_way((char *)result, tb_size);
            if (score != 0 && score > lowest_score){
                second_lowest_score = lowest_score;
                second_lowest_score_key = lowest_score_key;
                lowest_score = score;
                lowest_score_key = k;
            }
        }
        memcpy(key+i,&lowest_score_key,1);
        printf("INDEX %2d: %3d (%c)\n", i, lowest_score_key, lowest_score_key);
//        printf("LOWEST: %c - %f  SECOND LOWEST: %c - %f\n",
//                lowest_score_key, lowest_score,
//                second_lowest_score_key, second_lowest_score);



        free(result);
        free(transposed_block);
    }
    printf("%s\n", key);

    //Decrypt data
    unsigned char* decrypted_data = malloc(get_base64_decoded_length(file_b64));
    repeated_xor( decrypted_data,
                  data, get_base64_decoded_length(file_b64),
                  key, KEYSIZE);
    
    printf("%s\n", decrypted_data);

    free(key);

    free(data);
    free(file_b64);
    return 0;
}
Example #15
0
bool
improve_AML_star(std::string &a, 
                 std::string &b, 
                 std::string &c,
                 std::string &center,
                 sequence_model model){

  if ( model != JC && model != P_DISTANCE )
    PROG_ERROR("not supported");

  
  double slen = 1.0*a.length();


  double hamdist;
  
  //----------------
  //current likelihood
  double currL = 0.0;
  
  //likelihood for a-center
  hamdist = hamming_distance(a,center);
  currL += compute_JC_log_likelihood_max05(hamdist,slen);

  //likelihood for b-center
  hamdist = hamming_distance(b,center);
  currL += compute_JC_log_likelihood_max05(hamdist,slen);
  
  //likelihood for c-center
  hamdist = hamming_distance(c,center);
  currL += compute_JC_log_likelihood_max05(hamdist,slen);
  
  //-----------------
  //a likelihoood
  double aL = 0.0;
  double bL = 0.0;
  double cL = 0.0;
  double tmp;
  
  //a-b
  hamdist = hamming_distance(a,b);
  tmp = compute_JC_log_likelihood_max05(hamdist,slen);
  aL += tmp;  
  bL += tmp;
  
  //a-c
  hamdist = hamming_distance(a,c);
  tmp = compute_JC_log_likelihood_max05(hamdist,slen);
  aL+=tmp;  
  cL+=tmp;
  
  //b-c
  hamdist = hamming_distance(b,c);
  tmp = compute_JC_log_likelihood_max05(hamdist,slen);
  cL += tmp;
  bL += tmp;


  //--------------
  //parsimony
  double parsimonyL=find_most_likely_parsimonious(a,b,c,center);
  
  
  // PRINT(currL);PRINT(aL);PRINT(bL);PRINT(cL);PRINT(parsimonyL);
  //---------------
  //find maximum
  double max_l = parsimonyL;
  std::string *maxstr = &center;
  if ( aL > max_l ){
    maxstr = &a;
    max_l = aL;
  }
  if ( bL > max_l ){
    maxstr = &b;
    max_l = bL;
  }
  if ( cL > max_l ){
    maxstr = &c;
    max_l = cL;
  }

  //if parsimony not min copy the correct one
  if ( maxstr != &center ){
    center.clear();
    center.append(*maxstr);
  }

  if ( max_l - currL > 0.00001 ){
    //PRINT(currL - max_l);PRINT(currL -aL);
    return true;
  }

  return false;
}
void
FoldingEngine<SEQ>::
stochastic_fold(const std::string& name, const SEQ& seq, uint num_samples, 
                const std::vector<float>& gamma, uint max_clusters, std::ostream& out, 
                const std::string& p_outname, float th)
{
  std::vector<BPvecPtr> bpv;
  stochastic_fold(seq, num_samples, bpv);
  
  if (max_clusters>=2)
  {
    // calculate the distance matrix
    typedef boost::multi_array<double, 2> DMatrix;
    DMatrix dmatrix(boost::extents[bpv.size()][bpv.size()]);
    for (uint i=0; i!=bpv.size(); ++i)
      for (uint j=i; j!=bpv.size(); ++j)
        dmatrix[i][j]=dmatrix[j][i]=hamming_distance(*bpv[i], *bpv[j]);

    // hierarchical clustering by DIANA
    HCLUST::Diana<DMatrix> diana(dmatrix);
    diana.build(max_clusters);
    uint opt_n = diana.optimal_size();
    std::vector<uint> res;
    std::vector<uint> num;
    diana.get_clusters(opt_n, res, num);

    // sort by size of clusters
    std::vector<uint> s(num.size(), 0);
    std::vector<uint> idx(num.size());
    for (uint i=0; i!=num.size(); ++i)
    {
      idx[i]=i;
      if (i!=0) s[i]=s[i-1]+num[i-1];
    }
    std::sort(idx.begin(), idx.end(), cmp_by_size(num));

    // centroid estimation for each cluster
    for (uint i=0; i!=idx.size(); ++i)
    {
      std::vector<BPvecPtr> v(num[idx[i]]);
      for (uint j=0; j!=v.size(); ++j) v[j] = bpv[res[s[idx[i]]+j]];
      CountBP< std::vector<BPvecPtr> > count_bp(v, seq.size());
      inside_traverse(0, seq.size()-1, count_bp);
      char buf[100];
      sprintf(buf, "%3.1f%%", static_cast<float>(num[idx[i]])/bpv.size()*100);
      out << ">" << name << " (" << i+1 << " of " << num.size() << ", size="
          << buf << ")" << std::endl
          << get_seq(seq) << std::endl;

      std::vector<float>::const_iterator g;
      for (g=gamma.begin(); g!=gamma.end(); ++g) {
        std::string paren(seq.size(), '.');
        Centroid::execute(count_bp.table, paren, *g);
        out << paren << " (g=" << *g << ",th=" << (1.0/(1.0+*g));
#ifdef HAVE_LIBRNA
        out << ",e=" << calc_energy(seq, paren);
#endif
        out << ")" << std::endl;
      }

      if (!p_outname.empty())
      {
        char buf[1024];
        snprintf(buf, sizeof(buf), "%s-%d", p_outname.c_str(), i);
        count_bp.table.save(buf, get_seq(seq), th);
      }
    }
  }
  else
  {
    CountBP< std::vector<BPvecPtr> > count_bp(bpv, seq.size());
    inside_traverse(0, seq.size()-1, count_bp);
    std::string paren(seq.size(), '.');
    std::vector<float>::const_iterator g;
    out << ">" << name << std::endl
        << get_seq(seq) << std::endl;
    for (g=gamma.begin(); g!=gamma.end(); ++g)
    {
      std::fill(paren.begin(), paren.end(), '.');
      Centroid::execute(count_bp.table, paren, *g);
      out << paren << " (g=" << *g << ",th=" << (1.0/(1.0+*g));
#ifdef HAVE_LIBRNA
      out << ",e=" << calc_energy(seq, paren);
#endif
      out << ")" << std::endl;
    }

    if (!p_outname.empty())
    {
      char buf[1024];
      snprintf(buf, sizeof(buf), "%s-1", p_outname.c_str());
      count_bp.table.save(buf, get_seq(seq), th);
    }
  }
}
  bool transposition_based_synthesis( circuit& circ, const binary_truth_table& spec,
      properties::ptr settings, properties::ptr statistics )
  {
    // Settings parsing
    // Run-time measuring
    timer<properties_timer> t;

    if ( statistics )
    {
      properties_timer rt( statistics );
      t.start( rt );
    }

    unsigned bw = spec.num_outputs();
    circ.set_lines( bw );
    copy_metadata( spec, circ );

    std::map<unsigned, unsigned> values_map;

    for ( binary_truth_table::const_iterator it = spec.begin(); it != spec.end(); ++it )
    {
      binary_truth_table::cube_type in( it->first.first, it->first.second );
      binary_truth_table::cube_type out( it->second.first, it->second.second );

      values_map.insert( std::make_pair( truth_table_cube_to_number( in ), truth_table_cube_to_number( out ) ) );
    }

    // Set of cycles
    std::vector<std::vector<unsigned> > cycles;

    while ( !values_map.empty() )
    {
      unsigned start_value = values_map.begin()->first; // first key in values_map

      std::vector<unsigned> cycle;
      unsigned target = start_value;

      do
      {
        cycle += target;
        unsigned old_target = target;
        target = values_map[target];
        values_map.erase( old_target ); // erase this entry
      } while ( target != start_value );

      cycles += cycle;
    }

    for ( auto& cycle : cycles )
    {
      unsigned max_distance = 0u;
      unsigned max_index = 0u;

      for ( unsigned i = 0u; i < cycle.size(); ++i )
      {
        unsigned first = cycle.at(i);
        unsigned second = cycle.at( (i + 1u) % cycle.size() );

        unsigned distance = hamming_distance( first, second );

        if ( distance > max_distance )
        {
          max_distance = distance;
          max_index = i;
        }
      }

      std::vector<unsigned> tmp;
      std::copy( cycle.begin() + ( max_index + 1u ), cycle.end(), std::back_inserter( tmp ) );
      std::copy( cycle.begin(), cycle.begin() + ( max_index + 1u ), std::back_inserter( tmp ) );
      std::copy( tmp.begin(), tmp.end(), cycle.begin() );
      std::reverse( cycle.begin(), cycle.end() );
    }

    // TODO create transpositions function
    for ( auto& cycle : cycles )
    {
      for ( unsigned i = 0u; i < cycle.size() - 1; ++i )
      {
        circuit transposition_circ( spec.num_inputs() );

        unsigned first = cycle.at(i);
        unsigned second = cycle.at( (i + 1) % cycle.size() );

        boost::dynamic_bitset<> first_bits( spec.num_inputs(), first );
        boost::dynamic_bitset<> second_bits( spec.num_inputs(), second );

        transposition_to_circuit( transposition_circ, first_bits, second_bits );

        append_circuit( circ, transposition_circ);
      }
    }

    return true;
  }
Example #18
0
int main(int argc, char *argv[])
{
    if (argc != 2){
        std::cout << "Usage: ch6 <input_file>" << std::endl;
        return -1;
    }
    string filename {argv[1]};
    string decoded, line;
    std::ifstream input {filename};
    int KEYSIZE {40};
    std::multimap<double, int> keysize_mapping;

    if (input.is_open()){
        while (std::getline(input, line)){
            decoded += base64_decrypt(line);
        }
    }

    for (int i = 2; i < KEYSIZE; i++){
        string str1 {decoded.substr(0, i)};
        string str2 {decoded.substr(i, i)};
        assert(str1.size() == str2.size());

        int distance {hamming_distance(str1, str2)};
        double score = (distance / (double) i);
        keysize_mapping.insert(std::pair<double, int>(score, i));
    }
    std::multimap<double, int>::iterator it {keysize_mapping.begin()};
    std::vector<int> better_keysizes;
    for (int i = 0; it != keysize_mapping.end(); it++, i++){
        if (i == 8){
            break;
        }
        better_keysizes.push_back(it->second);
    }

    for(int keysize : better_keysizes){
        int blocks = ceil(decoded.size() / keysize);
        std::vector<string> transposed;
        printf("keysize: %d\n", keysize);
        for(int i = 0; i < keysize; i++){
            transposed.push_back(string {});
            for(int block = 0; block < blocks; block++){
                int index = (block * keysize) + i;
                if (index < decoded.size()){
                    char hex[2];
                    sprintf(hex, "%02X", decoded[index]);
                    transposed[i] += hex;
                }else{
                    transposed[i] += '\0';
                }
            }
        }
        for(string str : transposed){
            std::multimap<int, struct decoded_string> ranking = probe_keys(str);
            std::multimap<int, struct decoded_string>::reverse_iterator rit;
            int limit = 0;
            for(rit = ranking.rbegin(); rit != ranking.rend(); rit++, limit++){
                char key = rit->second.key;
                std::cout << key << " ";
                if (limit == 2)
                    break;
            }
            std::cout << std::endl;
        }
        std::cout << std::endl;
    }

    return 0;
}