Пример #1
0
int main(void){
	uchar s[256];
	uchar key[256];
	uchar word[256];
	size_t key_len;

	struct dynamic_str encode, decode;

	strcpy((char *)key, "do_or_die"); // > 255 == stack overflow
	strcpy((char *)word, "\natirei o pau na dilma, mas a dilma não morreu\n");

	key_len = strlen((const char *)key);

	ksa(s, key, key_len);
	prga(word, s, &encode);

	printf("RC4:\n'%s'\n", encode.ptr);

	ksa(s, key, key_len);
	prga(encode.ptr, s, &decode);

	printf("Decoded:\n'%s'\n", decode.ptr);

	free(decode.ptr);
	free(encode.ptr);

	return 0;
}
Пример #2
0
/* Encrypt or Decrypt */
void rc4(u_char *key, u_char *input, u_char *output, int keylen, int msglen) {
    int i;
    u_char State[256];
    u_char *keystream;

    initialize(State);

    ksa(State, key, keylen);
    printf("\n--- Tamaño del mensaje %d\n", msglen);
    keystream = prng(State, msglen);

    for(i=0; i<msglen; i++)
        output[i] = input[i] ^ keystream[i];

    printf("\n--- Key Generation ---\nKey: %s\n\n", key);

    printf("Keystream:\n");
    for(i=0; i<msglen; i++) {
        if(i%16==0) {
            printf("\n");
            printf("%d:\t", i);
        }
        if(keystream[i]<16)
            printf("0%x ", keystream[i]);
        else
            printf("%x ", keystream[i]);
    }
}
Пример #3
0
static bool decrypt_file(const char *fname, bool from_update)
{
  uint32_t header[5];
  size_t datlen;
  ksa(secret_key, 16);
  FILE *inp;
  struct stat fst;

  if((inp = fopen(fname, "rb")) == NULL){
    printf("Can't open input file '%s'", fname);
    return false;
  }

  if(fstat(fileno(inp), &fst) != 0){
    fclose(inp);
    printf("Cannot stat file '%s'\n", fname);
    return false;
  }
  
  if(from_update){
    if(fread(&header, sizeof(uint32_t), 5, inp) != 5){
      fclose(inp);
      printf("Can't read the header - file '%s' is less than 20 bytes long?\n", fname);
      return false;
    }
    datlen = header[4];
  }else{
    datlen = fst.st_size;
  }
  if((decoded = (char *)malloc(datlen+1)) == NULL){
    printf("malloc failed!\n");
    return false;
  }
  memset(decoded, 0, datlen+1);
  size_t i;
  size_t len = fread(decoded, 1, datlen, inp);
  (void) len;
  for(i = 0; i < datlen; ++i) decoded[i] ^= rc4();
  fclose(inp);
  
  //inp = fopen("tmp.dump", "w");
  //fwrite(decoded, 1, datlen, inp);
  //fclose(inp);
  
  return true;
}