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

Uji Strict Avalanche Criterion (SAC) pada CustomCipher::encrypt_block. More...

#include <cmath>
#include <cstdio>
#include <cstring>
#include "cipher.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 int get_bit (const uint8_t *p, size_t i)
 Ambil satu bit dari buffer.
static void report (const char *name, size_t in_bits, const int counts[][BLOCK_BITS])
 Cetak ringkasan matriks SAC.
int main ()
 SAC untuk bit plaintext dan bit kunci.

Variables

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

Detailed Description

Uji Strict Avalanche Criterion (SAC) pada CustomCipher::encrypt_block.

Untuk tiap pasangan (bit input i, bit output j), diukur peluang bit output j berubah ketika bit input i dibalik. Cipher yang baik menghasilkan ~50% untuk semua pasangan, bukan hanya rata-ratanya (lebih ketat dari avalanche.cpp).

Dilakukan dua kali:

  1. bit plaintext ke bit ciphertext (128 x 128 pasangan), dan
  2. bit kunci ke bit ciphertext (128 x 128 pasangan).

Karena jumlah percobaan terbatas, tiap sel punya galat acak. Di bawah hipotesis p = 0.5, simpangan bakunya sigma = 50% / sqrt(TRIALS). Sel yang menyimpang lebih dari 4 sigma jarang terjadi (sekitar 6.3e-5 per sel).

Jalankan dengan:

make sac
See also
avalanche.cpp untuk uji avalanche rata-rata.

Function Documentation

◆ 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.

◆ get_bit()

int get_bit ( const uint8_t * p,
size_t i )
inlinestatic

Ambil satu bit dari buffer.

Parameters
[in]pBuffer sumber.
[in]iIndeks bit (bit 0 = LSB byte pertama).
Returns
0 atau 1.

◆ main()

int main ( )

SAC untuk bit plaintext dan bit kunci.

Returns
0 (hanya mencetak hasil).

◆ 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.

◆ report()

void report ( const char * name,
size_t in_bits,
const int counts[][BLOCK_BITS] )
static

Cetak ringkasan matriks SAC.

Yang diprint:

  • rata-rata,
  • min, dan
  • max persentase seluruh sel
  • sel dengan simpangan terbesar (dalam satuan sigma),
  • serta jumlah sel di luar 4 sigma
Parameters
[in]nameLabel bagian keluaran.
[in]in_bitsJumlah bit input yang dibalik (jumlah baris matriks).
[in]countscounts[i][j] = berapa kali bit output j berubah saat bit input i dibalik, dari TRIALS percobaan.