The Sophie Kernel Protocol (SKP-1) is a system for private one-way communication. Two parties share a single number — a Sophie Germain prime — agreed in person. From that number, both parties independently derive identical cryptographic keystreams. Messages are encrypted against the keystream and transmitted. The receiver decrypts. No key material exists on the wire. No network handshake occurs. Nothing that can be seized or subpoenaed needs to exist anywhere.
This document explains the mathematical foundation, the cryptographic construction, the wire format, and how to use the system by hand or with software. It is written to be followed by someone with general technical literacy and no prior cryptography background, while remaining rigorous enough to implement from.
You should be comfortable with: modular arithmetic (clock arithmetic), the idea of a prime number, and basic terminal usage if you intend to run the reference implementation.
A prime number p is called a Sophie Germain prime if 2p+1 is also prime. The value 2p+1 is called the safe prime or kernel complement, and is written q.
The first twenty Sophie Germain primes and their safe prime partners are:
| Index | p (Sophie Germain) | q = 2p+1 (Safe Prime) | Bits |
|---|---|---|---|
| 1 | 2 | 5 | 2 |
| 2 | 3 | 7 | 2 |
| 3 | 5 | 11 | 3 |
| 4 | 11 | 23 | 4 |
| 5 | 23 | 47 | 5 |
| 6 | 29 | 59 | 5 |
| 7 | 41 | 83 | 6 |
| 8 | 53 | 107 | 6 |
| 9 | 83 | 167 | 7 |
| 10 | 89 | 179 | 7 |
| 11 | 113 | 227 | 7 |
| 12 | 131 | 263 | 8 |
| 13 | 173 | 347 | 8 |
| 14 | 179 | 359 | 8 |
| 15 | 191 | 383 | 8 |
| 16 | 233 | 467 | 8 |
| 17 | 239 | 479 | 8 |
| 18 | 251 | 503 | 8 |
| 19 | 281 | 563 | 9 |
| 20 | 293 | 587 | 9 |
Why does the safe prime structure matter? The multiplicative group of integers modulo q (written ℤ_q*) contains exactly 2p elements when q is a safe prime. This group has a prime-order subgroup of size p. That structure underlies the security of Diffie-Hellman key exchange and is the same mathematical ground on which much of modern public-key cryptography rests. SKP-1 uses it differently — as the source of entropy for a symmetric construction — but the mathematical guarantee is the same.
The kernel is the pair (p, q). It is the only shared secret between the transmitter and receiver. Both values are derivable from p alone — q = 2p+1 — so memorizing p is sufficient. The kernel index K is the position of p in the canonical sequence above.
The kernel has three properties that make it operationally valuable:
Verifiability. Either party can confirm the kernel is correct by primality testing p and q independently. No trusted third party required.
Memorability. A single index (1–20 for the small-prime table) or a single number (83) is the entire key. No key file, no passphrase, no hardware token.
Structured sparsity. Sophie Germain primes are rare. There are approximately 60 such primes below 1000. This rarity is a feature: the kernel is a named mathematical object, not an arbitrary string. "83" is more memorable than "3,f8,a2,11" and more verifiable than either.
The kernel (p, q) is the root secret, but it cannot be used directly as a cipher key — it is too structured, and reusing it directly for every message would be catastrophic if a single message were ever compromised. Instead, SKP-1 uses a key derivation function (KDF) to produce per-message key material.
The KDF used is HKDF-SHA-512, defined in RFC 5869. HKDF takes:
| Input | Value in SKP-1 | Purpose |
|---|---|---|
| IKM | bytes(p) ∥ bytes(q) | Input key material — the kernel |
| salt | SHA-512("SKP1-SALT-v1") | Domain separation |
| info | "SKP1-stream-v1" ∥ bytes(counter) | Context binding per message |
| L | 32 bytes (stream), 12 bytes (nonce) | Output length |
The output is a 32-byte value unique to this kernel + this counter combination. That value is the per-message encryption key. A separate derivation with a different info label produces the MAC key. Both are derived independently; neither reveals anything about the other or about the kernel.
The critical property: two parties who know the same (p, q, counter) will derive the identical stream_key and nonce without any communication between them. The counter increments with each message. Counter reuse under the same kernel breaks the security of the AEAD scheme catastrophically — this must never happen.
SKP-1 binary mode uses ChaCha20-Poly1305, an authenticated encryption with associated data (AEAD) scheme. It provides both confidentiality (no one can read the plaintext) and integrity (no one can modify the ciphertext without detection).
ChaCha20 is a stream cipher operating on 512-bit blocks. Poly1305 is a message authentication code. Together they provide 256-bit keys with 128-bit post-quantum security — meaning a quantum computer running Grover's algorithm would require 2^128 operations to find the key by brute force.
Padding: all messages are padded to one of three fixed sizes — 256, 1024, or 4096 bytes — before encryption. The PAYLOAD_LEN field in the header records the actual plaintext length. The receiver reads PAYLOAD_LEN bytes and discards the rest. Fixed sizes prevent the adversary from inferring content type or length from the ciphertext size.
A binary-mode SKP-1 message has the following structure:
The header fields (VERSION through PAYLOAD_LEN) are authenticated but not encrypted. Modifying any header byte invalidates the MAC. An adversary who modifies the KERNEL_IDX cannot redirect the message to decrypt under a different kernel — the MAC will fail.
For broadcast (numbers station) mode, the binary message is converted to decimal digit groups of five, transmitted over voice or RTTY, and decoded by the receiver before decryption.
Broadcast mode uses small kernels and decimal digit arithmetic for hand compatibility. This example uses kernel index 9 (p=83, q=167) and a simplified stream for illustration. In practice, the stream is HKDF-derived as in §3.
A numbers station transmits digit groups over shortwave radio on a fixed schedule. The receiver listens passively — no transmission required. This one-way property has significant security implications:
| Property | Status |
|---|---|
| Receiver RF emission | None — receive only |
| Receiver identifiable from traffic | No |
| Transmission origin locatable | Yes (with DF equipment) |
| Content readable without kernel | No |
| Existence of communication deniable | Partial — broadcast is public |
| Hand-decryptable without equipment | Yes |
| Compatible with automated decoder pipeline | Yes |
The decoder pipeline accepts SDR audio input, extracts digit groups via audio recognition, parses the SKP-1 broadcast header, derives the keystream, authenticates, and emits plaintext to a downstream system. The downstream system — a message queue, Conduit PQ, Estafette, or any local process — receives only authenticated cleartext. The RF channel is invisible to it.
| Property | Binary Mode | Broadcast Mode |
|---|---|---|
| Confidentiality | 128-bit PQ (ChaCha20-Poly1305) | Security-through-obscurity + stream |
| Integrity | Poly1305 MAC (256-bit) | 40-bit HMAC-truncated (error detection) |
| Forward secrecy | Approximate (kernel rotation) | Approximate (kernel rotation) |
| Receiver anonymity | Strong (no Tx required) | Strong (no Tx required) |
| Key material deniability | High (memorized integer) | High (memorized integer) |
| Information-theoretic security | Not achieved | Not achieved |
| Quantum-resistant | Yes (symmetric only) | No (small keyspace) |
SKP-1 does not achieve Shannon information-theoretic security. The only construction that does is the one-time pad: truly random key material at least as long as the message, used once and destroyed. The Sophie Kernel generates a deterministic keystream — a computationally unbounded adversary who knows the system could enumerate all Sophie Germain primes and try each one.
Against a practical adversary — even a nation-state — binary mode provides meaningful resistance. The relevant attack surface is not the cipher. It is the endpoint, operational discipline, and traffic metadata.
1. Never reuse a counter under the same kernel.
2. Zeroize derived key material immediately after use.
3. Rotate kernel on schedule — both parties maintain independent counters.
4. The kernel lives in memory only. Do not write it down.
5. Transmit on a fixed schedule. Empty slots send null messages.
The reference implementation is written in Rust. It is structured as a Cargo workspace with three crates:
Source: codeberg.org/mjh/skp
Full specification: kmsp42.com/skp1.html
Related: RADIX-10 hand cipher system
SKP-1 Rev 1.0 — April 2026 — M.J. Harmon — KMSP42.COM
Not formally audited. Do not deploy without independent review.