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"
|
| 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.
|
|
|
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.
|
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"
◆ diff_bits()
| int diff_bits |
( |
const uint8_t * | a, |
|
|
const uint8_t * | b ) |
|
static |
Hitung jumlah bit yang berbeda antara dua blok.
- Parameters
-
| [in] | a | Blok pertama. |
| [in] | b | Blok 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] | rk | Round key. |
| [in] | r | Jumlah round (1..ROUNDS). |
| [in] | in | Plaintext 16 byte. |
| [out] | out | Ciphertext 16 byte. |
◆ fill_random()
| void fill_random |
( |
uint8_t * | p, |
|
|
size_t | n ) |
|
static |
Isi buffer dengan byte acak dari next_rand().
- Parameters
-
| [out] | p | Buffer tujuan. |
| [in] | n | Jumlah 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
-
- Returns
- Nilai 64 bit.
◆ main()
| int main |
( |
int | argc, |
|
|
char ** | argv ) |
Avalanche plaintext dan kunci untuk r = 1..ROUNDS.
- Parameters
-
| [in] | argc | Jumlah argumen. |
| [in] | argv | Opsional --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] | key | Master key. |
| [out] | rk | Round key K_0 ... K_15. |
◆ next_rand()
PRNG deterministik (xorshift64).
- Returns
- Nilai acak 64 bit berikutnya.
- Note
- Bukan PRNG kriptografis, hanya untuk generate test data.
◆ self_check()
◆ store64()
| void store64 |
( |
uint8_t * | p, |
|
|
uint64_t | v ) |
|
static |
Tulis 64 bit ke 8 byte big-endian (sama dengan cipher.cpp).
- Parameters
-
| [out] | p | Buffer 8 byte. |
| [in] | v | Nilai 64 bit. |