|
Cipher Fayadh
Block cipher Feistel 128-bit dengan fungsi putaran sigma-delta
|
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. | |
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.
Keluaran CSV (default ke test-results/data): avalanche_modes.csv, entropy_modes.csv, dan hist_<input>.csv.
|
static |
Bagian 2: avalanche per mode.
| [in] | trials | Jumlah percobaan per mode. |
| [in] | csv | File CSV keluaran. |
|
static |
Hitung entropi, chi-square, jumlah byte unik, dan keunikan blok.
| [in] | d | Data. |
| [out] | counts | Frekuensi tiap nilai byte (256 elemen). |
|
static |
p-value uji chi-square, aproksimasi Wilson-Hilferty.
| [in] | chi2 | Statistik chi-square. |
| [in] | df | Derajat kebebasan. |
|
static |
Tulis satu baris CSV avalanche.
| [in] | csv | File CSV. |
| [in] | mode | Nama mode. |
| [in] | what | Bit yang dibalik (plaintext, kunci, iv). |
| [in] | scope | Bagian ciphertext yang diukur. |
| [in] | a | Statistik. |
|
static |
Hitung jumlah bit yang berbeda antara dua buffer (jarak Hamming).
| [in] | a | Buffer pertama. |
| [in] | b | Buffer kedua. |
| [in] | n | Panjang kedua buffer dalam byte. |
|
static |
Enkripsi plaintext dengan satu mode (dipad dulu jika mode membutuhkannya).
| [in] | m | Mode. |
| [in] | c | Cipher yang sudah dikunci. |
| [in] | iv | IV / counter awal (diabaikan ECB). |
| [in] | pt | Plaintext. |
|
static |
Bagian 3 dan 4: entropi, chi-square, keunikan blok, dan histogram.
| [in] | runs | Jumlah pasangan kunci/IV. |
| [in] | size | Panjang tiap plaintext dalam byte. |
| [in] | out_dir | Direktori keluaran. |
| [in] | csv | File CSV ringkasan entropi. |
|
static |
Isi buffer dengan byte acak dari next_rand().
| [out] | p | Buffer tujuan. |
| [in] | n | Jumlah byte yang diisi. |
| int main | ( | int | argc, |
| char ** | argv ) |
Jalankan seluruh analisis per mode.
| [in] | argc | Jumlah argumen. |
| [in] | argv | Argumen (lihat opsi di deskripsi file). |
|
static |
Buat plaintext uji.
| [in] | kind | Jenis input: "teks", "nol", atau "pola". |
| [in] | n | Panjang dalam byte. |
|
static |
PRNG deterministik (xorshift64).
|
static |
Buka file CSV untuk ditulis, keluar jika gagal.
| [in] | p | Path file. |
|
static |
Kelima mode, dengan aturan padding yang sama dengan SecureEnvelope.