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; }
/* 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]); } }
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; }