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.
This commit is contained in:
+2
-8
@@ -45,7 +45,8 @@ import numpy as np
|
||||
import torch
|
||||
|
||||
from sse_lib import DATA, DEVICE, SSE, write_csv, eval_ser_sse
|
||||
from exp_full import hadamard, get_model, eval_ser_eve, eve_wrong_mask
|
||||
from exp_full import (hadamard, get_model, base_keys, eval_ser_eve,
|
||||
eve_wrong_mask)
|
||||
from exp_kpa import collect_known_plaintext, solve_keys
|
||||
|
||||
SEED = 5150
|
||||
@@ -53,13 +54,6 @@ BLOCKS = 24
|
||||
FRAMES = 300_000
|
||||
|
||||
|
||||
def base_keys(U: int, Lp: int) -> torch.Tensor:
|
||||
"""The fixed orthogonal key set the codebook is trained around. Row 0
|
||||
of the Sylvester construction is the all-ones vector, which any
|
||||
adversary can write down, so the users take rows 1 to U."""
|
||||
return torch.tensor(hadamard(Lp)[1:U + 1], dtype=torch.float32)
|
||||
|
||||
|
||||
def kdf_invariant(seed: int, block: int, U: int, Lp: int):
|
||||
"""Derive one block's key material from the invariance group."""
|
||||
rng = np.random.default_rng([seed, block])
|
||||
|
||||
Reference in New Issue
Block a user