Commit Graph
29 Commits
Author SHA1 Message Date
KiHoLee 28a3895d27 8:6 axes boxes and the outsider label in the system figure 2026-08-30 20:59:21 +09:00
KiHoLee de066fc09a Carry the caption, label and figure fixes into the release
The table generator uses the legend form of the scheme name, the system
figure groups blocks with dashed outlines, and the figure PDFs are
rebuilt from the current data.
2026-08-29 12:24:39 +09:00
KiHoLee 0645347685 Carry the figure-style and table-order fixes into the release
The lower of two coinciding curves is the wide one, the random-guess
reference is dotted everywhere and never borrows a scheme colour, the
three collection SNRs in the known-plaintext figure differ by face and
width rather than by dash alone, and the legend floor now prints at six
points with an assertion that fails if any figure drags it lower. Both
table generators list the proposal first.
2026-08-29 00:15:02 +09:00
KiHoLee 138897aa8d Ship the learned-key pipeline, without which six figures cannot be rebuilt
The package was missing every script behind the KM (lrn.) curves and
both learned table rows: exp_learned's driver, the merge that folds the
learned rows into sec_compare.csv and refresh_summary.csv, and the
report that reads the learned numbers back. It was also missing
sec_keylen_perm.csv, so Fig. 3 could not be regenerated at all, and the
two diagnostics that answer why a fixed key beats a learned one here and
where a learned mask would win instead.

The learned artifacts themselves are regenerated. They were trained on
the cross-entropy alone, which drifts to disjoint sparse supports: 99
percent of each key's energy on about six of the 64 entries, so a digit
is decided over a sixth of its period and the key set is a choice of
support rather than a dense direction in R^L. They are now the
regularized keys of Section V-C, and check_consistency asserts which of
the two families the figures draw.

Verified from inside this repository: replot_security.py rebuilds all
seven result figures, make_tables.py reproduces both result tables, and
check_consistency.py passes every check that does not need the
manuscript.

The README now lists what ships. Its run list, layout and figure map had
none of the learned pipeline, named two tables the manuscript renders as
prose, and gave Fig. 3 no data file for its permutation curve.
2026-08-28 23:58:01 +09:00
KiHoLee ffe56b4b25 Per-scheme markers in Fig. 7, adversary realization in the labels
Fig. 7 varied the marker across collection SNRs of one scheme, taking
shapes that identify other schemes elsewhere; the marker is now the
scheme's and the line style carries the SNR. Adversary labels name the
realization they were run for.
2026-08-28 21:26:43 +09:00
KiHoLee 2393852c16 Permutation key reads the style registry in Fig. 7
It was the one curve still passing a colour and marker at the call site,
and it took the index cipher's, so the same scheme was drawn two ways.
2026-08-28 21:04:50 +09:00
KiHoLee cbdb068219 Fig. 4 on a log ordinate
The unjammed reference puts the range at 0.053 to 0.998, over a decade,
so the linear axis and its below-zero legend band are no longer needed.
Minor tick labels are suppressed to keep the left margin clear.
2026-08-28 20:34:39 +09:00
KiHoLee 669737e83d Learned-key sensitivity, brute-force and real-token stages; legend order
exp_learned.py completes the learned side of the result stages, so every
figure can carry both realizations of keyed masking. real() holds the
structured artifacts aside and restores them, since exp_real_sec writes
fixed file names.

replot_security.py ranks legend handles from one declared order at all
three ax.legend call sites, so entries no longer follow plot-call order
and drift between figures.
2026-08-28 20:31:50 +09:00
KiHoLee c00e8ab666 Learned-key stages, per-scheme plot styles, KM naming
exp_learned.py mirrors every structured result stage for the learned key
family at the same SNRs, frame counts and seeds, so Figs. 2, 3, 4 and 7
and Tables IV and VI can carry both realizations of keyed masking.

replot_security.py gains a style registry: colour identifies the scheme
and line style the role, so a curve learned in one figure reads the same
in the next. Previously OMA was grey in two figures and teal in a third,
and blue meant the eavesdropper in one figure and the permutation key in
another.
2026-08-28 20:15:45 +09:00
KiHoLee 3a9a5eebf4 Key-space attacks against both key families, and the learned SNR sweep
check_family_enum.py now runs both attacks against both families. The
outsider ranks the L-1 Walsh rows; the insider, holding m_v, ranks the
L-1 products m_v .* m_r, which works because Walsh rows are closed
under the elementwise product and the per-block sign cancels in
m_u .* m_v. Both need a list to rank, and only the structured family
supplies one: the structured family falls at 0.905 from one frame at
10 dB and 0.990 from four, the refresh takes the outsider to 0.000 and
leaves the insider at 0.980, and the learned family gives 0.000
throughout.

exp_full.stage_N sweeps the learned family over the same SNR grid at
the same frame count as stage_A, so Fig. 2 can carry both families and
a reader can see what the key space costs at every SNR rather than at
one point.

check_consistency.py gains four assertions for the key-space
measurements and two for the learned sweep, 82 in all.

README: the assertion count was two rounds stale, and the figure map
omitted family_enum, cov_attack and maskdegen, whose CSVs back quoted
manuscript numbers.
2026-08-28 19:30:58 +09:00
KiHoLee 9cded88f08 Sync data and code after the per-digit re-audit 2026-08-28 10:07:27 +09:00
KiHoLee 50b2994e4a Figure legends after the read-through 2026-08-22 15:01:49 +09:00
KiHoLee 58a85c30f6 Sync with the audited manuscript
The jammed OMA model now matches the transmit chain the paper
describes, the key-length sweep averages the eavesdropper over eight
substitute-key draws, and verify_math gains the coded-OMA outage
reference, symbolic checks of the three algebraic identities, and the
cross-period remainder of Proposition 2. The README records the energy
and channel conventions.
2026-08-22 14:47:17 +09:00
KiHoLee 24019e901a Leakage, semantic and robustness experiments from the revision 2026-08-22 12:24:39 +09:00
KiHoLee e4da750812 Figure fonts and legend inset for the 0.85 include 2026-08-19 18:55:04 +09:00
KiHoLee 9cd105e748 Figure fonts for the 0.80 include 2026-08-19 18:22:52 +09:00
KiHoLee 1de366cd9b Figure geometry for the 0.68 include 2026-08-19 17:58:34 +09:00
KiHoLee 55e417276d Covariance attack at the main configuration, stored to data/
The ciphertext-only check trained its own L=16 model and printed only a
verdict; it now attacks the main configuration and writes
data/cov_attack.csv, which the manuscript cites.
2026-08-19 17:32:28 +09:00
KiHoLee f378da511c Plotting-code review: stale comments and duplicated constants removed 2026-08-19 16:31:01 +09:00
KiHoLee e243b29d29 Audit round: stored degeneracy measurement, figure guards, 44 assertions
diag_maskdegen writes data/maskdegen.csv so the claim it supports is
traceable; the legend guard inflates by the marker radius and refuses a
legend that leaves the canvas; one legend size on every figure.
2026-08-19 15:08:38 +09:00
KiHoLee 2fb64bee3a Figure font scale and legend placement fix from the writing audit
Declared point sizes are now pre-divided by the 0.70 include scale so
the printed sizes are the intended ones, and place_legend scores the
same layout save() enforces.
2026-08-18 21:16:21 +09:00
KiHoLee 8f26bf9bc9 Main configuration d=256, L=64: all data, figures and checks re-run
Every OMA reference takes the L/16 combining gain so the comparison
stays resource matched, four hardcoded copies of the configuration are
replaced by MAIN_D or the main curve, and stage_J's K-by-L Gaussian
draw becomes its exact scalar Beta equivalent.
2026-08-18 14:40:48 +09:00
KiHoLee f828018160 Add a mangled-macro scan and a ratio inset for the OMA comparison
check_texhealth.py flags control characters and bare macro stubs left
by a shell heredoc, a class of corruption that LaTeX compiles without
complaint. It skips when main.tex is absent, as in this package.

fig_sec_snr now carries an inset with the OMA-to-proposed SER ratio,
since the 1 to 9 percent advantage is invisible across two decades of
log axis, and save() now guards inset overlap as it guards the legend.

check_consistency covers the L=8 crossover, the inset ratio span, the
stated secret sizes, and the Fig. 5 curve coincidence: 29 assertions.
2026-08-18 13:25:48 +09:00
KiHoLee 3d5a7fc6f3 Structured key family as the main configuration
Unconstrained key training converged to disjoint sparse supports: 99
percent of each users key energy sat on three or four of the sixteen
entries, with pairwise disjoint supports and one numerically dead
codebook column. That is an orthogonal slot allocation, so the
superposition collapsed into OMA and the key space was far smaller than
the dense direction the brute-force study assumes.

The main configuration is now the structured Walsh-Hadamard family,
which is dense, exactly orthogonal, unit modulus, and already the best
family in the key-family table. base_keys generalizes to any key length
by truncating the next power-of-two Sylvester order, and the key-length
sweep keeps only lengths where the truncated rows stay exactly
orthogonal, verified numerically.

Also fixes the M-PAM energy normalization in oma_ser_keylen, which used
sqrt(6g/(M^2-1)) where unit average symbol energy gives A^2=3/(M^2-1);
the closed form was 3 dB optimistic and now reproduces a direct Monte
Carlo to 1e-5.

Results move accordingly: the proposal now stays below OMA at every SNR
and reaches 1.52x at key length 64, while the jamming margin falls to
5.5-6.3 dB and the brute-force curve to 0.59 at a million guesses.
2026-08-17 20:02:27 +09:00
KiHoLee 47d974a5bf Add check_consistency.py, correct two stale figures in comments
check_consistency.py asserts every headline number against its raw CSV,
so a stale quoted value fails loudly instead of surviving a revision. It
skips the manuscript-side assertions when main.tex is absent, which is
the case in this package.

The blind-versus-permutation agreement is 0.002, not 0.0015, and the
resource-matched OMA is undefined below L=16 rather than wherever 16/L
is not an integer.
2026-08-17 00:06:25 +09:00
KiHoLee 3529ab1918 Audit round: fair OMA reference, dense grids, covariance-attack checks
Resource-match the OMA reference in the key-length sweep (oma_ser_keylen),
which gives it the L/16 combining gain the longer frame allows. The
proposal now passes a resource-matched OMA by 1.27x at L=64 rather than
the 4.3x reported against a fixed-d reference.

Densify the JSR, sensitivity, and brute-force grids so the curves are
smooth, give the index cipher its channel floor instead of error-free
reception, and add the permutation-key known-plaintext attack
(exp_permkpa) so Fig. 7 carries a conventional linear scheme.

Add check_cov_attack.py and check_cov_ceiling.py: a referee raised a
ciphertext-only second-order attack; the exact-population test shows the
received covariance leaks only a sparse rank-deficient subset of the key
Gram and leaves the eavesdropper at the random-guess level.

Dump verify_math.csv, move the superseded V=256 pilot CSVs to data/pilot.
2026-08-16 23:48:39 +09:00
KiHoLee c31e6a3fe0 Four-scheme jamming comparison and a fully generated refresh table
Give the orthogonal-access jammer its own Rayleigh channel in
oma_ser_jammed, matching the convention every simulated scheme already
used. Without it the closed-form curve faced a jammer at full power in
every frame while the Monte Carlo curves faced a fading one, which
inverted the ordering of the comparison.

Measure the outsider error rate for the fixed-key and naive-refresh
cases as well, and emit the two refresh tables from make_tables.py, so
no cell of the paper is hand-typed.
2026-08-13 22:22:18 +09:00
KiHoLee 25b5891b04 Final revision: audit fixes, cross-scheme comparisons, known-plaintext stage
- exclude the all-ones Walsh-Hadamard row and test every key family
  against the all-ones guess
- pass the model dimension to the noise scaling so the key-length sweep
  runs at a fixed per-dimension SNR
- known-plaintext attack with nested accumulation and common random
  numbers, averaged over 40 collections
- key sensitivity and brute-force search extended to the permutation
  key and the index cipher
- make_tables regenerates all three result tables from the CSVs
2026-08-13 21:21:46 +09:00
KiHoLee 37392bc38f Keyed masking for secure multi-user semantic communication
Reproducibility package for the TIFS submission: transmit and receive
core, security stages (eavesdropper, jamming, key families, attack
difficulty, known-plaintext), real BERT token streams, closed-form
verification, and the scripts that regenerate every figure and table
from the released CSVs.
2026-08-13 21:01:32 +09:00