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

Analisis kelima mode operasi: bukti padding, avalanche, entropi, chi-square, dan histogram. More...

#include <array>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <filesystem>
#include <set>
#include <string>
#include <vector>
#include "cipher.hpp"
#include "modes.hpp"
#include "padding.hpp"

Classes

struct  ModeInfo
 Deskripsi satu mode yang dianalisis. More...
struct  Acc
 Statistik sederhana (rata-rata, min, max) untuk persentase. More...
struct  ByteStats
 Statistik byte satu buffer. More...

Typedefs

using ModeFn = util::Bytes (*)(const BlockCipher &, const uint8_t *, const util::Bytes &)
 Signature fungsi mode, sama dengan yang dipakai container.

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 util::Bytes encrypt (const ModeInfo &m, const BlockCipher &c, const uint8_t *iv, const util::Bytes &pt)
 Enkripsi plaintext dengan satu mode (dipad dulu jika mode membutuhkannya).
static long diff_bits (const uint8_t *a, const uint8_t *b, size_t n)
 Hitung jumlah bit yang berbeda antara dua buffer (jarak Hamming).
static void csv_av (FILE *csv, const char *mode, const char *what, const char *scope, const Acc &a)
 Tulis satu baris CSV avalanche.
static void padding_demo ()
 Bagian 1: bukti padding PKCS#7 dan panjang ciphertext tiap mode.
static void avalanche_modes (int trials, FILE *csv)
 Bagian 2: avalanche per mode.
static util::Bytes make_input (const std::string &kind, size_t n)
 Buat plaintext uji.
static double chi2_pvalue (double chi2, double df)
 p-value uji chi-square, aproksimasi Wilson-Hilferty.
static ByteStats byte_stats (const util::Bytes &d, uint64_t counts[256])
 Hitung entropi, chi-square, jumlah byte unik, dan keunikan blok.
static void entropy_modes (int runs, size_t size, const fs::path &out_dir, FILE *csv)
 Bagian 3 dan 4: entropi, chi-square, keunikan blok, dan histogram.
static FILE * open_csv (const fs::path &p)
 Buka file CSV untuk ditulis, keluar jika gagal.
int main (int argc, char **argv)
 Jalankan seluruh analisis per mode.

Variables

static const ModeInfo MODES []
 Kelima mode, dengan aturan padding yang sama dengan SecureEnvelope.
constexpr size_t N_MODES = sizeof(MODES) / sizeof(MODES[0])
 Jumlah mode.
constexpr size_t AV_BLOCKS = 64
 Panjang pesan uji avalanche dalam blok.
static uint64_t rng_state = 0x123456789ABCDEF0ULL
 State PRNG. Seed tetap supaya hasil uji bisa direproduksi.

Detailed Description

Analisis kelima mode operasi: bukti padding, avalanche, entropi, chi-square, dan histogram.

Yang diuji adalah ciphertext mentah dari fungsi modes:: (tanpa header dan tag). ECB dan CBC dipad PKCS#7. Data uji, kunci, dan IV memakai seed tetap.

make mode-analysis
make mode-analysis ANALYSIS_ARGS="--trials 100 --runs 3 --size 256"

Keluaran CSV (default ke test-results/data): avalanche_modes.csv, entropy_modes.csv, dan hist_<input>.csv.

Function Documentation

◆ avalanche_modes()

void avalanche_modes ( int trials,
FILE * csv )
static

Bagian 2: avalanche per mode.

Parameters
[in]trialsJumlah percobaan per mode.
[in]csvFile CSV keluaran.

◆ byte_stats()

ByteStats byte_stats ( const util::Bytes & d,
uint64_t counts[256] )
static

Hitung entropi, chi-square, jumlah byte unik, dan keunikan blok.

Parameters
[in]dData.
[out]countsFrekuensi tiap nilai byte (256 elemen).
Returns
Statistik.

◆ chi2_pvalue()

double chi2_pvalue ( double chi2,
double df )
static

p-value uji chi-square, aproksimasi Wilson-Hilferty.

Parameters
[in]chi2Statistik chi-square.
[in]dfDerajat kebebasan.
Returns
Peluang P(X >= chi2) di bawah H0.

◆ csv_av()

void csv_av ( FILE * csv,
const char * mode,
const char * what,
const char * scope,
const Acc & a )
static

Tulis satu baris CSV avalanche.

Parameters
[in]csvFile CSV.
[in]modeNama mode.
[in]whatBit yang dibalik (plaintext, kunci, iv).
[in]scopeBagian ciphertext yang diukur.
[in]aStatistik.

◆ diff_bits()

long diff_bits ( const uint8_t * a,
const uint8_t * b,
size_t n )
static

Hitung jumlah bit yang berbeda antara dua buffer (jarak Hamming).

Parameters
[in]aBuffer pertama.
[in]bBuffer kedua.
[in]nPanjang kedua buffer dalam byte.
Returns
Jumlah bit yang berbeda.

◆ encrypt()

util::Bytes encrypt ( const ModeInfo & m,
const BlockCipher & c,
const uint8_t * iv,
const util::Bytes & pt )
static

Enkripsi plaintext dengan satu mode (dipad dulu jika mode membutuhkannya).

Parameters
[in]mMode.
[in]cCipher yang sudah dikunci.
[in]ivIV / counter awal (diabaikan ECB).
[in]ptPlaintext.
Returns
Ciphertext mentah.

◆ entropy_modes()

void entropy_modes ( int runs,
size_t size,
const fs::path & out_dir,
FILE * csv )
static

Bagian 3 dan 4: entropi, chi-square, keunikan blok, dan histogram.

Parameters
[in]runsJumlah pasangan kunci/IV.
[in]sizePanjang tiap plaintext dalam byte.
[in]out_dirDirektori keluaran.
[in]csvFile CSV ringkasan entropi.

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

◆ main()

int main ( int argc,
char ** argv )

Jalankan seluruh analisis per mode.

Parameters
[in]argcJumlah argumen.
[in]argvArgumen (lihat opsi di deskripsi file).
Returns
0 jika selesai, 1 jika argumen salah atau gagal menulis berkas.

◆ make_input()

util::Bytes make_input ( const std::string & kind,
size_t n )
static

Buat plaintext uji.

Parameters
[in]kindJenis input: "teks", "nol", atau "pola".
[in]nPanjang dalam byte.
Returns
Plaintext.

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

◆ open_csv()

FILE * open_csv ( const fs::path & p)
static

Buka file CSV untuk ditulis, keluar jika gagal.

Parameters
[in]pPath file.
Returns
Pointer FILE.

Variable Documentation

◆ MODES

const ModeInfo MODES[]
static
Initial value:
= {
{"ECB", true, false, modes::ecb_encrypt},
{"CBC", true, true, modes::cbc_encrypt},
{"CFB", false, true, modes::cfb_encrypt},
{"OFB", false, true, modes::ofb_crypt},
{"CTR", false, true, modes::ctr_crypt},
}
util::Bytes ecb_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Electronic Codebook (ECB).
Definition modes.cpp:20
util::Bytes ctr_crypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi/dekripsi data menggunakan mode Counter (CTR).
Definition modes.cpp:172
util::Bytes ofb_crypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi/dekripsi data menggunakan mode Output Feedback (OFB).
Definition modes.cpp:152
util::Bytes cbc_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Cipher Block Chaining (CBC).
Definition modes.cpp:56
util::Bytes cfb_encrypt(const BlockCipher &cipher, const uint8_t *iv, const util::Bytes &in)
Enkripsi data menggunakan mode Cipher Feedback (CFB-128 full block).
Definition modes.cpp:106

Kelima mode, dengan aturan padding yang sama dengan SecureEnvelope.