Cipher Fayadh
Block cipher Feistel 128-bit dengan fungsi putaran sigma-delta
Loading...
Searching...
No Matches
rounds.cpp File Reference

Avalanche effect untuk 1 sampai ROUNDS round Feistel. More...

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include "cipher.hpp"
#include "key_schedule.hpp"
#include "round.hpp"

Functions

static uint64_t next_rand ()
 PRNG deterministik (xorshift64).
static void fill_random (uint8_t *p, size_t n)
 Isi buffer dengan byte acak dari next_rand().
static uint64_t load64 (const uint8_t *p)
 Baca 8 byte big-endian menjadi 64 bit (sama dengan cipher.cpp).
static void store64 (uint8_t *p, uint64_t v)
 Tulis 64 bit ke 8 byte big-endian (sama dengan cipher.cpp).
static void make_round_keys (const uint8_t key[KEY_SIZE], uint64_t rk[ROUNDS])
 Bangkitkan round key dari master key 16 byte.
static void encrypt_rounds (const uint64_t rk[ROUNDS], int r, const uint8_t *in, uint8_t *out)
 Enkripsi satu blok dengan hanya r round pertama (termasuk swap terakhir).
static int diff_bits (const uint8_t *a, const uint8_t *b)
 Hitung jumlah bit yang berbeda antara dua blok.
static bool self_check ()
 Pastikan versi r = ROUNDS identik dengan CustomCipher::encrypt_block.
int main (int argc, char **argv)
 Avalanche plaintext dan kunci untuk r = 1..ROUNDS.

Variables

static const int TRIALS = 500
 Jumlah percobaan (pasangan kunci dan plaintext acak) per jumlah round.
constexpr size_t BLOCK_BITS = BLOCK_SIZE * 8
 Ukuran blok dalam bit.
constexpr size_t KEY_BITS = KEY_SIZE * 8
 Ukuran kunci dalam bit.
static uint64_t rng_state = 0x123456789ABCDEF0ULL
 State PRNG. Seed tetap supaya hasil uji bisa direproduksi.

Detailed Description

Avalanche effect untuk 1 sampai ROUNDS round Feistel.

Memakai key_schedule dan round_f yang sama dengan CustomCipher. Versi ROUNDS round dicek identik dengan CustomCipher::encrypt_block.

make rounds
make rounds ROUNDS_ARGS="--csv out.csv"

Function Documentation

◆ diff_bits()

int diff_bits ( const uint8_t * a,
const uint8_t * b )
static

Hitung jumlah bit yang berbeda antara dua blok.

Parameters
[in]aBlok pertama.
[in]bBlok kedua.
Returns
Jumlah bit yang berbeda (0..128).

◆ encrypt_rounds()

void encrypt_rounds ( const uint64_t rk[ROUNDS],
int r,
const uint8_t * in,
uint8_t * out )
static

Enkripsi satu blok dengan hanya r round pertama (termasuk swap terakhir).

Parameters
[in]rkRound key.
[in]rJumlah round (1..ROUNDS).
[in]inPlaintext 16 byte.
[out]outCiphertext 16 byte.

◆ fill_random()

void fill_random ( uint8_t * p,
size_t n )
static

Isi buffer dengan byte acak dari next_rand().

Parameters
[out]pBuffer tujuan.
[in]nJumlah byte yang diisi.

◆ load64()

uint64_t load64 ( const uint8_t * p)
static

Baca 8 byte big-endian menjadi 64 bit (sama dengan cipher.cpp).

Parameters
[in]pBuffer 8 byte.
Returns
Nilai 64 bit.

◆ main()

int main ( int argc,
char ** argv )

Avalanche plaintext dan kunci untuk r = 1..ROUNDS.

Parameters
[in]argcJumlah argumen.
[in]argvOpsional --csv PATH untuk menyimpan hasil.
Returns
0 jika selesai, 1 jika self-check gagal atau argumen salah.

◆ make_round_keys()

void make_round_keys ( const uint8_t key[KEY_SIZE],
uint64_t rk[ROUNDS] )
static

Bangkitkan round key dari master key 16 byte.

Parameters
[in]keyMaster key.
[out]rkRound key K_0 ... K_15.

◆ next_rand()

uint64_t next_rand ( )
static

PRNG deterministik (xorshift64).

Returns
Nilai acak 64 bit berikutnya.
Note
Bukan PRNG kriptografis, hanya untuk generate test data.

◆ self_check()

bool self_check ( )
static

Pastikan versi r = ROUNDS identik dengan CustomCipher::encrypt_block.

Returns
true jika identik untuk 100 blok acak.

◆ store64()

void store64 ( uint8_t * p,
uint64_t v )
static

Tulis 64 bit ke 8 byte big-endian (sama dengan cipher.cpp).

Parameters
[out]pBuffer 8 byte.
[in]vNilai 64 bit.