协议名称:CEH-Orbit Post-Quantum Authentication Protocol
版本:V1.0
作者:陈恩华(Chen Enhua)
协议标识:CEH_ORBIT_PROTOCOL_V1
发布日期:2026年3月
1. 目的
CEH-Orbit 协议定义了一种基于格结构与轨道映射的认证 / 签名机制。其核心思想是:
- 从随机掩码生成高维轨道向量;
- 将轨道向量压缩为轨道头
OrbitHead; - 通过
OrbitHead + Message派生挑战; - 通过重建轨道并比较轨道头来完成验证。
本规范的目标是给出一致、可复现、可互操作的实现标准,为后续研究、工程开发及标准化提供基础。
2. 术语
| 术语 | 说明 |
BaseOrbitGen |
公开基向量,即公钥中的基底 (A) |
CoreVector_S |
私密短向量,即私钥 (s) |
PublicOrbit_T |
公开向量,满足 (T = A \cdot s) |
StochasticMask |
签名阶段的随机掩码 (y) |
OrbitTrace_W |
签名阶段的轨道轨迹 (w = A y) |
EncodedOrbit_Z |
签名输出响应 (z = y + c s) |
GeometricPivot |
由 OrbitHead + Message 派生的挑战向量 (c) |
OrbitHead |
轨道头,包含 LSH 和 Phase 两部分 |
LSH |
局部敏感哈希,128 位 |
Phase |
相位向量,(K) 段,每段取值 (0 \sim 3) |
3. 参数
3.1 默认参数
#define LATTICE_DIM_N 128 #define MOD_Q 3329 #define ORBIT_ZONE_COUNT 16 #define ORBIT_WIDTH_CEH 32 #define RESPONSE_BOUND 260 #define PIVOT_WEIGHT 8
3.2 参数含义
| 参数 | 含义 |
LATTICE_DIM_N |
向量维数,即环 (R_q) 的维度 |
MOD_Q |
模数,素数 |
ORBIT_ZONE_COUNT |
相位分段数 (K) |
ORBIT_WIDTH_CEH |
LSH 量化宽度 (\Delta) |
RESPONSE_BOUND |
响应向量绝对值边界 (Z_{\max}) |
PIVOT_WEIGHT |
挑战稀疏权重 (\kappa) |
3.3 常量定义
#define CEH_MAGIC 0x434548 // ASCII: "CEH" #define ARCH_IDENTIFIER "CEH_ORBIT_V1" // 域分离架构标识
4. 域分离常量
协议使用以下域分离前缀,确保不同上下文的哈希输出不会发生冲突:
#define CEH_DOMAIN_HEAD "CEH_ORBIT_HEAD_V1" #define CEH_DOMAIN_CHALLENGE "CEH_ORBIT_CHALLENGE_V1" #define CEH_DOMAIN_BIND "CEH_ORBIT_BIND_V1"
用途如下:
HEAD:轨道头专用上下文(当前规范中预留,供扩展)CHALLENGE:挑战派生上下文BIND:签名绑定哈希上下文
所有哈希调用均应将这些字符串作为前缀与数据拼接。
5. 数学基础
5.1 模运算
定义 ( \mathrm{mod}_q(x) ) 将整数 (x) 映射到区间 ([0, q-1]):
modq(x)=xmodq
其结果必须落在:
[0,q−1]
5.2 中心化表示
定义:
centered(x)={x,x−q,0≤x≤⌊q/2⌋otherwise
即:先将 (x) 模到 ([0, q-1]),若结果大于 (q/2),则减去 (q),使结果落入:
(−q/2,q/2]
5.3 负循环卷积
定义环:
Rq=ℤq[x]/(xN+1)
因此有:
xN=−1
给定:
a(x),b(x)∈Rq
乘积:
c(x)=a(x)b(x)mod(xN+1)
可通过负循环卷积实现。坐标形式可写为:
ck=∑i+j=k0≤i,j<Naibj−∑i+j=k+N0≤i,j<Naibj(modq)
工程实现中可直接使用 (O(N^2)) 累加,并在 (i+j \ge N) 时对结果取负号折返。
6. 数据结构
6.1 OrbitHead
struct OrbitHead { uint64_t lsh[2]; // 128 位 LSH uint8_t phase[ORBIT_ZONE_COUNT]; // 每段实际用 1 字节存储,值域 0..3 };
说明:
lsh[0]对应位置 (0 \sim 63)lsh[1]对应位置 (64 \sim 127)phase[k]的合法值范围为 (0 \sim 3)
6.2 CEH_KeyPair
struct CEH_KeyPair { int BaseOrbitGen[LATTICE_DIM_N]; // 公钥 A int CoreVector_S[LATTICE_DIM_N]; // 私钥 s int PublicOrbit_T[LATTICE_DIM_N]; // 公钥 T = A·s };
6.3 CEH_Signature
struct CEH_Signature { int EncodedOrbit_Z[LATTICE_DIM_N]; // 响应 z OrbitHead OrbitHeadRef; // 签名时计算的轨道头 int GeometricPivot[LATTICE_DIM_N]; // 挑战 c uint64_t BindAuthHash; // 绑定哈希 h };
7. 轨道头构造
7.1 LSH 计算
给定向量:
w∈RNq
其中心化表示为:
w¯i=centered(wi)
设量化宽度:
Δ=ORBIT\_WIDTH\_CEH
定义第 (i) 位:
bi=(⌊w¯iΔ⌋⊕i⊕CEH_MAGIC)&1
其中:
- (\oplus) 表示按位异或
- (&) 表示按位与
然后将 (b_i) 写入 LSH:
- 若 (i \in [0,63]),写入
lsh[0]的第 (i) 位 - 若 (i \in [64,127]),写入
lsh[1]的第 (i-64) 位
7.2 Phase 计算
将 (w) 等分为:
K=ORBIT\_ZONE\_COUNT
段,每段长度:
L=N/K
对于第 (k) 段((0 \le k < K)):
ϕk=(∑i=kL(k+1)L−1centered(wi))mod4
最后归一化到:
[0,3]
7.3 轨道头函数
BuildOrbitHead(w)↦(lsh,phase)
实现必须严格按本节规则构造。
8. 挑战派生
挑战 (c) 必须由以下信息共同派生:
- 域前缀
CEH_DOMAIN_CHALLENGE - 架构标识
ARCH_IDENTIFIER - 轨道头
lsh - 轨道头
phase - 消息负载
MessagePayload
8.1 输入字节流
拼接顺序必须严格如下:
ChallengeInput = ASCII(CEH_DOMAIN_CHALLENGE) ASCII(ARCH_IDENTIFIER) LE64(OrbitHead.lsh[0]) LE64(OrbitHead.lsh[1]) BYTE(OrbitHead.phase[0]) BYTE(OrbitHead.phase[1]) ... BYTE(OrbitHead.phase[K-1]) MessagePayload
其中:
ASCII(...):原始 ASCII 字节,不带终止符LE64(x):64 位整数的 little-endian 编码BYTE(x):取低 8 位作为单字节MessagePayload:消息原始字节串
8.2 派生方法
计算:
seed=SHA25664(ChallengeInput)
即:取 SHA256(ChallengeInput) 的前 8 字节,按 little-endian 解释为 64 位整数。
用该 seed 初始化 MT19937_64。
然后生成长度为 (N) 的稀疏挑战向量 (c):
- 初始为全 0
- 随机选择
PIVOT_WEIGHT个不同位置 - 每个位置随机赋值为:
- (1)
- 或 (Q-1)(即模 (Q) 下的 (-1))
9. 绑定哈希
绑定哈希 (h) 必须由以下信息派生:
- 域前缀
CEH_DOMAIN_BIND - 架构标识
ARCH_IDENTIFIER - 响应向量
EncodedOrbit_Z - 挑战向量
GeometricPivot - 消息负载
MessagePayload
9.1 输入字节流
BindInput = ASCII(CEH_DOMAIN_BIND) ASCII(ARCH_IDENTIFIER) LE16(EncodedOrbit_Z[0]) LE16(EncodedOrbit_Z[1]) ... LE16(EncodedOrbit_Z[N-1]) LE16(GeometricPivot[0]) LE16(GeometricPivot[1]) ... LE16(GeometricPivot[N-1]) MessagePayload
说明:
- 所有整型在编码前必须先做
mod_q(x) LE16(x)表示 16 位 little-endian 编码
9.2 派生方法
计算:
digest=SHA256(BindInput)
取前 8 字节并按 little-endian 解释为:
h=LE64(digest[0..7])
10. 密钥生成(KeyGen)
10.1 输入
随机源 rng(建议使用 CSPRNG)。
10.2 过程
- 生成:
BaseOrbitGen[i]←Uniform(0,Q−1)
- 生成私钥 (s_i):
si=⎧⎩⎨⎪⎪1,−1,0,r=0r=1otherwise其中 r∈[0,11]
即:
- 以 (1/12) 概率取 (1)
- 以 (1/12) 概率取 (-1)
- 其余取 (0)
- 计算:
T=A⋅s
使用负循环卷积实现。
10.3 伪代码
KeyPair keygen(rng) { for i in 0..N-1: BaseOrbitGen[i] = rng() % Q; r = rng() % 12; if r == 0: CoreVector_S[i] = 1; else if r == 1: CoreVector_S[i] = -1; else: CoreVector_S[i] = 0; PublicOrbit_T = negacyclic_mul(BaseOrbitGen, CoreVector_S); return (BaseOrbitGen, CoreVector_S, PublicOrbit_T); }
11. 签名(Sign)
11.1 输入
- 私钥
CoreVector_S - 公钥基底
BaseOrbitGen - 消息
MessagePayload - 随机源
rng
11.2 输出
- 签名结构
CEH_Signature
11.3 过程
重复以下步骤直到成功:
- 采样随机掩码:
yi∈[−200,200]
- 计算轨道:
w=A⋅y
- 计算轨道头:
H=BuildOrbitHead(w)
- 派生挑战:
c=DeriveChallenge(H,msg)
- 计算:
u=c⋅s
- 计算响应:
zi=yi+centered(ui)
- 若:
‖z‖∞>RESPONSE\_BOUND
则拒绝并重采样。
- 计算绑定哈希:
h=BindHash(z,c,msg)
- 输出:
(z,H,c,h)
11.4 伪代码
Signature sign(KeyPair kp, msg, rng) { while (true) { y = sample_uniform_small_vector(); // [-200,200] w = negacyclic_mul(kp.BaseOrbitGen, y); H = BuildOrbitHead(w); c = DeriveChallenge(H, msg); cs = negacyclic_mul(c, kp.CoreVector_S); for i in 0..N-1: z[i] = y[i] + centered(cs[i]); if max_abs(z) > RESPONSE_BOUND: continue; h = BindHash(z, c, msg); return Signature(z, H, c, h); } }
12. 验证(Verify)
12.1 输入
- 公钥
BaseOrbitGen - 公钥
PublicOrbit_T - 消息
MessagePayload - 签名
sig
12.2 输出
true或false
12.3 过程
- 检查:
‖z‖∞≤RESPONSE\_BOUND
否则拒绝。
- 重算绑定哈希:
h′=BindHash(z,c,msg)
若:
h′≠h
则拒绝。
- 计算:
w′=A⋅z−c⋅T
- 计算轨道头:
H′=BuildOrbitHead(w′)
- 派生挑战:
c′=DeriveChallenge(H′,msg)
- 若:
c′≠c
则拒绝。
- 若:
H′.lsh≠H.lsh或H′.phase≠H.phase
则拒绝。
- 否则接受。
12.4 伪代码
bool verify(KeyPair kp, msg, sig) { if max_abs(sig.z) > RESPONSE_BOUND: return false; if BindHash(sig.z, sig.c, msg) != sig.h: return false; Az = negacyclic_mul(kp.BaseOrbitGen, sig.z); Ct = negacyclic_mul(sig.c, kp.PublicOrbit_T); for i in 0..N-1: w[i] = mod_q(Az[i] - Ct[i]); Hp = BuildOrbitHead(w); cp = DeriveChallenge(Hp, msg); if cp != sig.c: return false; if Hp.lsh != sig.H.lsh: return false; if Hp.phase != sig.H.phase: return false; return true; }
13. 字节流定义
本节定义互操作所需的数据编码规则。
13.1 整型编码
uint16 编码
先做:
x=modq(x)
再按 little-endian 编码:
byte0 = x & 0xFF byte1 = (x >> 8) & 0xFF
uint64 编码
按 little-endian 编码:
for i in 0..7: byte[i] = (value >> (8*i)) & 0xFF
13.2 ChallengeInput 字节流
ChallengeInput = ASCII(CEH_DOMAIN_CHALLENGE) ASCII(ARCH_IDENTIFIER) LE64(OrbitHead.lsh[0]) LE64(OrbitHead.lsh[1]) BYTE(OrbitHead.phase[0]) BYTE(OrbitHead.phase[1]) ... BYTE(OrbitHead.phase[K-1]) MessagePayload
13.3 BindInput 字节流
BindInput = ASCII(CEH_DOMAIN_BIND) ASCII(ARCH_IDENTIFIER) LE16(EncodedOrbit_Z[0]) LE16(EncodedOrbit_Z[1]) ... LE16(EncodedOrbit_Z[N-1]) LE16(GeometricPivot[0]) LE16(GeometricPivot[1]) ... LE16(GeometricPivot[N-1]) MessagePayload
注意:EncodedOrbit_Z 与 GeometricPivot 序列化前必须先做 mod_q。
13.4 签名二进制封装(建议)
建议采用如下封包格式:
SignaturePacket = MAGIC[4] = "CEH1" VERSION[1] = 0x01 N[2] = LE16(128) Q[2] = LE16(3329) Z_COUNT[2] = LE16(N) Z_STREAM[2*N] = LE16(z[i]) LSH_BLOCKS[1] = 0x02 LSH_STREAM[16] = LE64(lsh[0]) || LE64(lsh[1]) PHASE_COUNT[1] = K PHASE_STREAM[K] = phase[i] PIVOT_COUNT[2] = LE16(N) PIVOT_STREAM[2*N] = LE16(c[i]) BIND_AUTH[8] = LE64(BindAuthHash)
该封装为建议格式,不强制,但不同实现必须保证核心字段语义一致。
14. 安全考量
14.1 安全假设
CEH-Orbit 当前实现的安全性依赖于以下假设:
- 环上 SIS / LWE 类困难问题的计算困难性(当前仅为结构来源,尚未完成严格归约)
SHA256被视为安全哈希函数MT19937_64在此仅作为工程性挑战展开器;若进入严格密码场景,建议替换为密码学安全 XOF / PRF- 实现层面不存在侧信道泄露
14.2 已具备的安全属性
- 消息绑定:挑战中显式包含消息
- 域分离:不同上下文哈希使用不同前缀
- 绑定哈希:将 (z) 与 (c) 绑定
- 轨道锁定:要求恢复轨道头与签名头完全一致
- 拒绝采样:限制 (z) 的幅度,降低统计泄露风险
14.3 当前安全强度说明
在默认参数:
N=128,Q=3329
下,该实现应视为研究原型级参数。
不应宣称达到正式工业级或标准化强度。
14.4 尚未完成的工作
- 形式化安全归约(至 SIS / LWE)
- EUF-CMA 安全证明
- 参数标准化与安全强度评估
- 常数时间实现与侧信道防护
- CSPRNG / XOF 替换与协议强化
15. 错误处理规范
对外接口建议统一返回:
VERIFY_FAIL
不要暴露如下内部失败原因:
Z_OUT_OF_RANGEBIND_HASH_MISMATCHPIVOT_MISMATCHLSH_MISMATCHPHASE_MISMATCH
调试阶段可记录内部日志,但生产接口应统一失败返回,以降低侧信道信息泄露。
16. 一致性要求
所有实现必须保证以下一致性:
- 相同参数集
- 相同域分离字符串
- 相同 little-endian 字节序
- 相同
mod_q/centered定义 - 相同 LSH 规则(包含
CEH_MAGIC) - 相同 Phase 分段规则
- 相同挑战派生方法
- 相同绑定哈希构造方法
任何一项不一致,都可能导致跨实现不兼容。
17. 参考实现状态
当前参考实现(C++ / OpenSSL)已具备:
- 完整
KeyGen / Sign / Verify - 消息绑定
- 域分离
- 拒绝采样与边界检查
- 攻击测试(随机伪造、局部扰动)
- 统计输出(碰撞率、分布、稳定性)
性能与大小数据如需写入正式规范,应以你当前实际测试结果为准。
若尚未做统一基准测试,建议不要在规范正文中写死具体毫秒数与字节数,以免后续版本不一致。
18. 开发者实现建议
18.1 实现顺序
- 实现
mod_q和centered - 实现
negacyclic_mul - 实现
BuildOrbitHead - 实现
DeriveChallenge - 实现
BindHash - 实现
KeyGen / Sign / Verify
18.2 调试建议
- 固定随机种子
- 单独测试卷积正确性
- 单独测试轨道头构造稳定性
- 单独测试挑战可重复性
- 使用已知测试向量交叉验证
18.3 安全增强建议
- 使用密码学安全随机源替代普通 RNG
- 使用常数时间比较函数
- 对外统一失败返回
- 后续考虑将
MT19937_64替换为基于 SHAKE / XOF 的展开器
19. 最终定义
CEH-Orbit 协议的核心验证条件可形式化为:
$$ \mathrm{DeriveChallenge} \bigl( \mathrmA \cdot z - c \cdot T, ; msg \bigr)
c $$
且:
$$ \mathrmA \cdot z - c \cdot T
OrbitHeadRef $$
即:恢复的轨道必须重新生成相同的挑战,并且其轨道头必须与签名时记录的轨道头完全一致。
这意味着协议不是在验证单点代数值,而是在验证:
恢复的轨道是否重新落回签名时定义的同一轨道结构。
20. 版权与使用声明
© 2026 陈恩华(Chen Enhua) 代码地址 :https://gitee.com/chenenhua/CEH-orbit
本文档及其所描述的协议、算法、数据结构、实现约定及相关技术内容的知识产权归作者所有。
允许:
- 非商业查看
- 非商业学习
- 非商业复制
- 非商业研究与分发
但必须保留版权声明。
任何商业用途(包括但不限于产品集成、服务部署、企业交付、SaaS/API 商业化、OEM/ODM)必须事先获得作者明确的书面授权。