v9_r2_Challenges/200_unsavable
six 71799cb1c5 gl hf 2024-04-16 12:53:32 +04:00
..
README.md gl hf 2024-04-16 12:53:32 +04:00
ciphertext_20240416093454.dat gl hf 2024-04-16 12:53:32 +04:00

README.md

Here's a home-brewed stream cipher:

uint64_t next(uint64_t x)
{
	return (x << 12) ^ ((x >> 12) + 1);
}

typedef uint8_t (*hash_func_t)(uint64_t x);

hash_func_t hash;
uint64_t state;

void initialize(hash_func_t h, uint64_t iv)
{
	hash = h;
	state = iv;
}

uint8_t get_byte(void)
{
	uint8_t b = hash(state);
	state = next(state);
	return b;
}

It's extra secure because even some of its code is secret.

Here's a (ASCII) message, containing the flag, encrypted with this method: the ciphertext is the plaintext xor-ed with a stream of bytes generated using these functions, starting with a secret, well-chosen hash function and a random initialization vector.

Flag: the format as commonly used, eg. CCTF{flagitself}

//Type: Cryptography //Author: SI