diff --git a/code/check_consistency.py b/code/check_consistency.py index 9d231d7..689df64 100644 --- a/code/check_consistency.py +++ b/code/check_consistency.py @@ -47,15 +47,24 @@ lg = [float(x["legit"]) for x in sn] om = [float(x["oma"]) for x in sn] rel = [(a - b) / b * 100 for a, b in zip(lg, om)] chk("legit below OMA at every SNR", max(rel) < 0, "max relative %+.2f%%" % max(rel)) -chk("gain 1.3 to 7.9 percent", - round(-max(rel), 1) == 1.3 and round(-min(rel), 1) == 7.9, +chk("gain 24 to 35 percent", + round(-max(rel)) == 24 and round(-min(rel)) == 35, "%.2f to %.2f percent" % (-max(rel), -min(rel))) -chk("1.3 and 7.9 in tex", "$1.3$ to\n$7.9$~percent" in tex or "$1.3$ to $7.9$~percent" in tex, +chk("24 and 35 in tex", "$24$ to\n$35$~percent" in tex or "$24$ to $35$~percent" in tex, "searched tex", needs_tex=True) ew = [float(x["eve_wrong"]) for x in sn] ch = float(sn[0]["chance"]) -chk("outsider at chance to 2e-5", max(abs(x - ch) for x in ew) < 2e-5, - "max deviation %.2e" % max(abs(x - ch) for x in ew)) +dev = max(abs(x - ch) for x in ew) +chk("outsider at chance to 3.5e-4", dev < 3.6e-4, "max deviation %.2e" % dev) +chk("3.5e-4 in tex", "$3.5\\times10^{-4}$" in tex, "searched tex", + needs_tex=True) + +# the main configuration's legitimate rate, the reference every later +# assertion compares against; taken from the curve the main +# configuration produced rather than looked up by key length +MAIN_LEGIT = [float(x["legit"]) for x in sn if float(x["snr_db"]) == 10][0] +chk("main legitimate 0.053", round(MAIN_LEGIT, 3) == 0.053, + "%.4f" % MAIN_LEGIT) # --- Fig. 3: key-length ratio ---------------------------------------- k = rows("sec_keylen.csv") @@ -70,11 +79,10 @@ chk("keys exactly orthogonal in the sweep", # --- Fig. 4: jamming -------------------------------------------------- g = col("sec_jam_gap.csv", "gap_db") -chk("gap 5.5-6.3 dB", round(min(g), 1) == 5.5 and round(max(g), 1) == 6.3, +chk("gap 10.1-11.1 dB", round(min(g), 1) == 10.1 and round(max(g), 1) == 11.1, "%.3f to %.3f" % (min(g), max(g))) lin = (10 ** (min(g) / 10), 10 ** (max(g) / 10)) -chk("about four times power", lin[0] < 4.5 and lin[1] > 3.4, - "%.2f to %.2f" % lin) +chk("more than ten times power", lin[0] > 10.0, "%.2f to %.2f" % lin) j = rows("sec_jam_cmp.csv") dmax = max(abs(float(r["blind"]) - float(r["perm_blind"])) for r in j) chk("within 0.002", dmax <= 0.002, "%.5f" % dmax) @@ -83,32 +91,40 @@ chk("no stale 8.1 dB", "$8.1$~dB" not in tex, "searched tex", needs_tex=True) # --- Fig. 6: brute force --------------------------------------------- b = rows("sec_brute_cmp.csv") sm = float(b[-1]["ser_mask"]) -chk("brute 0.59 at 1e6", round(sm, 2) == 0.59, "%.4f" % sm) -chk("0.59 in tex", "$0.59$" in tex, "searched tex", needs_tex=True) -pad0 = next((x["K"] for x in b if float(x["ser_pad"]) < 0.27), None) +chk("brute 0.67 at 1e6", round(sm, 2) == 0.67, "%.4f" % sm) +chk("0.67 in tex", "$0.67$" in tex, "searched tex", needs_tex=True) +closed = (ch - sm) / (ch - MAIN_LEGIT) +chk("brute closes about a third", 0.30 < closed < 0.40, "%.3f" % closed) +bf = float(b[-1]["best_frac"]) * 100 +chk("permutation 3.4 percent of positions", round(bf, 1) == 3.4, "%.2f" % bf) +pad0 = next((x["K"] for x in b if float(x["ser_pad"]) < 0.1), None) chk("index cipher collapses at 65536", pad0 == "65536", str(pad0)) # --- Fig. 7: known plaintext ----------------------------------------- kp = rows("kpa.csv") -legit = float([x for x in k if int(x["L"]) == 16][0]["legit_ser"]) +legit = MAIN_LEGIT thr = legit * 1.02 first20 = next((x["n_frames"] for x in kp if int(x["snr_db"]) == 20 and float(x["eve_ser"]) <= thr), None) first10 = next((x["n_frames"] for x in kp if int(x["snr_db"]) == 10 and float(x["eve_ser"]) <= thr), None) -chk("KPA five frames at 20 dB", first20 == "5", "first N = %s" % first20) -chk("KPA twenty-four frames at 10 dB", first10 == "24", "first N = %s" % first10) +chk("KPA three frames at 20 dB", first20 == "3", "first N = %s" % first20) +chk("KPA ten frames at 10 dB", first10 == "10", "first N = %s" % first10) +kp0 = [x for x in kp if int(x["snr_db"]) == 0] +w0 = float(kp0[-1]["eve_ser"]) / legit +chk("0 dB no longer holds", w0 < 1.03, "64 frames reach %.3f of legitimate" % w0) pk = rows("pkpa.csv") p6 = float([x for x in pk if x["n_frames"] == "6"][0]["eve_ser"]) -chk("perm KPA at N=6 near its own 0.258", abs(p6 - 0.258) < 0.005, "%.4f" % p6) +chk("perm KPA at N=6 near its own legitimate", + abs(p6 - MAIN_LEGIT) < 0.005, "%.4f" % p6) # --- refresh ---------------------------------------------------------- rs = {x["scheme"]: x for x in rows("refresh_summary.csv")} -chk("refresh 64.8 bits", - round(float(rs["Invariant"]["entropy_bits"]), 1) == 64.8, +chk("refresh 364.6 bits", + round(float(rs["Invariant"]["entropy_bits"]), 1) == 364.6, "%.3f" % float(rs["Invariant"]["entropy_bits"])) -chk("fixed key 15.0 bits", - round(float(rs["None (fixed key)"]["entropy_bits"]), 1) == 15.0, +chk("fixed key 23.8 bits", + round(float(rs["None (fixed key)"]["entropy_bits"]), 1) == 23.8, "%.4f" % float(rs["None (fixed key)"]["entropy_bits"])) chk("invariant refresh free", abs(float(rs["Invariant"]["legit"]) - float(rs["None (fixed key)"]["legit"])) @@ -119,8 +135,8 @@ chk("invariant refresh free", import json st = json.loads((base / "data" / "real_sec_stats.json").read_text()) rec = st["recovery"]["28"] -chk("headline recovery 78 vs 76 percent", - round(rec["legit"] * 100) == 78 and round(rec["oma"] * 100) == 76, +chk("headline recovery 96 vs 93 percent", + round(rec["legit"] * 100) == 96 and round(rec["oma"] * 100) == 93, "%.1f vs %.1f" % (rec["legit"] * 100, rec["oma"] * 100)) chk("legit leads OMA at every point", all(st["recovery"][s]["legit"] > st["recovery"][s]["oma"] @@ -137,19 +153,23 @@ chk("L=8 crowding, proposal behind OMA", chk("0.949 and 0.685 in tex", "0.949" in tex and "0.685" in tex, "searched tex", needs_tex=True) -# the Fig. 2 inset plots this ratio, so its stated span must hold +# the OMA-to-proposed ratio the narration quotes sr = rows("sec_snr.csv") rt = [float(r["oma"]) / float(r["legit"]) for r in sr] -chk("inset ratio spans 1.01 to 1.09", 1.005 < min(rt) and max(rt) < 1.095, - "%.3f to %.3f" % (min(rt), max(rt))) +chk("ratio spans 1.32 to 1.54", round(min(rt), 2) == 1.32 + and round(max(rt), 2) == 1.54, "%.3f to %.3f" % (min(rt), max(rt))) # the three secrets named in the setup -chk("secret sizes UL=64, perm 64, pad 16", - all(t in tex for t in ["$UL=64$ key entries", - "one permutation of $64$ positions", +chk("secret sizes UL=256, perm 256, pad 16", + all(t in tex for t in ["$UL=256$ key entries", + "one permutation of $256$ positions", "$16$ pad\nbits per user"]), "searched tex", needs_tex=True) +chk("no stale d=64 configuration in tex", + "$d=64$ real dimensions" not in tex and "$d/U=16$" not in tex, + "searched tex", needs_tex=True) + # Fig. 5 shows the permutation curve tracking the mask curve sc = rows("sec_sens_cmp.csv") dv = max(abs(float(r["ser_mask"]) - float(r["ser_perm"])) for r in sc) diff --git a/code/diag_interference.py b/code/diag_interference.py index d37cc64..83a141f 100644 --- a/code/diag_interference.py +++ b/code/diag_interference.py @@ -1,12 +1,12 @@ # -*- coding: utf-8 -*- """Where does the legitimate advantage over OMA go? -An ideal M-ary receiver at the main configuration should reach 0.199 at -10 dB against the 0.275 of resource-matched OMA, a factor of 1.38, while -the system measures 0.257, a factor of 1.07. This script splits the -shortfall into its two causes: residual multi-user interference, which -orthogonal keys do not remove because masking is elementwise, and the -distance the trained unit codebook falls short of an orthogonal set. +The legitimate curve sits above the single-user M-ary bound, and this +script splits the distance into its two possible causes: residual +multi-user interference, which orthogonal keys need not remove because +masking is elementwise, and the distance the trained unit codebook falls +short of an orthogonal set. Run it against whichever configuration +exp_full.MAIN_D currently names. """ import math import sys @@ -17,7 +17,7 @@ import torch sys.path.insert(0, str(Path(__file__).resolve().parent)) import sse_lib as L from sse_lib import DEVICE, snr_to_sigma2, rayleigh_gain -from exp_full import main_model +from exp_full import main_model, oma_ser_keylen SNR_DB = 10.0 FRAMES = 400_000 @@ -80,8 +80,7 @@ def main(): print("user-0 SER, all four users transmitting : %.4f" % four) print("user-0 SER, other users silent : %.4f" % solo) print("OMA, resource matched (closed form) : %.4f" - % L.oma_ser([SNR_DB])[0]) - print("ideal 16-ary orthogonal (separate MC) : 0.1986") + % oma_ser_keylen(m.L, SNR_DB)) if __name__ == "__main__": diff --git a/code/diag_maskdegen.py b/code/diag_maskdegen.py new file mode 100644 index 0000000..8a8b96f --- /dev/null +++ b/code/diag_maskdegen.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +"""Does unconstrained key training still degenerate at the main configuration? + +The manuscript justifies fixing the keys by a measured failure: with the +keys free, training drives them to disjoint sparse supports, which is an +orthogonal slot allocation rather than a superposition, and which shrinks +the key space to the choice of a support. That was measured at d=64 and +has to be re-measured whenever the configuration moves, because it is +the reason the structured family is the main one. + +Reported per user key: the number of entries holding 99 percent of the +energy, and the pairwise overlap of those supports. A dense key spreads +its energy over most of the L entries and the supports coincide; a +degenerate one concentrates on a few and the supports are disjoint. +""" +import sys +from pathlib import Path + +import torch + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +from exp_full import get_model, main_model, MAIN_D + + +def support99(w): + """Smallest set of entries carrying 99 percent of the key energy.""" + e = w.pow(2) + order = torch.argsort(e, descending=True) + c = torch.cumsum(e[order], 0) / e.sum() + k = int((c < 0.99).sum()) + 1 + return set(order[:k].tolist()), k + + +def describe(name, W): + L = W.shape[1] + sups, ks = [], [] + for u in range(W.shape[0]): + sup, k = support99(W[u]) + sups.append(sup) + ks.append(k) + ov = [] + for i in range(len(sups)): + for j in range(i + 1, len(sups)): + ov.append(len(sups[i] & sups[j]) / max(1, min(len(sups[i]), + len(sups[j])))) + print("%-14s L=%3d 99%%-energy entries per key: %s " + "mean pairwise support overlap %.2f" + % (name, L, ks, sum(ov) / len(ov))) + + +def main(): + print("main configuration d=%d" % MAIN_D) + m_free = get_model(iters=4000) # keys learned, nothing frozen + describe("learned", m_free.masks().detach().cpu()) + m_fix = main_model() + describe("Walsh-Hadamard", m_fix.masks().detach().cpu()) + print() + print("A degenerate key set shows few entries per key and near-zero") + print("overlap; a dense one shows most entries and overlap near one.") + + +if __name__ == "__main__": + main() diff --git a/code/diag_orthobook.py b/code/diag_orthobook.py index adf4b7d..282e9ee 100644 --- a/code/diag_orthobook.py +++ b/code/diag_orthobook.py @@ -1,11 +1,11 @@ # -*- coding: utf-8 -*- """Does an orthogonal unit codebook recover the shortfall? -diag_interference shows the gap to the ideal M-ary receiver is not +diag_interference shows the gap to the single-user M-ary bound is not multi-user interference but the geometry of the trained unit codebook, -whose Gram matrix carries a root-mean-square off-diagonal of 0.45 where -an orthogonal set would carry zero. Vu = L = 16 admits an exactly -orthogonal set, so this measures what installing one buys. +whose Gram matrix carries a large root-mean-square off-diagonal where an +orthogonal set would carry zero. Vu <= L admits an exactly orthogonal +set, so this measures what installing one buys. Two orthogonal sets are tried, because the choice is not free. The Walsh-Hadamard set collides with the keys: the rows are closed under the @@ -22,7 +22,7 @@ import torch sys.path.insert(0, str(Path(__file__).resolve().parent)) import sse_lib as L from sse_lib import DEVICE, SSE -from exp_full import hadamard, base_keys +from exp_full import hadamard, base_keys, oma_ser_keylen, MAIN_D from diag_interference import ser SNR = [0.0, 10.0, 20.0] @@ -39,13 +39,13 @@ def fixed_model(B, P=4, vu=16, d=64, U=4): return m -def hadamard_book(vu=16, Lp=16): +def hadamard_book(vu=16, Lp=MAIN_D // 4): B = torch.zeros(vu, Lp) B[:, :vu] = torch.tensor(hadamard(vu).copy(), dtype=torch.float32) return B -def random_ortho_book(vu=16, Lp=16, seed=7): +def random_ortho_book(vu=16, Lp=MAIN_D // 4, seed=7): g = torch.Generator().manual_seed(seed) A = torch.randn(Lp, Lp, generator=g) Q, _ = torch.linalg.qr(A) @@ -68,13 +68,14 @@ def main(): % ("unit codebook", "max|off|", "0 dB", "10 dB", "20 dB")) report("Walsh-Hadamard", fixed_model(hadamard_book())) report("random orthogonal", fixed_model(random_ortho_book())) - print("%-22s %-10s %-9s %-9s %-9s" - % ("trained (paper)", "0.887", "0.8822", "0.2576", "0.0307")) + from exp_full import main_model + report("trained", main_model()) + Lp = MAIN_D // 4 print("%-22s %-10s %-9s %-9s %-9s" % ("OMA, resource matched", "-", - "%.4f" % L.oma_ser([0.0])[0], - "%.4f" % L.oma_ser([10.0])[0], - "%.4f" % L.oma_ser([20.0])[0])) + "%.4f" % oma_ser_keylen(Lp, 0.0), + "%.4f" % oma_ser_keylen(Lp, 10.0), + "%.4f" % oma_ser_keylen(Lp, 20.0))) @@ -97,7 +98,7 @@ def solo_check(): print("%-22s %-12.4f %-12.4f" % (name, ser(m, 10.0, FRAMES, solo=True), ser(m, 10.0, FRAMES, solo=False))) - print("single-user ideal M-ary bound (separate MC): 0.1986") + print("(solo isolates the candidate set from the superposition)") if __name__ == "__main__": diff --git a/code/exp_full.py b/code/exp_full.py index f307a04..bb3fd7a 100644 --- a/code/exp_full.py +++ b/code/exp_full.py @@ -2,7 +2,7 @@ Reuses the SSE transmit/receive core from sse_lib.py and adds an eavesdropper receiver, a jammer channel, and structured mask families. -Main configuration d=64, P=4, Vu=16 (V=Vu^P=65,536), U=4 users, matching +Main configuration d=256, P=4, Vu=16 (V=Vu^P=65,536), U=4 users, matching the language-model token vocabulary scale. Stages (each writes a CSV to ../data; figures come from replot_security.py @@ -136,7 +136,11 @@ def eve_wrong_mask(U, Lp, seed): return W / W.norm(dim=1, keepdim=True) * math.sqrt(Lp) -def get_model(P=4, vu=16, d=64, U=4, iters=4000, seed=1, freeze_W=None, tag=""): +MAIN_D = 256 # embedding dimension of the main configuration + + +def get_model(P=4, vu=16, d=MAIN_D, U=4, iters=4000, seed=1, + freeze_W=None, tag=""): """Train an SSE model, optionally with fixed (frozen) masks.""" set_seed(seed) m = SSE(P=P, vu=vu, d=d, users=U).to(DEVICE) @@ -169,7 +173,7 @@ def base_keys(U: int, Lp: int) -> torch.Tensor: return torch.tensor(H[1:U + 1, :Lp].copy(), dtype=torch.float32) -def main_model(iters=4000, P=4, vu=16, d=64, U=4): +def main_model(iters=4000, P=4, vu=16, d=MAIN_D, U=4): """The main configuration used by every stage below. The keys are frozen to the structured Walsh-Hadamard family rather @@ -195,7 +199,7 @@ def stage_A(): # conventional public-mask scheme: the eavesdropper holds the same # (public) masks and decodes exactly like a legitimate user eve_p = eval_ser_eve(m, m.masks().detach().cpu(), snr, frames=frames) - oma = oma_ser(snr, bits=int(math.log2(m.V))) + oma = [oma_ser_keylen(m.L, s, bits=int(math.log2(m.V))) for s in snr] chance = 1.0 - (1.0 / m.vu) ** m.P write_csv(DATA / "sec_snr.csv", ["snr_db", "legit", "eve_wrong", "eve_none", "eve_public", @@ -236,7 +240,7 @@ def train_sse_reg(m: SSE, iters=4000, batch=256, lr=3e-3, seed=1, return m -def get_model_reg(P=4, vu=16, d=64, U=4, iters=4000, seed=1): +def get_model_reg(P=4, vu=16, d=MAIN_D, U=4, iters=4000, seed=1): set_seed(seed) m = SSE(P=P, vu=vu, d=d, users=U).to(DEVICE) train_sse_reg(m, iters=iters, seed=seed) @@ -314,7 +318,7 @@ def stage_C(): def stage_D(): print("[D] mask families ...") - P, vu, d, U = 4, 16, 64, 4 + P, vu, d, U = 4, 16, MAIN_D, 4 Lp = d // P fams = {} # random fixed masks @@ -475,8 +479,7 @@ def stage_E(): # is public so the matched jammer remains buildable rows.append(("index_cipher", lg, chance, chance, jm2)) # S5 OMA digital, no encryption: open to everyone - from sse_lib import oma_ser - lg5 = oma_ser([10.0], bits=int(math.log2(m.V)))[0] + lg5 = oma_ser_keylen(m.L, 10.0, bits=int(math.log2(m.V))) rows.append(("oma_plain", lg5, lg5, lg5, float("nan"))) write_csv(DATA / "sec_compare.csv", @@ -688,7 +691,7 @@ def stage_J(): mask_arr = np.array([float(r["ser_mask"]) for r in cmp_rows]) perm_arr = np.array([float(r["ser_perm"]) for r in cmp_rows]) - d, L, V = 64, 16, 65536 + d, L, V = MAIN_D, MAIN_D // 4, 65536 # channel floor of the cipher receiver, read from the stage-I curve # at a fully known pad so both figures share one source lg1 = 1.0 - (1.0 - float(cmp_rows[-1]["ser_pad"])) @@ -702,9 +705,11 @@ def stage_J(): best_kappa = np.empty(trials) best_frac = np.empty(trials) for t in range(trials): - g = rng.standard_normal((K, L)) - g /= np.linalg.norm(g, axis=1, keepdims=True) - best_kappa[t] = np.abs(g[:, 0]).max() + # |first coordinate| of a uniform random unit vector in R^L: + # its square is Beta(1/2, (L-1)/2), so the best of K draws + # needs K scalars rather than K*L Gaussians + best_kappa[t] = np.sqrt(rng.beta(0.5, (L - 1) / 2.0, + size=K).max()) # permutation: fraction of fixed points, Binomial(d, 1/d) per # draw, so the best of K draws is the max of K such counts best_frac[t] = rng.binomial(d, 1.0 / d, size=K).max() / d @@ -726,14 +731,16 @@ def csv_rows(path): yield from _csv.DictReader(f) -def oma_ser_jammed(snr_db, jsr_db_list, bits=16, U=4, n_grid=4096): +def oma_ser_jammed(snr_db, jsr_db_list, bits=16, U=4, d=256, n_grid=4096): """OMA under a jammer that concentrates on the victim's slots. - An OMA user occupies d/U exclusive real dimensions that are public, - so a jammer needs no key to put all of its power there. With unit - energy per real dimension and a total jammer energy of rho times the - frame energy, concentrating on d/U of the d dimensions gives a - per-dimension jammer variance of U*rho. + An OMA user occupies L = d/U exclusive real dimensions that are + public, and drives its 16 index bits on 16 of them with the whole + allocation energy, an amplitude gain of sqrt(L/bits) per bit. A + jammer needs no key to put all of its power on those same public + dimensions. With unit energy per real dimension and a total jammer + energy of rho times the frame energy, concentrating on bits of the d + dimensions gives a per-dimension jammer variance of (d/bits)*rho. The jammer reaches the victim through its own Rayleigh channel, the same convention eval_scheme uses for every simulated scheme, so the @@ -746,11 +753,12 @@ def oma_ser_jammed(snr_db, jsr_db_list, bits=16, U=4, n_grid=4096): hj2 = h2.clone() # |hJ|^2 ~ Exp(1), independent h = h2.sqrt()[:, None] # (n,1) signal amplitude snr = 10.0 ** (snr_db / 10.0) + gain = math.sqrt((d / U) / bits) # antipodal amplitude out = [] for jsr_db in jsr_db_list: rho = 10.0 ** (jsr_db / 10.0) - var = (1.0 / snr + U * rho * hj2)[None, :] # (1,n) - arg = (h / var.sqrt()).clamp(0, 38) + var = (1.0 / snr + (d / bits) * rho * hj2)[None, :] # (1,n) + arg = (h * gain / var.sqrt()).clamp(0, 38) pe = 0.5 * torch.erfc(arg / math.sqrt(2.0)) # per-bit error out.append(float((1.0 - (1.0 - pe) ** bits).mean())) return out @@ -774,7 +782,8 @@ def stage_L(): gp = torch.Generator().manual_seed(11) perms = torch.randperm(d, generator=gp)[None].repeat(m.users, 1) jsr = [float(v) for v in range(-10, 21, 2)] - oma = oma_ser_jammed(10.0, jsr, bits=int(math.log2(m.V)), U=m.users) + oma = oma_ser_jammed(10.0, jsr, bits=int(math.log2(m.V)), + U=m.users, d=m.d) rows = [] for i, j in enumerate(jsr): blind = eval_scheme(m, 10.0, F, jam_w="blind", jsr_db=j) diff --git a/code/exp_real_sec.py b/code/exp_real_sec.py index d95e424..357a7f0 100644 --- a/code/exp_real_sec.py +++ b/code/exp_real_sec.py @@ -29,7 +29,7 @@ import torch import sse_lib as L from sse_lib import (DATA, DEVICE, SSE, rayleigh_gain, snr_to_sigma2, set_seed, write_csv) -from exp_full import main_model, eve_wrong_mask +from exp_full import main_model, eve_wrong_mask, MAIN_D SNR_GRID = [0, 4, 8, 12, 16, 20, 24, 28] # headline recovery is meaningful only where the legitimate user clears @@ -101,15 +101,22 @@ def wrong_keyed(model: SSE, digits_all, snr_db, seed, rx_masks=None, @torch.no_grad() -def wrong_oma(ids_all, snr_db, seed, bits=16): - """Antipodal signaling on the actual token bits, same frame energy.""" +def wrong_oma(ids_all, snr_db, seed, bits=16, d=256, users=4): + """Antipodal signaling on the actual token bits, same frame energy. + + The OMA user owns d/U exclusive dimensions for its 16 bits and puts + the whole allocation energy on them, so the antipodal amplitude + carries a factor sqrt((d/U)/bits) over the one-bit-per-dimension + case. Without it the reference would spend only a quarter of the + energy the proposed user spends.""" torch.manual_seed(seed) N, Uu = ids_all.shape b = ((ids_all[..., None] >> torch.arange(bits)) & 1).float() * 2 - 1 b = b.to(DEVICE) sigma = math.sqrt(1.0 / (10.0 ** (snr_db / 10.0))) + gain = math.sqrt((d / users) / bits) h = rayleigh_gain((N, Uu, 1)) - y = h * b + sigma * torch.randn(N, Uu, bits, device=DEVICE) + y = gain * h * b + sigma * torch.randn(N, Uu, bits, device=DEVICE) return ((y * b) < 0).any(dim=2).cpu() @@ -136,7 +143,7 @@ def main(): f"distinct tokens, max id {int(ids_all.max())}") # keys and codebook trained on uniform indices, reused unchanged - model = main_model(P=P_MAX, vu=VU, d=64, U=U) + model = main_model(P=P_MAX, vu=VU, d=MAIN_D, U=U) model.eval() eve_m = eve_wrong_mask(U, model.L, seed=20260813) # outsider diff --git a/code/exp_refresh.py b/code/exp_refresh.py index e817744..650e345 100644 --- a/code/exp_refresh.py +++ b/code/exp_refresh.py @@ -26,7 +26,7 @@ orthogonal. Two constructions are compared here. the codebook together, which is a relabeling, log2(L!) bits 3. a permutation of which user holds which row, log2(U!) bits - At L=16 and U=4 that is 16 + 44.25 + 4.58 = 64.8 bits per block, and + At L=64 and U=4 that is 64 + 296.0 + 4.58 = 364.6 bits per block, and each transformation is verified below to leave the legitimate error rate unchanged. @@ -45,7 +45,7 @@ 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, base_keys, eval_ser_eve, +from exp_full import (MAIN_D, hadamard, get_model, base_keys, eval_ser_eve, eve_wrong_mask) from exp_kpa import collect_known_plaintext, solve_keys @@ -92,7 +92,7 @@ def install(model: SSE, keys: torch.Tensor, codebook: torch.Tensor, def main(): - P, VU, D, U = 4, 16, 64, 4 + P, VU, D, U = 4, 16, MAIN_D, 4 Lp = D // P print(f"[K] refresh: L={Lp}, U={U}, " f"{entropy_bits(U, Lp):.1f} bits per block from the invariance group") diff --git a/code/replot_security.py b/code/replot_security.py index a8e8cd2..6279311 100644 --- a/code/replot_security.py +++ b/code/replot_security.py @@ -129,6 +129,24 @@ def save(fig, name, insets=()): raise RuntimeError( f"{name}: a data curve passes under the legend " f"box; move the legend or shrink it") + for t in ax.texts: + tb = t.get_window_extent() + if (lb.x0 < tb.x1 and tb.x0 < lb.x1 + and lb.y0 < tb.y1 and tb.y0 < lb.y1): + raise RuntimeError( + f"{name}: the annotation {t.get_text()!r} sits under " + f"the legend box; move one of them") + for t in ax.texts: + tb = t.get_window_extent() + for line in ax.get_lines(): + xy = line.get_xydata() + if len(xy) == 0: + continue + for px, py in ax.transData.transform(xy): + if tb.x0 <= px <= tb.x1 and tb.y0 <= py <= tb.y1: + raise RuntimeError( + f"{name}: a curve is drawn through the " + f"annotation {t.get_text()!r}; move it") for ins in insets: ib = ins.get_window_extent() for a in fig.axes: @@ -148,6 +166,53 @@ def save(fig, name, insets=()): print("[OK]", name) +def main_legit(snr_db="10"): + """The legitimate SER of the main configuration, read from the curve + the main configuration produced rather than looked up by key length.""" + for r in load("sec_snr.csv"): + if float(r["snr_db"]) == float(snr_db): + return float(r["legit"]) + raise KeyError("no %s dB row in sec_snr.csv" % snr_db) + + +def place_legend(ax, cands=("lower left", "center left", "center right", + "lower center", "upper right", "upper center", + "center", "lower right"), + sizes=(6.6, 6.2, 5.8, 5.4, 5.0)): + """Choose the location and font size whose box the fewest curve points + fall inside, scored on rendered geometry rather than guessed from the + data. The size sweep is what makes a long label set placeable: a + five-entry legend of full scheme names has no clear corner at the + default size on every figure.""" + best = None + for size in sizes: + for loc in cands: + leg = ax.legend(loc=loc, prop={"size": size}) + ax.figure.canvas.draw() + lb = leg.get_window_extent() + hits = 0 + for line in ax.get_lines(): + xy = line.get_xydata() + if len(xy) == 0: + continue + for px, py in ax.transData.transform(xy): + if lb.x0 <= px <= lb.x1 and lb.y0 <= py <= lb.y1: + hits += 1 + for t in ax.texts: + tb = t.get_window_extent() + if (lb.x0 < tb.x1 and tb.x0 < lb.x1 + and lb.y0 < tb.y1 and tb.y0 < lb.y1): + hits += 50 # an annotation hidden is worse than a + # few curve points clipped + if best is None or hits < best[2]: + best = (loc, size, hits) + if hits == 0: + ax.legend(loc=loc, prop={"size": size}) + return best + ax.legend(loc=best[0], prop={"size": best[1]}) + return best + + def fig_snr(): r = load("sec_snr.csv") x = col(r, "snr_db") @@ -167,22 +232,8 @@ def fig_snr(): ax.set_xlabel("SNR (dB)") ax.set_ylabel("SER") ax.set_xlim(min(x), max(x)) - ax.legend(loc="lower left") - - # the gap is a coding gain of a few percent, invisible against two - # decades of SER, so an inset reports it as a ratio - lg, om = col(r, "legit"), col(r, "oma") - ins = ax.inset_axes([0.57, 0.58, 0.39, 0.25]) - ins.plot(x, [o / l for l, o in zip(lg, om)], color=C_OMA, lw=1.0, - marker="^", ms=2.4, markevery=2) - ins.axhline(1.0, color="0.55", lw=0.6, ls="--") - ins.set_xlim(min(x), max(x)) - ins.set_ylim(0.995, 1.105) - ins.set_yticks([1.00, 1.05, 1.10]) - ins.set_xticks([0, 10, 20]) - ins.tick_params(labelsize=5.2, length=1.8, pad=1.0) - ins.set_title("OMA / proposed SER", fontsize=5.6, pad=1.5) - save(fig, "fig_sec_snr", insets=[ins]) + place_legend(ax) + save(fig, "fig_sec_snr") def fig_keylen(): @@ -204,7 +255,7 @@ def fig_keylen(): ax.set_xscale("log", base=2) # the curves sweep the upper-left to lower-right diagonal, leaving the # lower-left corner empty - ax.legend(loc="lower left") + place_legend(ax) save(fig, "fig_sec_keylen") @@ -228,14 +279,13 @@ def fig_jam(): ax.plot(x, col(r, "perm_blind"), color=C_EVE, marker="s", ls="-.", markevery=(me // 2, me), label=LBL["perm"] + ", blind", **OVER) nojam = float(load("sec_jam.csv")[0]["nojam"]) - ax.axhline(nojam, color=C_OMA, ls=(0, (1, 3)), lw=0.9) - ax.text(max(x) - 0.6, nojam + 0.02, LBL["nojam"], ha="right", - va="bottom", fontsize=7.4, color="#555555") + ax.axhline(nojam, color=C_OMA, ls=(0, (1, 3)), lw=0.9, + label=LBL["nojam"]) ax.set_xlabel("JSR (dB)") ax.set_ylabel("SER") ax.set_xlim(min(x), max(x)) - ax.set_ylim(0.2, 1.02) - ax.legend(loc="center right", bbox_to_anchor=(0.985, 0.47)) + ax.set_ylim(0.8 * nojam, 1.02) + place_legend(ax) save(fig, "fig_sec_jam") @@ -257,7 +307,7 @@ def fig_sens(): ax.set_xlabel("Fraction of the key recovered") ax.set_ylabel("Eavesdropper SER") ax.set_xlim(0, 1) - ax.legend(loc="lower left") + place_legend(ax) save(fig, "fig_sec_sens") @@ -273,13 +323,12 @@ def fig_brute(): label=LBL["pad"], **OVER) ax.semilogx(x, col(r, "ser_mask"), color=C_LEGIT, marker="o", ls="-", label=LBL["mask"]) - kl = load("sec_keylen.csv") - legit = float([q for q in kl if int(q["L"]) == 16][0]["legit_ser"]) + legit = main_legit() ax.axhline(legit, color=C_OMA, ls=":", lw=0.9, label=LBL["legit"]) ax.set_xlabel("Number of key guesses $K$") ax.set_ylabel("Eavesdropper SER") - ax.set_ylim(0.2, 1.05) - ax.legend(loc="lower left") + ax.set_ylim(0.8 * legit, 1.05) + place_legend(ax) save(fig, "fig_sec_brute") @@ -299,7 +348,7 @@ def fig_real(): ax.set_xlabel("SNR (dB)") ax.set_ylabel("TER") ax.set_xlim(min(x), max(x)) - ax.legend(loc="lower left") + place_legend(ax) save(fig, "fig_sec_real") @@ -325,10 +374,9 @@ def fig_kpa(): print("[skip] pkpa.csv not present yet") # legitimate reference measured with the SAME estimator as the # eavesdropper curves, namely the four-user average of eval_ser_sse - # at L=16, taken from sec_keylen.csv rather than from the user-1 - # convention of the scheme-comparison table - kl = load("sec_keylen.csv") - legit = float([r for r in kl if int(r["L"]) == 16][0]["legit_ser"]) + # in the main configuration, rather than the user-1 convention of the + # scheme-comparison table + legit = main_legit() ax.axhline(legit, color=C_OMA, ls=":", lw=0.9, label=LBL["legit"]) ax.set_xlabel("Known-plaintext frames $N$") ax.set_ylabel("Eavesdropper SER") @@ -336,7 +384,7 @@ def fig_kpa(): # the 0 dB curve sweeps the upper-right, so anchor the legend at the # top edge past the steep drops, above every curve at large N ax.set_ylim(top=1.18) - ax.legend(loc="upper right", bbox_to_anchor=(1.0, 1.04)) + place_legend(ax) save(fig, "fig_sec_kpa") diff --git a/code/sse_lib.py b/code/sse_lib.py index ee2a3bf..f825e92 100644 --- a/code/sse_lib.py +++ b/code/sse_lib.py @@ -35,7 +35,7 @@ DEVICE = torch.device("cuda" if torch.cuda.is_available() else "cpu") # ---------------------------------------------------------------------- # global configuration # ---------------------------------------------------------------------- -D = 64 # embedding dimension (real) +D = 256 # embedding dimension (real) U = 4 # users VU = 16 # unit codebook size P_MAX = 4 # periods for the main configuration, V = 16^4 = 65536 diff --git a/data/kpa.csv b/data/kpa.csv index 50adcdb..30ab0b7 100644 --- a/data/kpa.csv +++ b/data/kpa.csv @@ -1,43 +1,43 @@ snr_db,n_frames,kappa,eve_ser -0,1,0.2506237943,0.998554125 -0,2,0.591645799,0.9303495 -0,3,0.7079962283,0.8537115 -0,4,0.7998725504,0.767802875 -0,5,0.850597313,0.684796 -0,6,0.8767687038,0.6361745 -0,8,0.9171553269,0.520736875 -0,10,0.936547631,0.455442125 -0,12,0.9516445503,0.400028875 -0,16,0.9666089579,0.344806875 -0,24,0.9785378739,0.3075 -0,32,0.9843035683,0.29181625 -0,48,0.989774394,0.27860675 -0,64,0.9924546674,0.272548625 -10,1,0.3695881277,0.986553125 -10,2,0.880338943,0.55928725 -10,3,0.9474378824,0.4139 -10,4,0.9692240357,0.339236625 -10,5,0.9786081538,0.3095635 -10,6,0.9846392065,0.292632375 -10,8,0.9900667578,0.278431375 -10,10,0.9934557095,0.270305 -10,12,0.9948186457,0.267862125 -10,16,0.9963249952,0.264728875 -10,24,0.9976470947,0.26182575 -10,32,0.998370938,0.260598625 -10,48,0.9989489555,0.259409125 -10,64,0.9992221802,0.258898125 -20,1,0.6164694946,0.807168125 -20,2,0.9846389949,0.29904075 -20,3,0.9948147267,0.268233 -20,4,0.9972566783,0.262752625 -20,5,0.9983854383,0.260594375 -20,6,0.9988236457,0.259794 -20,8,0.9991258562,0.259128625 -20,10,0.9993467629,0.258526 -20,12,0.9994955555,0.25809525 -20,16,0.9996308014,0.258118625 -20,24,0.9997742459,0.25761825 -20,32,0.9998249143,0.25777975 -20,48,0.9998879731,0.257699625 -20,64,0.9999218643,0.257602125 +0,1,0.12352509,0.99831525 +0,2,0.5251209017,0.667321375 +0,3,0.7064555086,0.355686125 +0,4,0.8180372834,0.153838875 +0,5,0.851283282,0.11704475 +0,6,0.8886688635,0.08632125 +0,8,0.9222010329,0.071005375 +0,10,0.9411106989,0.065095875 +0,12,0.9511190057,0.062455 +0,16,0.9647030935,0.05952275 +0,24,0.9768752605,0.057202125 +0,32,0.9825294316,0.056090625 +0,48,0.9889646709,0.054879875 +0,64,0.9916648567,0.05434675 +10,1,0.1945309106,0.974309875 +10,2,0.8957558513,0.09464225 +10,3,0.9584526971,0.061422375 +10,4,0.9749164343,0.057618875 +10,5,0.9840320468,0.055860125 +10,6,0.9870633438,0.055293125 +10,8,0.9915206015,0.0545015 +10,10,0.993655026,0.054026875 +10,12,0.9947692543,0.05398375 +10,16,0.9961483911,0.05369625 +10,24,0.9975565806,0.0534085 +10,32,0.9982031986,0.053507125 +10,48,0.9988671347,0.053128875 +10,64,0.9991624668,0.05316875 +20,1,0.4000679564,0.75409875 +20,2,0.9798189059,0.05720575 +20,3,0.9945692539,0.053949375 +20,4,0.9968175337,0.053615375 +20,5,0.9978483543,0.053312375 +20,6,0.9984246671,0.053056125 +20,8,0.9989141598,0.053266375 +20,10,0.9992120922,0.053062 +20,12,0.9993801698,0.0532745 +20,16,0.9995821282,0.053144375 +20,24,0.9997434661,0.0532995 +20,32,0.9998255745,0.053043125 +20,48,0.9998879209,0.05301875 +20,64,0.9999150276,0.05316375 diff --git a/data/pkpa.csv b/data/pkpa.csv index 238d796..a306ecb 100644 --- a/data/pkpa.csv +++ b/data/pkpa.csv @@ -1,17 +1,17 @@ n_frames,perm_frac,eve_ser -1,0.2545572917,0.9990345 -2,0.7299479167,0.8108416667 -3,0.9266927083,0.4801366667 -4,0.9885416667,0.3021165 -5,0.9955729167,0.2737706667 -6,0.9997395833,0.2587145 -7,1,0.2575458333 -8,1,0.2575538333 -10,1,0.2575 -12,1,0.2576706667 -16,1,0.2577931667 -20,1,0.2578143333 -24,1,0.2574975 -32,1,0.2576283333 -48,1,0.2576288333 -64,1,0.2575123333 +1,0.07789713542,0.9998223333 +2,0.4416992188,0.8047886667 +3,0.8402018229,0.2011701667 +4,0.9570963542,0.078129 +5,0.9874674479,0.058565 +6,0.998828125,0.05340366667 +7,0.9992838542,0.05337483333 +8,0.9998697917,0.05304583333 +10,1,0.05286516667 +12,1,0.05297066667 +16,1,0.0530215 +20,1,0.05311583333 +24,1,0.05297233333 +32,1,0.05296366667 +48,1,0.05290466667 +64,1,0.052919 diff --git a/data/real_sec_stats.json b/data/real_sec_stats.json index 136583a..f362aff 100644 --- a/data/real_sec_stats.json +++ b/data/real_sec_stats.json @@ -10,22 +10,22 @@ "headline_runs": 4, "recovery": { "20": { - "legit": 0.22112422997946612, + "legit": 0.7507700205338809, "eve": 0.0, "insider": 0.0, - "oma": 0.19815195071868583 + "oma": 0.6463039014373717 }, "24": { - "legit": 0.5395277207392197, + "legit": 0.8966889117043121, "eve": 0.0, "insider": 0.0, - "oma": 0.5160420944558521 + "oma": 0.8390657084188912 }, "28": { - "legit": 0.7804158110882957, + "legit": 0.9588039014373717, "eve": 0.0, "insider": 0.0, - "oma": 0.7583418891170431 + "oma": 0.9319815195071869 } } } \ No newline at end of file diff --git a/data/real_sec_ter.csv b/data/real_sec_ter.csv index 9f02a43..72c3d6d 100644 --- a/data/real_sec_ter.csv +++ b/data/real_sec_ter.csv @@ -1,9 +1,9 @@ snr_db,ter_legit,ter_eve,ter_insider,ter_oma -0,0.8789390651,0.9999649972,0.9990586747,0.8927576706 -4,0.6421088687,0.9999537463,0.9975273022,0.6680284423 -8,0.3651042083,0.9999649972,0.9957384091,0.3898399372 -12,0.1726488119,0.9999537463,0.9944920594,0.1874349948 -16,0.07386590927,0.9999337447,0.9938557585,0.08109648772 -20,0.0309237239,0.9999362449,0.9936069886,0.03380395432 -24,0.01248849908,0.9999324946,0.9934769782,0.01364484159 -28,0.004962897032,0.999924994,0.9934394752,0.005405432435 +0,0.3971355208,0.9997737319,0.9959146732,0.5232856128 +4,0.1907565105,0.9995762161,0.9945970678,0.2740881771 +8,0.08179654372,0.9993636991,0.9939007621,0.123424874 +12,0.03395771662,0.9992336887,0.9936032383,0.05201666133 +16,0.01357608609,0.9991099288,0.9934969798,0.02118419474 +20,0.005565445236,0.9991286803,0.9934507261,0.008630690455 +24,0.002230178414,0.9991974358,0.9934207237,0.003452776222 +28,0.0008825706056,0.9992486899,0.9934144732,0.001385110809 diff --git a/data/refresh.csv b/data/refresh.csv index fdc7381..13d13c0 100644 --- a/data/refresh.csv +++ b/data/refresh.csv @@ -1,25 +1,25 @@ block,legit_invariant,legit_naive,eve_invariant,eve_naive -0,0.25722,0.9825916667,0.9998433333,0.999975 -1,0.257695,0.7424366667,0.9997983333,0.998495 -2,0.2575741667,0.8482983333,0.9999891667,0.9999966667 -3,0.2574108333,0.7789558333,0.9997116667,0.9998625 -4,0.2578316667,0.619975,0.9978516667,0.9999391667 -5,0.2575941667,0.6579858333,0.99976,0.9997716667 -6,0.2568508333,0.7788175,0.9997783333,0.9999341667 -7,0.2574466667,0.6938383333,0.9999633333,0.9989225 -8,0.2568958333,0.8399391667,0.9983208333,0.99991 -9,0.2572158333,0.6549775,0.9999891667,0.9999816667 -10,0.2575733333,0.4789683333,0.9995841667,0.9995091667 -11,0.2569025,0.6551183333,0.999925,0.9999741667 -12,0.2582966667,0.8479616667,0.9997208333,0.9999233333 -13,0.2579675,0.6551841667,0.9999758333,0.9996183333 -14,0.2572158333,0.6582558333,1,0.999915 -15,0.2578983333,0.4791275,0.9994441667,0.9999233333 -16,0.2570508333,0.7614066667,0.9998991667,0.9993675 -17,0.2576233333,0.8045108333,0.9994666667,0.9999475 -18,0.2571108333,0.8073525,0.9997158333,0.999985 -19,0.257955,0.6890983333,0.9992433333,0.9994441667 -20,0.25777,0.5282241667,0.9981,0.9992808333 -21,0.2568141667,0.7426725,0.9999566667,0.999965 -22,0.2578066667,0.6547841667,0.9997633333,0.9990433333 -23,0.2575241667,0.68849,0.9998791667,0.99982 +0,0.05306083333,0.08038333333,0.9999508333,0.9999683333 +1,0.05273166667,0.1074658333,0.9999333333,0.9998433333 +2,0.05277666667,0.1060591667,0.9996633333,0.9999733333 +3,0.053255,0.1242133333,0.9999908333,0.9999083333 +4,0.0530325,0.1259233333,0.99994,0.99886 +5,0.05305,0.1073991667,0.9976566667,0.9998183333 +6,0.05290833333,0.10623,0.9999625,0.9999325 +7,0.05312583333,0.1075391667,0.9999916667,0.9998858333 +8,0.05348333333,0.1069425,0.99999,0.9981908333 +9,0.05322833333,0.1036133333,0.9999966667,0.9998841667 +10,0.05320666667,0.09874583333,0.99966,0.9998675 +11,0.05308583333,0.0826975,0.999985,0.996885 +12,0.05284416667,0.1512316667,0.99997,0.9999375 +13,0.05285916667,0.2648991667,0.9999108333,0.9999933333 +14,0.05330416667,0.1010783333,0.9996125,0.99999 +15,0.0528175,0.1194066667,0.99961,0.9998841667 +16,0.05312166667,0.1301383333,0.9990241667,0.9999683333 +17,0.05278,0.1393716667,0.9994875,0.9997066667 +18,0.05314333333,0.1566191667,0.9998908333,0.9999208333 +19,0.05337666667,0.1165041667,0.9990191667,0.9999958333 +20,0.05288,0.1321825,0.99927,0.9996708333 +21,0.05266333333,0.1290883333,0.9996075,0.9999233333 +22,0.05324583333,0.09973166667,0.9991875,0.9997808333 +23,0.05300833333,0.1198525,0.9979583333,0.999895 diff --git a/data/refresh_kpa.csv b/data/refresh_kpa.csv index 9a8367e..5a60ff5 100644 --- a/data/refresh_kpa.csv +++ b/data/refresh_kpa.csv @@ -1,7 +1,7 @@ n_frames,ser_same_block,ser_next_block -2,0.27116875,0.9988428125 -4,0.260861875,0.998726875 -8,0.2588515625,0.99869375 -16,0.2586403125,0.998735625 -32,0.2571871875,0.9986965625 -64,0.25772125,0.99869375 +2,0.0910125,0.999634375 +4,0.0540171875,0.999456875 +8,0.0532996875,0.9995453125 +16,0.0532596875,0.9995365625 +32,0.0530225,0.999555 +64,0.053059375,0.9995303125 diff --git a/data/refresh_summary.csv b/data/refresh_summary.csv index 3418eab..01a9e4d 100644 --- a/data/refresh_summary.csv +++ b/data/refresh_summary.csv @@ -1,4 +1,4 @@ scheme,legit,eve,entropy_bits -None (fixed key),0.2573025,0.9999908333,14.99964774 -Fresh orthogonal keys,0.7103737847,0.9996877083,14.99964774 -Invariant,0.2574685069,0.99957,64.83510297 +None (fixed key),0.05300666667,0.9997075,23.76910417 +Fresh orthogonal keys,0.1215548611,0.9996535069,23.76910417 +Invariant,0.05304121528,0.9995528819,364.5801064 diff --git a/data/sec_brute.csv b/data/sec_brute.csv index b63b4ca..cb4d289 100644 --- a/data/sec_brute.csv +++ b/data/sec_brute.csv @@ -1,29 +1,29 @@ L,K,best_rho,eve_ser -8,1,0.2918601623,0.9945244994 -8,10,0.6307837307,0.9550597921 -8,100,0.8190062809,0.8147158732 -8,1000,0.9077793813,0.5723297059 -8,10000,0.9535904264,0.3866372342 -8,100000,0.9757162716,0.3157766639 -8,1000000,0.9872786315,0.2845244539 -16,1,0.2228791779,0.9990085712 -16,10,0.4570522499,0.9943536935 -16,100,0.6321070191,0.9769163907 -16,1000,0.7417848118,0.9311708657 -16,10000,0.8164950053,0.8399011082 -16,100000,0.8673534005,0.7274791752 -16,1000000,0.9048131336,0.5915534824 -32,1,0.1399813941,0.999821061 -32,10,0.3205750013,0.9991354579 -32,100,0.4660256564,0.996404209 -32,1000,0.5620279439,0.991343747 -32,10000,0.6393936736,0.9815239297 -32,100000,0.6993164916,0.9634132739 -32,1000000,0.7479539255,0.9349306487 -64,1,0.0987436915,0.9999096477 -64,10,0.2263401688,0.9997303409 -64,100,0.3389944824,0.9991750164 -64,1000,0.4155608514,0.9981802181 -64,10000,0.4757575011,0.9967597446 -64,100000,0.5299797378,0.994275692 -64,1000000,0.5741312045,0.9910114047 +8,1,0.2918601623,0.9066920085 +8,10,0.6307837307,0.5210311818 +8,100,0.8190062809,0.1464367404 +8,1000,0.9077793813,0.07579906172 +8,10000,0.9535904264,0.06202610787 +8,100000,0.9757162716,0.05732935088 +8,1000000,0.9872786315,0.05494886822 +16,1,0.2228791779,0.9678674777 +16,10,0.4570522499,0.8428517805 +16,100,0.6321070191,0.5220053649 +16,1000,0.7417848118,0.2575339696 +16,10000,0.8164950053,0.1355546081 +16,100000,0.8673534005,0.0917885764 +16,1000000,0.9048131336,0.07564447448 +32,1,0.1399813941,0.9955028264 +32,10,0.3205750013,0.9696107631 +32,100,0.4660256564,0.8637137122 +32,1000,0.5620279439,0.694146855 +32,10000,0.6393936736,0.505025831 +32,100000,0.6993164916,0.3443445207 +32,1000000,0.7479539255,0.2384664588 +64,1,0.0987436915,0.9985051621 +64,10,0.2263401688,0.9932755581 +64,100,0.3389944824,0.9716186298 +64,1000,0.4155608514,0.9321217644 +64,10000,0.4757575011,0.8672182737 +64,100000,0.5299797378,0.7724368738 +64,1000000,0.5741312045,0.6658700504 diff --git a/data/sec_brute_cmp.csv b/data/sec_brute_cmp.csv index ed6d503..d18f9c9 100644 --- a/data/sec_brute_cmp.csv +++ b/data/sec_brute_cmp.csv @@ -1,15 +1,15 @@ K,ser_mask,ser_perm,ser_pad,best_kappa,best_frac -1,0.9993544844,0.9999768274,0.9999886992,0.1909643153,0.0160546875 -3,0.997243306,0.9999681491,0.9999660976,0.3326517476,0.0281640625 -10,0.9938504211,0.999957483,0.9998869919,0.450762326,0.043046875 -30,0.9845428901,0.9999498125,0.9996609756,0.5560672497,0.05375 -100,0.9739208985,0.999941526,0.9988699188,0.6290900875,0.0653125 -300,0.9540369033,0.9999351712,0.9966097565,0.688703621,0.0741796875 -1000,0.9234069553,0.9999275566,0.9886991882,0.7427389508,0.0848046875 -3000,0.884658701,0.9999206979,0.9660975647,0.7822538913,0.094375 -10000,0.8305012761,0.999914875,0.8869918823,0.8169040678,0.1025 -30000,0.7833179277,0.9999088001,0.660975647,0.8434367197,0.1109765625 -65536,0.7451236968,0.9999050488,0.25939,0.8592030095,0.1162109375 -100000,0.7206406422,0.9999030892,0.25939,0.8678447033,0.1189453125 -300000,0.6546171753,0.9998972103,0.25939,0.8874619916,0.1271484375 -1000000,0.5948033388,0.9998918073,0.25939,0.9034448904,0.1346875 +1,0.9975735971,0.9999452686,0.9999855534,0.1060014706,0.00373046875 +3,0.9939382519,0.999917898,0.9999566603,0.1737056038,0.006982421875 +10,0.9885799467,0.999885267,0.9998555344,0.23239142,0.010859375 +30,0.9784526651,0.9998643897,0.9995666031,0.2887248616,0.01333984375 +100,0.9639408295,0.9998383342,0.9985553436,0.3406099894,0.01643554687 +300,0.9496426441,0.9998154842,0.9956660309,0.3763731975,0.01915039062 +1000,0.9229213733,0.9997945248,0.9855534363,0.4126070285,0.021640625 +3000,0.8778012069,0.9997791545,0.9566603088,0.4459480988,0.02346679688 +10000,0.8268693567,0.9997572087,0.8555343628,0.4766569871,0.02607421875 +30000,0.7835337024,0.9997399479,0.5666030884,0.502465176,0.028125 +65536,0.7563541371,0.9997287696,0.05323,0.5185642041,0.029453125 +100000,0.7390554126,0.9997216187,0.05323,0.5289073023,0.03030273438 +300000,0.6980880931,0.9997044401,0.05323,0.5526416305,0.03234375 +1000000,0.6655177674,0.9996913713,0.05323,0.5720463815,0.03389648438 diff --git a/data/sec_compare.csv b/data/sec_compare.csv index 212edc8..b2e8360 100644 --- a/data/sec_compare.csv +++ b/data/sec_compare.csv @@ -1,6 +1,6 @@ scheme,legit_ser,eve_out,eve_in,jam0_ser -proposed,0.257845,1,0.9999775,0.7719425 -public_mask,0.257845,0.257845,0.257845,0.91675 -perm_key,0.2580675,0.99999,0.2580675,0.7721175 -index_cipher,0.257845,0.9999847412,0.9999847412,0.91675 -oma_plain,0.2747696909,0.2747696909,0.2747696909,nan +proposed,0.0529425,0.9999925,0.9999825,0.3634175 +public_mask,0.0529425,0.0529425,0.0529425,0.83882 +perm_key,0.0528525,0.9999925,0.0528525,0.36425 +index_cipher,0.0529425,0.9999847412,0.9999847412,0.83882 +oma_plain,0.08056383667,0.08056383667,0.08056383667,nan diff --git a/data/sec_jam.csv b/data/sec_jam.csv index eadf12c..baf4221 100644 --- a/data/sec_jam.csv +++ b/data/sec_jam.csv @@ -1,8 +1,8 @@ jsr_db,blind,matched,nojam --10,0.41313,0.602758,0.257308 --5,0.583948,0.79449,0.257308 -0,0.772444,0.917424,0.257308 -5,0.902872,0.97136,0.257308 -10,0.964788,0.990494,0.257308 -15,0.988114,0.99704,0.257308 -20,0.99617,0.999024,0.257308 +-10,0.100512,0.370894,0.053384 +-5,0.186312,0.629542,0.053384 +0,0.364964,0.838068,0.053384 +5,0.610574,0.94122,0.053384 +10,0.816206,0.980862,0.053384 +15,0.929192,0.993638,0.053384 +20,0.97542,0.997986,0.053384 diff --git a/data/sec_jam_cmp.csv b/data/sec_jam_cmp.csv index 33689b5..38c3343 100644 --- a/data/sec_jam_cmp.csv +++ b/data/sec_jam_cmp.csv @@ -1,17 +1,17 @@ jsr_db,blind,matched,perm_blind,oma_targeted --10,0.4144466667,0.6026633333,0.4142366667,0.6401244609 --8,0.47322,0.6827466667,0.4749333333,0.7152454705 --6,0.5445766667,0.7588666667,0.54569,0.7840240868 --4,0.6223533333,0.8241966667,0.6225633333,0.8424432091 --2,0.7009733333,0.8757933333,0.7011833333,0.8888838836 -0,0.7724933333,0.9165966667,0.7720633333,0.9237966241 -2,0.8337533333,0.9441633333,0.8322966667,0.9488822017 -4,0.88268,0.9645966667,0.88304,0.9662811712 -6,0.9196833333,0.97682,0.9193566667,0.9780307416 -8,0.9457333333,0.9852033333,0.9457433333,0.9858109157 -10,0.96429,0.9906933333,0.96467,0.9908905586 -12,0.97734,0.9942133333,0.9765066667,0.9941743502 -14,0.98498,0.9962466667,0.9854933333,0.9962827887 -16,0.9904633333,0.9975066667,0.99042,0.9976304229 -18,0.99391,0.99848,0.99382,0.9984893291 -20,0.99619,0.9990566667,0.9963433333,0.9990359654 +-10,0.10064,0.37023,0.10146,0.5614379461 +-8,0.1249233333,0.4708266667,0.12691,0.65563829 +-6,0.1634766667,0.5763733333,0.16262,0.7407016397 +-4,0.214,0.6803433333,0.21294,0.8120662111 +-2,0.2825866667,0.76744,0.2808,0.8681995366 +0,0.3646733333,0.8388366667,0.36478,0.9100289945 +2,0.4608633333,0.8904066667,0.4600566667,0.9398716824 +4,0.5610033333,0.92756,0.5599433333,0.9604546595 +6,0.65865,0.9529333333,0.6570033333,0.9742944207 +8,0.7445133333,0.96962,0.74325,0.9834284377 +10,0.8155633333,0.9808933333,0.8162233333,0.9893770607 +12,0.8720266667,0.98766,0.8727233333,0.9932152779 +14,0.9134533333,0.99211,0.9136866667,0.9956760816 +16,0.94315,0.9950333333,0.9424633333,0.9972471319 +18,0.96219,0.9969166667,0.96196,0.9982475299 +20,0.9756633333,0.99808,0.97557,0.9988837869 diff --git a/data/sec_jam_gap.csv b/data/sec_jam_gap.csv index a30636e..473ee42 100644 --- a/data/sec_jam_gap.csv +++ b/data/sec_jam_gap.csv @@ -1,201 +1,201 @@ ser,gap_db -0.6026633333,5.493678481 -0.6046408543,5.495143167 -0.6066183752,5.496607853 -0.6085958961,5.498072538 -0.6105734171,5.499537224 -0.612550938,5.50100191 -0.614528459,5.502466596 -0.6165059799,5.503931281 -0.6184835008,5.505395967 -0.6204610218,5.506860653 -0.6224385427,5.508301835 -0.6244160637,5.509221054 -0.6263935846,5.510140274 -0.6283711055,5.511059493 -0.6303486265,5.511978713 -0.6323261474,5.512897932 -0.6343036683,5.513817151 -0.6362811893,5.514736371 -0.6382587102,5.51565559 -0.6402362312,5.516574809 -0.6422137521,5.517494029 -0.644191273,5.518413248 -0.646168794,5.519332468 -0.6481463149,5.520251687 -0.6501238358,5.521170906 -0.6521013568,5.522090126 -0.6540788777,5.523009345 -0.6560563987,5.523928564 -0.6580339196,5.524847784 -0.6600114405,5.525767003 -0.6619889615,5.526686223 -0.6639664824,5.527605442 -0.6659440034,5.528524661 -0.6679215243,5.529443881 -0.6698990452,5.5303631 -0.6718765662,5.53128232 -0.6738540871,5.532201539 -0.675831608,5.533120758 -0.677809129,5.534039978 -0.6797866499,5.534959197 -0.6817641709,5.535878416 -0.6837416918,5.535503786 -0.6857192127,5.533851599 -0.6876967337,5.532199412 -0.6896742546,5.530547225 -0.6916517755,5.528895037 -0.6936292965,5.52724285 -0.6956068174,5.525590663 -0.6975843384,5.523938475 -0.6995618593,5.522286288 -0.7015393802,5.522063588 -0.7035169012,5.525405405 -0.7054944221,5.528747221 -0.707471943,5.532089038 -0.709449464,5.535430855 -0.7114269849,5.538772672 -0.7134045059,5.542114488 -0.7153820268,5.545456305 -0.7173595477,5.548798122 -0.7193370687,5.552139939 -0.7213145896,5.555481755 -0.7232921106,5.558823572 -0.7252696315,5.562165389 -0.7272471524,5.565507206 -0.7292246734,5.568849022 -0.7312021943,5.572190839 -0.7331797152,5.575532656 -0.7351572362,5.578874473 -0.7371347571,5.582216289 -0.7391122781,5.585558106 -0.741089799,5.588899923 -0.7430673199,5.59224174 -0.7450448409,5.595583557 -0.7470223618,5.598925373 -0.7489998827,5.60226719 -0.7509774037,5.605609007 -0.7529549246,5.608950824 -0.7549324456,5.61229264 -0.7569099665,5.615634457 -0.7588874874,5.618885922 -0.7608650084,5.613646281 -0.7628425293,5.608406639 -0.7648200503,5.603166998 -0.7667975712,5.597927356 -0.7687750921,5.592687715 -0.7707526131,5.587448073 -0.772730134,5.583317494 -0.7747076549,5.587339621 -0.7766851759,5.591361749 -0.7786626968,5.595383876 -0.7806402178,5.599406004 -0.7826177387,5.603428132 -0.7845952596,5.607450259 -0.7865727806,5.611472387 -0.7885503015,5.615494514 -0.7905278224,5.619516642 -0.7925053434,5.62353877 -0.7944828643,5.627560897 -0.7964603853,5.631583025 -0.7984379062,5.635605152 -0.8004154271,5.63962728 -0.8023929481,5.643649408 -0.804370469,5.647671535 -0.8063479899,5.651693663 -0.8083255109,5.65571579 -0.8103030318,5.659737918 -0.8122805528,5.663760046 -0.8142580737,5.667782173 -0.8162355946,5.671804301 -0.8182131156,5.675826428 -0.8201906365,5.679848556 -0.8221681575,5.683870684 -0.8241456784,5.687892811 -0.8261231993,5.676216805 -0.8281007203,5.664125326 -0.8300782412,5.652033848 -0.8320557621,5.639942369 -0.8340332831,5.630154814 -0.836010804,5.634337883 -0.837988325,5.638520953 -0.8399658459,5.642704022 -0.8419433668,5.646887091 -0.8439208878,5.651070161 -0.8458984087,5.65525323 -0.8478759296,5.6594363 -0.8498534506,5.663619369 -0.8518309715,5.667802439 -0.8538084925,5.671985508 -0.8557860134,5.676168577 -0.8577635343,5.680351647 -0.8597410553,5.684534716 -0.8617185762,5.688717786 -0.8636960972,5.692900855 -0.8656736181,5.697083925 -0.867651139,5.701266994 -0.86962866,5.705450063 -0.8716061809,5.709633133 -0.8735837018,5.713816202 -0.8755612228,5.717999272 -0.8775387437,5.704285934 -0.8795162647,5.688192672 -0.8814937856,5.67209941 -0.8834713065,5.666428984 -0.8854488275,5.676382997 -0.8874263484,5.68633701 -0.8894038693,5.696291023 -0.8913813903,5.706245035 -0.8933589112,5.716199048 -0.8953364322,5.726153061 -0.8973139531,5.736107074 -0.899291474,5.746061086 -0.901268995,5.756015099 -0.9032465159,5.765969112 -0.9052240369,5.775923124 -0.9072015578,5.785877137 -0.9091790787,5.79583115 -0.9111565997,5.805785163 -0.9131341206,5.815739175 -0.9151116415,5.825693188 -0.9170891625,5.824055924 -0.9190666834,5.787467425 -0.9210442044,5.781806417 -0.9230217253,5.790159547 -0.9249992462,5.798512677 -0.9269767672,5.806865807 -0.9289542881,5.815218937 -0.930931809,5.823572067 -0.93290933,5.831925197 -0.9348868509,5.840278327 -0.9368643719,5.848631457 -0.9388418928,5.856984587 -0.9408194137,5.865337718 -0.9427969347,5.873690848 -0.9447744556,5.866565539 -0.9467519765,5.856412766 -0.9487294975,5.875987642 -0.9507070184,5.895562519 -0.9526845394,5.915137396 -0.9546620603,5.934712273 -0.9566395812,5.95428715 -0.9586171022,5.973862027 -0.9605946231,5.993436904 -0.9625721441,6.013011781 -0.964549665,6.044395891 -0.9665271859,6.026989308 -0.9685047069,6.00649273 -0.9704822278,5.985996153 -0.9724597487,5.965499576 -0.9744372697,5.945002998 -0.9764147906,5.924506421 -0.9783923116,5.900370081 -0.9803698325,5.94627134 -0.9823473534,5.9921726 -0.9843248744,6.038073859 -0.9863023953,6.081945759 -0.9882799162,6.082821636 -0.9902574372,6.083697512 -0.9922349581,6.152098946 -0.9942124791,6.265817892 -0.99619,6.055737705 +0.37023,10.11553523 +0.3732723786,10.11830625 +0.3763147571,10.12107727 +0.3793571357,10.12384829 +0.3823995142,10.12661931 +0.3854418928,10.12939033 +0.3884842714,10.13216136 +0.3915266499,10.13493238 +0.3945690285,10.1377034 +0.397611407,10.14047442 +0.4006537856,10.14324544 +0.4036961642,10.14601646 +0.4067385427,10.14878749 +0.4097809213,10.15155851 +0.4128232998,10.15432953 +0.4158656784,10.15710055 +0.418908057,10.15987157 +0.4219504355,10.16264259 +0.4249928141,10.16541362 +0.4280351926,10.16818464 +0.4310775712,10.17095566 +0.4341199497,10.17372668 +0.4371623283,10.1764977 +0.4402047069,10.17926873 +0.4432470854,10.18203975 +0.446289464,10.18481077 +0.4493318425,10.18758179 +0.4523742211,10.19035281 +0.4554165997,10.19312383 +0.4584589782,10.19589486 +0.4615013568,10.19814261 +0.4645437353,10.19841844 +0.4675861139,10.19869428 +0.4706284925,10.19897012 +0.473670871,10.20189792 +0.4767132496,10.2050105 +0.4797556281,10.20812308 +0.4827980067,10.21123566 +0.4858403853,10.21434824 +0.4888827638,10.21746083 +0.4919251424,10.22057341 +0.4949675209,10.22368599 +0.4980098995,10.22679857 +0.5010522781,10.22991115 +0.5040946566,10.23302373 +0.5071370352,10.23613631 +0.5101794137,10.2392489 +0.5132217923,10.24236148 +0.5162641709,10.24547406 +0.5193065494,10.24858664 +0.522348928,10.25169922 +0.5253913065,10.2548118 +0.5284336851,10.25792438 +0.5314760637,10.26103697 +0.5345184422,10.26414955 +0.5375608208,10.26726213 +0.5406031993,10.27037471 +0.5436455779,10.27348729 +0.5466879564,10.27659987 +0.549730335,10.27971246 +0.5527727136,10.28282504 +0.5558150921,10.28593762 +0.5588574707,10.2890502 +0.5618998492,10.29261998 +0.5649422278,10.29728408 +0.5679846064,10.30194819 +0.5710269849,10.3066123 +0.5740693635,10.3112764 +0.577111742,10.31572832 +0.5801541206,10.31951819 +0.5831964992,10.32330805 +0.5862388777,10.32709792 +0.5892812563,10.33088779 +0.5923236348,10.33467765 +0.5953660134,10.33846752 +0.598408392,10.34225739 +0.6014507705,10.34604725 +0.6044931491,10.34983712 +0.6075355276,10.35362698 +0.6105779062,10.35741685 +0.6136202848,10.36120672 +0.6166626633,10.36499658 +0.6197050419,10.36878645 +0.6227474204,10.37257631 +0.625789799,10.37636618 +0.6288321776,10.38015605 +0.6318745561,10.38394591 +0.6349169347,10.38773578 +0.6379593132,10.39152564 +0.6410016918,10.39531551 +0.6440440704,10.39910538 +0.6470864489,10.40289524 +0.6501288275,10.40668511 +0.653171206,10.41047497 +0.6562135846,10.41426484 +0.6592559631,10.41975796 +0.6622983417,10.4320994 +0.6653407203,10.44444085 +0.6683830988,10.45678229 +0.6714254774,10.46912373 +0.6744678559,10.48146518 +0.6775102345,10.49380662 +0.6805526131,10.50536815 +0.6835949916,10.50637164 +0.6866373702,10.50737513 +0.6896797487,10.50837863 +0.6927221273,10.50938212 +0.6957645059,10.51038561 +0.6988068844,10.51138911 +0.701849263,10.5123926 +0.7048916415,10.51339609 +0.7079340201,10.51439959 +0.7109763987,10.51540308 +0.7140187772,10.51640657 +0.7170611558,10.51741007 +0.7201035343,10.51841356 +0.7231459129,10.51941705 +0.7261882915,10.52042055 +0.72923067,10.52142404 +0.7322730486,10.52242753 +0.7353154271,10.52343103 +0.7383578057,10.52443452 +0.7414001843,10.52543801 +0.7444425628,10.5264415 +0.7474849414,10.5418762 +0.7505273199,10.55765458 +0.7535696985,10.57343296 +0.7566120771,10.58921134 +0.7596544556,10.60498973 +0.7626968342,10.62076811 +0.7657392127,10.63654649 +0.7687815913,10.64555048 +0.7718239698,10.64596631 +0.7748663484,10.64638213 +0.777908727,10.64679796 +0.7809511055,10.64721379 +0.7839934841,10.64762962 +0.7870358626,10.64804544 +0.7900782412,10.64846127 +0.7931206198,10.6488771 +0.7961629983,10.64929293 +0.7992053769,10.64970876 +0.8022477554,10.65012458 +0.805290134,10.65054041 +0.8083325126,10.65095624 +0.8113748911,10.65137207 +0.8144172697,10.65178789 +0.8174596482,10.66599377 +0.8205020268,10.68853386 +0.8235444054,10.71107394 +0.8265867839,10.73361403 +0.8296291625,10.75615411 +0.832671541,10.7786942 +0.8357139196,10.80123429 +0.8387562982,10.82377437 +0.8417986767,10.81441442 +0.8448410553,10.80418892 +0.8478834338,10.79396343 +0.8509258124,10.78373793 +0.853968191,10.77351244 +0.8570105695,10.76328694 +0.8600529481,10.75306144 +0.8630953266,10.74283595 +0.8661377052,10.73261045 +0.8691800838,10.72238495 +0.8722224623,10.71467677 +0.8752648409,10.74356673 +0.8783072194,10.77245668 +0.881349598,10.80134663 +0.8843919765,10.83023658 +0.8874343551,10.85912654 +0.8904767337,10.88696207 +0.8935191122,10.87006808 +0.8965614908,10.85317409 +0.8996038693,10.8362801 +0.9026462479,10.81938611 +0.9056886265,10.80249212 +0.908731005,10.78559813 +0.9117733836,10.76870414 +0.9148157621,10.77779104 +0.9178581407,10.81891382 +0.9209005193,10.86003661 +0.9239428978,10.90115939 +0.9269852764,10.94228217 +0.9300276549,10.92173347 +0.9330700335,10.8868213 +0.9361124121,10.85190914 +0.9391547906,10.81699698 +0.9421971692,10.78208482 +0.9452395477,10.82593689 +0.9482819263,10.90570533 +0.9513243049,10.98547378 +0.9543666834,11.00642719 +0.957409062,10.96135692 +0.9604514405,10.91628665 +0.9634938191,10.92780128 +0.9665361977,11.01476826 +0.9695785762,11.10173524 +0.9726209548,11.01598634 +0.9756633333,10.92785334 diff --git a/data/sec_maskfam.csv b/data/sec_maskfam.csv index 7ed37ac..b4080ba 100644 --- a/data/sec_maskfam.csv +++ b/data/sec_maskfam.csv @@ -1,5 +1,5 @@ family,legit_ser,eve_ser,eve_ones_ser,mask_xcorr -random,0.64962,0.998488,0.999988,0.2709003091 -hadamard,0.257299,0.9999905,0.9999755,0 -learned,0.2762895,0.9999285,0.99999,0.007116591092 -learned_reg,0.315952,0.9999555,0.9999175,0.01121100038 +random,0.068322,0.998269,0.999996,0.06645943969 +hadamard,0.0530375,0.9997025,0.9999785,0 +learned,0.0635265,0.9997915,0.9997865,0.006678360514 +learned_reg,0.061412,0.999691,0.9998455,0.002381352475 diff --git a/data/sec_regjam.csv b/data/sec_regjam.csv index 774bdcd..f5da61b 100644 --- a/data/sec_regjam.csv +++ b/data/sec_regjam.csv @@ -1,8 +1,8 @@ jsr_db,plain,regularized --10,0.46703,0.4719866667 --5,0.6348,0.6301533333 -0,0.8073133333,0.80122 -5,0.9191366667,0.91577 -10,0.9707266667,0.96911 -15,0.9901433333,0.99006 -20,0.9968333333,0.9964333333 +-10,0.11818,0.11519 +-5,0.2138833333,0.2087733333 +0,0.40523,0.3974866667 +5,0.64827,0.6407633333 +10,0.83815,0.83505 +15,0.9393566667,0.9379166667 +20,0.97962,0.9787433333 diff --git a/data/sec_sens.csv b/data/sec_sens.csv index fd28f9f..db058c1 100644 --- a/data/sec_sens.csv +++ b/data/sec_sens.csv @@ -1,23 +1,23 @@ rho,eve_ser -0,0.999985 -0.1,0.99994625 -0.2,0.9998125 -0.3,0.99964375 -0.4,0.99860875 -0.5,0.99641875 -0.6,0.989405 -0.65,0.9817575 -0.7,0.96633 -0.75,0.9402875 -0.8,0.87396 -0.84,0.80818 -0.88,0.7000025 -0.9,0.62012 -0.92,0.51693625 -0.94,0.4271675 -0.96,0.3636825 -0.97,0.33119875 -0.98,0.30263125 -0.99,0.2772575 -0.995,0.26772625 -1,0.25672125 +0,0.9999725 +0.1,0.999645 +0.2,0.9978275 +0.3,0.98789125 +0.4,0.953745 +0.5,0.846655 +0.6,0.60245875 +0.65,0.48618375 +0.7,0.32927 +0.75,0.23272375 +0.8,0.1458875 +0.84,0.1059525 +0.88,0.08334375 +0.9,0.07761625 +0.92,0.069835 +0.94,0.06505125 +0.96,0.0602775 +0.97,0.0587575 +0.98,0.05626875 +0.99,0.0543425 +0.995,0.054125 +1,0.05307125 diff --git a/data/sec_sens_cmp.csv b/data/sec_sens_cmp.csv index cd87b87..3c69632 100644 --- a/data/sec_sens_cmp.csv +++ b/data/sec_sens_cmp.csv @@ -1,14 +1,14 @@ frac,ser_mask,ser_perm,ser_pad -0,0.9999758333,0.9999883333,0.9999886992 -0.2,0.9998233333,0.999845,0.9998961502 -0.4,0.998725,0.9983133333,0.9990456633 -0.6,0.98967125,0.9839833333,0.9912300403 -0.75,0.9379629167,0.9079,0.953711875 -0.85,0.7883508333,0.75701,0.8596806442 -0.9,0.6134920833,0.5836283333,0.7556898116 -0.92,0.5265704167,0.5003716667,0.6950201284 -0.94,0.43973,0.456195,0.6192843094 -0.955,0.3805966667,0.3946716667,0.5503775633 -0.97,0.3297841667,0.3282283333,0.4689992019 -0.985,0.2895645833,0.2584466667,0.3728919542 -1,0.2575758333,0.2577083333,0.25939 +0,0.9999716667,0.9999766667,0.9999855534 +0.2,0.9982225,0.9982933333,0.999867242 +0.4,0.9558158333,0.9519216667,0.9987800093 +0.6,0.61956875,0.6330266667,0.9887887893 +0.75,0.2243020833,0.2672066667,0.940826875 +0.85,0.09969458333,0.1194716667,0.8206206283 +0.9,0.07701541667,0.0858,0.6876823738 +0.92,0.07021208333,0.07434166667,0.6101243663 +0.94,0.06535041667,0.066805,0.5133063362 +0.955,0.06155541667,0.06314,0.4252183547 +0.97,0.05860083333,0.06018333333,0.3211870949 +0.985,0.05551916667,0.05543333333,0.1983269406 +1,0.052955,0.05323,0.05323 diff --git a/data/sec_snr.csv b/data/sec_snr.csv index 20efc06..c551091 100644 --- a/data/sec_snr.csv +++ b/data/sec_snr.csv @@ -1,12 +1,12 @@ snr_db,legit,eve_wrong,eve_none,eve_public,oma,chance -0,0.8821684375,0.999989375,0.9999803125,0.8819953125,0.8933480658,0.9999847412 -2,0.779363125,0.99999125,0.999980625,0.7794809375,0.7973276257,0.9999847412 -4,0.6455015625,0.9999884375,0.9999809375,0.64627375,0.6686275787,0.9999847412 -6,0.5016365625,0.9999903125,0.99998,0.5016371875,0.525415822,0.9999847412 -8,0.3675334375,0.999989375,0.9999775,0.3677109375,0.3892153151,0.9999847412 -10,0.2576425,0.99999375,0.999970625,0.2569871875,0.2747696909,0.9999847412 -12,0.1741078125,0.99999,0.9999703125,0.17413125,0.1870712987,0.9999847412 -14,0.115345,0.9999853125,0.999966875,0.1151475,0.1241256148,0.9999847412 -16,0.0748184375,0.9999846875,0.9999675,0.0747059375,0.08092517452,0.9999847412 -18,0.0480371875,0.9999884375,0.9999575,0.0481878125,0.05214810026,0.9999847412 -20,0.030745,0.99998875,0.9999559375,0.0308409375,0.03334949917,0.9999847412 +0,0.3976709375,0.999875,0.9999815625,0.398049375,0.5239437084,0.9999847412 +2,0.280670625,0.9998496875,0.9999834375,0.2805728125,0.3879090701,0.9999847412 +4,0.191034375,0.999809375,0.999985,0.190259375,0.2737289805,0.9999847412 +6,0.12611875,0.9997775,0.99997875,0.126483125,0.1863040407,0.9999847412 +8,0.0821671875,0.9997490625,0.999981875,0.0824515625,0.1235895109,0.9999847412 +10,0.0531603125,0.9997025,0.99998125,0.0529865625,0.08056383667,0.9999847412 +12,0.034030625,0.9996815625,0.99997625,0.0339634375,0.05191025407,0.9999847412 +14,0.021604375,0.9996678125,0.999969375,0.021566875,0.03319532309,0.9999847412 +16,0.013683125,0.9996721875,0.99996,0.0138321875,0.02112425659,0.9999847412 +18,0.0087159375,0.999639375,0.999954375,0.0087384375,0.01340080653,0.9999847412 +20,0.00549625,0.9996415625,0.99996,0.0054996875,0.00848434326,0.9999847412 diff --git a/fig/fig_sec_brute.pdf b/fig/fig_sec_brute.pdf index 27606df..7ff5b0d 100644 Binary files a/fig/fig_sec_brute.pdf and b/fig/fig_sec_brute.pdf differ diff --git a/fig/fig_sec_jam.pdf b/fig/fig_sec_jam.pdf index 1fe0c3e..b3f6172 100644 Binary files a/fig/fig_sec_jam.pdf and b/fig/fig_sec_jam.pdf differ diff --git a/fig/fig_sec_keylen.pdf b/fig/fig_sec_keylen.pdf index 8f5dc16..abd44b2 100644 Binary files a/fig/fig_sec_keylen.pdf and b/fig/fig_sec_keylen.pdf differ diff --git a/fig/fig_sec_kpa.pdf b/fig/fig_sec_kpa.pdf index 0c41cca..552c3a6 100644 Binary files a/fig/fig_sec_kpa.pdf and b/fig/fig_sec_kpa.pdf differ diff --git a/fig/fig_sec_real.pdf b/fig/fig_sec_real.pdf index dcece6a..11c92fc 100644 Binary files a/fig/fig_sec_real.pdf and b/fig/fig_sec_real.pdf differ diff --git a/fig/fig_sec_sens.pdf b/fig/fig_sec_sens.pdf index aaa315c..64bf7a9 100644 Binary files a/fig/fig_sec_sens.pdf and b/fig/fig_sec_sens.pdf differ diff --git a/fig/fig_sec_snr.pdf b/fig/fig_sec_snr.pdf index 423b059..df13d14 100644 Binary files a/fig/fig_sec_snr.pdf and b/fig/fig_sec_snr.pdf differ