安全性评审
13 位满长约 59.6 bit,配合 Argon2id 时离线攻击代价很高。主要风险是人选密码的实际熵偏低,建议默认使用随机生成。
结论:有条件通过
原文设计:四进制数字 0 1 2 3、配对字母 a–h ↔ A–H、v ↔ U,加两个标点。24 个符号,13 位一组,无损装进一个 64 位机器字。
ALIEN24_ALPHABET = "0123abcdefghvABCDEFGHU,!"。严格按原文设计,不替换任何字符。符号的索引就是它在 Base-24 中的数值。
四进制数字 0–3小写 4–12大写 13–21标点 22–23
| 索引 | 符号 | 分组 | 5-bit 码 | 大小写配对 |
|---|---|---|---|---|
| 0 | 0 | 四进制数字 | 00000 | — |
| 1 | 1 | 四进制数字 | 00001 | — |
| 2 | 2 | 四进制数字 | 00010 | — |
| 3 | 3 | 四进制数字 | 00011 | — |
| 4 | a | 小写 | 00100 | → A |
| 5 | b | 小写 | 00101 | → B |
| 6 | c | 小写 | 00110 | → C |
| 7 | d | 小写 | 00111 | → D |
| 8 | e | 小写 | 01000 | → E |
| 9 | f | 小写 | 01001 | → F |
| 10 | g | 小写 | 01010 | → G |
| 11 | h | 小写 | 01011 | → H |
| 12 | v | 小写 | 01100 | → U |
| 13 | A | 大写 | 01101 | ← a |
| 14 | B | 大写 | 01110 | ← b |
| 15 | C | 大写 | 01111 | ← c |
| 16 | D | 大写 | 10000 | ← d |
| 17 | E | 大写 | 10001 | ← e |
| 18 | F | 大写 | 10010 | ← f |
| 19 | G | 大写 | 10011 | ← g |
| 20 | H | 大写 | 10100 | ← h |
| 21 | U | 大写 | 10101 | ← v |
| 22 | , | 标点 | 10110 | — |
| 23 | ! | 标点 | 10111 | — |
前 8 对是普通的大小写关系。第 9 对是作者的设计:v 的大写规定为 U。字母表里没有 V 和 u,所以这个规定不会和别的符号冲突。
V 时自动视为 U,输入 u 时视为 v,下面的在线工具也是这样处理的。在 QWERTY 键盘上,24 个符号集中在左手区域:数字键 1 2 3 0、主行 A S D F G H、上行 E、下行 Z 行的 C V B 以及逗号。大写和 ! 都只需要再按 Shift。下图中高亮的键就是“黄金区”。
| 键盘行 | 用到的按键 | 产生的符号 |
|---|---|---|
| 数字行 | 1 2 3 0(Shift+1) | 0 1 2 3 / ! |
| 上行 | E | e / E |
| 主行 | A D F G H | a d f g h / A D F G H |
| 下行 | C V B , | c v b , / C U B |
注意:S 不在字母表中,图中 S 键不高亮。Shift+V 在本体系中按规定输入为 U。
每个符号的信息量是 \(\log_2 24\approx 4.585\) bit。把长度为 \(n\) 的串当作一个 24 进制整数:
$$W(s)=\sum_{i=0}^{n-1}\mathrm{idx}(c_i)\cdot 24^{\,n-1-i},\qquad W\leftarrow 24\,W+\mathrm{idx}(c_i)\ \ (\text{Horner})$$ $$24^{13}=876\,488\,338\,465\,357\,824\ <\ 2^{64}=18\,446\,744\,073\,709\,551\,616\ <\ 24^{14}=21\,035\,720\,123\,168\,587\,776$$所以一个 uint64 最多装 13 个符号(\(13\log_2 24\approx 59.60\) bit)。另外 \(24^{13}\times 21=18\,406\,255\,107\,772\,514\,304<2^{64}\),剩余空间可以记录长度:
$$W'=21\,W+n,\qquad n=W'\bmod 21,\quad W=\lfloor W'/21\rfloor$$| 方案 | 符号 / 8 字节 | 有效熵 | 利用率 | 运算 |
|---|---|---|---|---|
| ASCII | 8 | 36.7 bit | 57.3% | 无 |
| 5-bit 定长 | 12 | 55.0 bit | 86.0% | 移位 |
| Base-24 + 长度 | 13 | 59.6 bit | 93.1% | 乘除 |
import math
ALIEN24_ALPHABET = "0123abcdefghvABCDEFGHU,!"
IDX = {c: i for i, c in enumerate(ALIEN24_ALPHABET)}
H = math.log2(24); MAX_LEN = 13
LEVELS = ["Ⅰ 白", "Ⅱ 浅灰", "Ⅲ 灰", "Ⅳ 深灰", "Ⅴ 黑"]
def normalize(s: str) -> str:
"""v 的大写是 U:'V' -> 'U','u' -> 'v';其他非法字符报错"""
s = s.replace("V", "U").replace("u", "v")
bad = [c for c in s if c not in IDX]
if bad: raise ValueError(f"非法符号: {bad}")
return s
def to_upper(c): i = IDX[c]; return ALIEN24_ALPHABET[i + 9] if 4 <= i <= 12 else c
def group(c):
i = IDX[c]; return "digit" if i < 4 else "lower" if i < 13 else "upper" if i < 22 else "punct"
def pack24(s: str) -> int:
assert 1 <= len(s) <= MAX_LEN
w = 0
for c in s: w = w * 24 + IDX[c] # Horner
return w * 21 + len(s) # 24**13 * 21 < 2**64
def unpack24(w: int) -> str:
w, n = divmod(w, 21); out = []
for _ in range(n): w, d = divmod(w, 24); out.append(ALIEN24_ALPHABET[d])
return "".join(reversed(out))
def cognitive_score(s: str) -> dict:
groups = {group(c) for c in s}
sw = sum(group(a) != group(b) for a, b in zip(s, s[1:]))
rep = sum(a == b for a, b in zip(s, s[1:]))
pair = sum(to_upper(a) == b for a, b in zip(s, s[1:]) if a != b)
return {"security": max(0.0, len(s) * H + len(groups) - 3 * rep - 2 * pair),
"memory": len(s) + 0.5 * sw}
def polar_level(s: str):
"""x = 人类记忆难度(左 人类易记 → 右 人类难记)
y = 电脑破译难度(下 电脑易拆解 → 上 电脑难破译)"""
sc = cognitive_score(s)
x = min(1.0, sc["memory"] / 20)
y = min(1.0, sc["security"] / (MAX_LEN * H + 4))
r = min(255, int(math.hypot(x, y) / math.sqrt(2) * 255))
theta = min(255, int(math.atan2(y, x) / (math.pi / 2) * 255)) # 0 = 沿 x 轴,255 = 沿 y 轴
tier = min(4, r * 5 // 256)
return (r << 8) | theta, r, theta, LEVELS[tier]
if __name__ == "__main__":
for p in ["0123", "abcdABCD", "3vA,b2!UhC0gE", "vU", "!!!!", "0aA,", "aaaaaaaaaaaaa", "0a,A1b!B2c"]:
w = pack24(p); assert w < 2**64 and unpack24(w) == p
lv, r, t, name = polar_level(p)
print(f"{p} {w} 0x{w:016x} {cognitive_score(p)['security']:.6f} {cognitive_score(p)['memory']:.1f} r={r} θ={t} 0x{lv:04x} {name}")
运行输出(密码、uint64 十进制、十六进制、安全分、认知负荷、Level、阶):
0123 13171 0x0000000000003373 19.339850 4.0 r=65 θ=160 0x41a0 Ⅱ 浅灰
abcdABCD 406385424992 0x0000005e9e757a60 38.679700 8.5 r=133 θ=155 0x859b Ⅲ 灰
3vA,b2!UhC0gE 2702787021072332578 0x25823a79c68d7722 63.604513 19.0 r=248 θ=131 0xf883 Ⅴ 黑
vU 6491 0x000000000000195b 9.169925 2.5 r=34 θ=139 0x228b Ⅰ 白
!!!! 6967279 0x00000000006a4fef 10.339850 4.0 r=46 θ=110 0x2e6e Ⅰ 白
0aA, 55402 0x000000000000d86a 20.339850 5.5 r=76 θ=139 0x4c8b Ⅱ 浅灰
aaaaaaaaaaaaa 3201087844830002497 0x2c6c8c6f4de9bd41 24.604513 13.0 r=136 θ=87 0x8857 Ⅲ 灰
0a,A1b!B2c 11417656200184 0x00000a6261578bf8 49.849625 14.5 r=192 θ=133 0xc085 Ⅳ 深灰
全部计算都在浏览器本地完成(BigInt),不会向服务器发送任何输入。
一个密码同时有两种成本:攻击者要付出的安全成本,用户要付出的认知成本。打分器把两者分开计算:
$$S_{\text{sec}}=\max\big(0,\ n\log_2 24+|G|-3R-2P\big),\qquad C_{\text{mem}}=n+\tfrac12K$$| 项 | 含义 | 作用 |
|---|---|---|
| \(n\log_2 24\) | 均匀随机熵 | 基础安全分 |
| \(|G|\) | 用到的分组数(数字 / 小写 / 大写 / 标点) | 每组 +1 |
| \(R\) | 相邻重复(如 !!) | 每处 −3 |
| \(P\) | 相邻大小写配对(如 aA、vU) | 每处 −2 |
| \(K\) | 相邻符号切换分组的次数 | 每次认知负荷 +0.5 |
在极坐标中:\(C_{\text{mem}}\) 决定横坐标 x(左 人类易记 → 右 人类难记),\(S_{\text{sec}}\) 决定纵坐标 y(下 电脑易拆解 → 上 电脑难破译)。
0123abcdABCD3vA,b2!UhC0gE方案02 修正:方案01 的坐标方向与作者手绘原图相反,轴标签也有歧义。本版严格按手绘图:左 = 人类易记,右 = 人类难记;下 = 电脑易拆解,上 = 电脑难破译。原点是白密码,右上角是黑密码。
| 方向 | 含义 | 坐标 |
|---|---|---|
| ← 左 | 人类易记 | \(x\to 0\) |
| 右 → | 人类难记 | \(x\to 1\) |
| ↓ 下 | 电脑易拆解 | \(y\to 0\) |
| ↑ 上 | 电脑难破译 | \(y\to 1\) |
两个坐标都取值于 \([0,1]\),所以点总在第一象限:
$$x=\min\!\Big(1,\ \frac{C_{\text{mem}}}{20}\Big)\ \ (\text{人类记忆难度}),\qquad y=\min\!\Big(1,\ \frac{S_{\text{sec}}}{13\log_2 24+4}\Big)\ \ (\text{电脑破译难度})$$ $$r=\min\!\Big(255,\Big\lfloor\frac{\sqrt{x^2+y^2}}{\sqrt2}\cdot 255\Big\rfloor\Big),\qquad \theta=\min\!\Big(255,\Big\lfloor\frac{\arctan2(y,x)}{\pi/2}\cdot 255\Big\rfloor\Big)$$ $$\text{Level}=(r\ll 8)\,|\,\theta,\qquad \text{阶}=\Big\lfloor\frac{5r}{256}\Big\rfloor\in\{\text{Ⅰ 白},\text{Ⅱ 浅灰},\text{Ⅲ 灰},\text{Ⅳ 深灰},\text{Ⅴ 黑}\}$$\(r\) 是到原点(白密码)的距离:越远,记忆难度和破译难度的总量越大,阶越高;右上角 \((1,1)\) 对应 \(r=255\),即黑密码。同心弧从原点一层层向外,就是手绘图中的五阶分层。
| θ 区间 | 角度 | 含义 | 评价 |
|---|---|---|---|
| 0–84 | ≈ 0°–30° | 靠近 x 轴:人类难记,但电脑易拆解 | 最差:付出了记忆成本却没换来安全 |
| 85–169 | ≈ 30°–60° | 靠近 45° 线:两种难度相当 | 平衡 |
| 170–255 | ≈ 60°–90° | 靠近 y 轴:人类易记,且电脑难破译 | 理想“灰”区:用最少的记忆换最大的安全 |
所以:\(r\) 说明“有多强”(五阶),\(\theta\) 说明“强得划不划算”。同一阶内,θ 越大越好。
| 阶 | r 区间 | 名称 | 适用场景 |
|---|---|---|---|
| Ⅰ | 0–51 | 白 | 公开标识、演示 |
| Ⅱ | 52–102 | 浅灰 | 低价值账户 |
| Ⅲ | 103–153 | 灰 | 日常账户 |
| Ⅳ | 154–204 | 深灰 | 重要账户 |
| Ⅴ | 205–255 | 黑 | 主密钥、离线备份 |
| 密码 | x 记忆难度 | y 破译难度 | r | θ | Level | 阶 | 解读 |
|---|---|---|---|---|---|---|---|
0123 | 0.200 | 0.304 | 65 | 160 | 0x41a0 | Ⅱ 浅灰 | 短而好记,电脑秒破 |
abcdABCD | 0.425 | 0.608 | 133 | 155 | 0x859b | Ⅲ 灰 | 有规律,偏弱 |
3vA,b2!UhC0gE | 0.950 | 1.000 | 248 | 131 | 0xf883 | Ⅴ 黑 | 满长随机,黑密码 |
aaaaaaaaaaaaa | 0.650 | 0.387 | 136 | 87 | 0x8857 | Ⅲ 灰 | 难记程度一般却极易拆:θ 小,最差区 |
0a,A1b!B2c | 0.725 | 0.784 | 192 | 133 | 0xc085 | Ⅳ 深灰 | 分组交替,深灰 |
| 维度 | 16字符(GP-16) | 24字符(本方案) |
|---|---|---|
| 字母表 | 0123456789ABCDEF | 0123abcdefghvABCDEFGHU,! |
| 每符号熵 | 4 bit | ≈ 4.585 bit |
| uint64 容量 | 16 符号(\(16^{16}=2^{64}\),100%) | 13 符号 + 长度(\(24^{13}<2^{64}\),93.1%) |
| 13 符号熵 | 52 bit | 59.6 bit |
| 编解码 | 移位、掩码 | 乘法、除法(Horner) |
| 等级码 | Level_16 = (r≪8)|θ | 同一公式,第一象限五阶 |
| 分组 | 数字 + A–F | 四进制数字 / 小写 / 大写 / 标点 |
| 大小写 | 不区分 | 区分,a–h↔A–H、v↔U |
| 主要优势 | 与机器完全同构 | 同样长度熵更高、分组更丰富、手写防呆 |
彩虹表预先计算 \(p_0\xrightarrow{H}h_0\xrightarrow{R}p_1\to\cdots\) 的哈希链,只保存链首和链尾。Base-24 空间结构规整,约简函数 \(R\) 很容易写,所以对攻击者也友好。
13 位满长空间 \(24^{13}\approx 8.76\times10^{17}\)。链长 \(t=10^6\) 时仍需约 \(8.8\times10^{11}\) 条链,每条 16 字节,约 14 TB。这对无盐快速哈希仍然可行,因此必须:
“高等文明”指能看到整个密码空间结构的观察者(见 GP-000102)。在它看来,人类的密码习惯有五个系统性缺陷:
GP-000102 的“零写盘度规漂移”指:代际更新只改变度规参数 \((\alpha_g,\beta_g)\) 与解释表,已写入的记录保持不变;读取时按当代度规重新解释即可,只有状态跨出原胞腔时才追加新记录。
在本方案中,16 位等级码 \(\text{Level}=(r\ll 8)|\theta\) 共有 \(2^{16}=65\,536\) 个胞腔。为每个胞腔存一个 uint16 的“当代解释值”,就得到一张漂移表:
$$|T_g|=2^{16}\times 2\ \text{B}=131\,072\ \text{B}=128\ \text{KB},\qquad \text{Level}^{(g)}=T_g[\text{Level}^{(0)}]$$| 组成 | 大小 | 说明 |
|---|---|---|
| 已存记录(uint64 + Level) | 不变 | 零写盘:代际更新不改动 |
| 漂移表 \(T_g\) | 128 KB / 代 | 65 536 × uint16,可整张放进 L2 缓存 |
| 度规参数 \((\alpha_g,\beta_g)\) | 几十字节 | 由它生成 \(T_g\),也可只存参数按需重建 |
| 跨胞腔追加 | 少量 | 只有越过阶边界的状态才追加记录 |
例如:算力提升后,令 \(r^{(g)}=\lfloor \alpha_g r\rfloor\)(\(\alpha_g<1\)),同一密码的阶会自动下降、提示用户升级,而数据库一行都不用改。
Holon(整体子)指“既是整体又是部分”的单元。延续 GP-000102 的“全息基因”:不存密码本身,而是存生成它的基因,并把基因分片,任意足够多的片段都能复原整体。
| 基因字段 | 位宽 | 含义 |
|---|---|---|
| uint64 载荷 | 64 | Base-24 打包值(或其密文) |
| Level | 16 | (r≪8)|θ 第 0 代等级 |
| 代际 g | 8 | 对应漂移表 \(T_g\) |
| 字母表版本 | 8 | 24 / 24a / 24grok 等变体 |
| 校验 | 32 | CRC-32,发现损坏 |
| 合计 | 128 bit = 16 B | 一个 Holon 单元 |
Holon 分片提高了可用性,但每个分片都必须当作敏感数据保护;载荷应先加密再分片。本章是概念框架,不是生产级方案。
⚠️ 说明:标有 综合摘要 的卡片是按不同评审视角整理的分析,不是任何真实 AI 产品的原话。标有 待更新 的卡片是占位,用于之后粘贴真实 AI 的评审意见(编辑 index.html 中 data-review-slot 对应的卡片即可)。
13 位满长约 59.6 bit,配合 Argon2id 时离线攻击代价很高。主要风险是人选密码的实际熵偏低,建议默认使用随机生成。
结论:有条件通过
四进制数字 0 1 2 3 符合习惯,大小写配对好记,v↔U 规定减少手写错误。“,” 和 “!” 在部分键盘、表格和 shell 中需要转义。
结论:通过,建议补充转义说明
Base-24 利用率 93.1%,比 5-bit 定长多装 1 个符号,并利用剩余空间存长度。代价是乘除运算,在嵌入式设备上比移位慢。
结论:通过
打包只是编码,不是加密;安全性完全依赖盐、慢哈希和随机性。定长整数便于常数时间比较。度规漂移和 Holon 仍是概念,需要形式化分析。
结论:概念可行,需进一步论证