韦根 26 与 34:位数切分到底意味着什么
2026-09-30 · 1515 词
韦根是一根线,不是一种卡片格式。读卡器通过两条线把位送给控制器 —— DATA0 上的脉冲表示 0,DATA1 上的脉冲表示 1,每个脉冲大约 100 微秒,脉冲间隔约 1 毫秒 —— 控制器再根据脉冲数重建出一个数字。没有时钟线,没有包长度,没有校验和。韦根 26 和韦根 34 里的"26"与"34",说的就是这一串脉冲的位数。
真正带来麻烦的是这些位内部发生了什么。一帧里装着设施码、卡号和两个校验位,而两个字段的分界线落在哪里是厂商约定,帧本身并不声明。于是两套系统可以读同一张卡、走同一根线、却对"这是谁"给出不同答案 —— 而且全程没有任何报错。
帧,逐位拆开
韦根 26 [P][ 设施码 8 位 ][ 卡号 16 位 ][P]
韦根 34 [P][ 设施码 16 位 ][ 卡号 16 位 ][P]
P = 校验位,帧的首尾各一个
26 位布局 —— HID H10301 以及绝大多数 125 kHz 门禁安装使用的就是它 —— 是:
- 第 1 位 —— 偶校验,覆盖第 2–13 位
- 第 2–9 位 —— 设施码,8 位,
0–255 - 第 10–25 位 —— 卡号,16 位,
0–65,535 - 第 26 位 —— 奇校验,覆盖第 14–25 位
34 位布局 —— HID H10306 以及与它同形的 AWID 34 位凭证 —— 把分界线挪了很远:
- 第 1 位 —— 偶校验,覆盖第 2–17 位
- 第 2–17 位 —— 设施码,16 位,
0–65,535 - 第 18–33 位 —— 卡号,16 位,
0–65,535 - 第 34 位 —— 奇校验,覆盖第 18–33 位
所以卡号在两者里一样大。多出来的那 8 位全部投给了站点字段:34 位把不同设施码的数量从 256 提升到 65,536。这就是全部差别,也是"门、租户或楼栋超过 256 个的站点最终会迁移"的原因。
分界线无法被猜出来
帧长度是有共识的,怎么切分不是。同样的总位数,不同产品族可以切得不一样 —— 36 位在一家是 17/17 的站点与卡号切分,在另一家是 8 位站点码加 16 位卡号、且位偏移完全不同 —— 而有些 34 位凭证用同样的 16/16 形状,却把站点字段当发行方码而不是设施码来解读。传输里没有任何东西记录用了哪种约定,后果很直接:
用错布局配置的控制器不会失败,它会产出一个不同的、合法的数字。
把一张 34 位凭证交给按 26 位配置的控制器,就是最好的例子。解析器取这一串脉冲的前 26 位:第 1 位成了它的偶校验位,第 2–9 位成了一个 8 位设施码 —— 而它其实是 16 位设施码的高半段 —— 第 10–25 位成了卡号,而它其实是设施码的低半段接上真实卡号的高半段。帧的最后 8 位,包括这一帧自己的奇校验位,在解析器已经停止读取之后才到达。于是几乎总是校验失败,读卡器看起来坏了,而那张卡完全正常。
实践中比"硬失败"更常见的是静默错配:一种能解析、能通过校验、却指向另一个人的切分。只有 16 位卡号时,碰撞不是理论问题。一个已经登记过 65,535 张以上凭证的站点,或者把编号复用在控制器已经看不见的设施码之间的站点,最终会出现两张在控制器眼里是同一个人的卡 —— 而日志会给出一张属于错误门禁的合法号码。
校验位就是全部的错误检测预算
32 位载荷上两个校验位是很薄的防线,值得确切知道它有多薄。
第 2–13 位的偶校验意味着这十二个数据位加上校验位里"1"的个数是偶数。如果丢了一个脉冲 —— 门闸电机在一条没屏蔽的电缆旁边启动,是经典成因 —— 位数变化,校验失败。如果同一段校验窗口里丢了两个脉冲,个数又变回偶数,这一帧就通过了。韦根没有任何办法发现,因为帧里没有别的东西可以交叉比对:没有长度字段,没有序号,没有 CRC。
这也是为什么校验是按帧的两半分别计算的。两个 12 位窗口能抓住单个 26 位窗口抓不住的错误模式,代价就是那两位本身。这是 1950 年代对 1950 年代问题的答案,而它之所以活到今天,是因为替代方案 —— 双向协议 —— 需要现场根本不存在的线。
从帧里读出一个号码
控制器拿到帧之后,它存的号码就是卡号字段,通常以十进制打印。这正是卡号形态开始模糊的地方:同一张凭证可能被一个工具打印成 26 位十进制卡号,被另一个打印成整帧的原始 hex —— hex 是字节的一对一表示而不是编码,正如 hex、Base32、Base64 与 Ascii85 的对比 所说 —— 被第三个打印成反转字节序的 UID。如果你手上的号码对不上,字段边界和字节序是两个独立的问题 —— 卡号形态详解 给出了排查它们的顺序,而 卡号形态转换器 会把你粘贴进来的值列出全部形态,包括那个能解释大多数"系统里的号码不对"工单的反转读法。
在那之前有一个有用的自查:26 位卡号不可能超过 65,535。如果你数据库里的号码更大,它就不是从 26 位卡号字段来的 —— 它来自原始 UID、34 位以上的布局,或者一次切分错误的帧。
26 位转换成 34 位是不可能的
没有任何算术能把 26 位凭证变成 34 位,因为这里什么也没被计算 —— 被移动的是字段边界。诚实的选项只有两个:
- 重新配置控制器,改成凭证本来使用的格式。这是一个控制器设置项;当读卡器、卡和控制器都支持你要切换到的布局时,这是便宜的路径。
- 重新登记凭证到新的切分方式里,也就是重新发卡或重新读卡,并重建门禁名单。
做不到的是"转换号码":把 900 系列的卡号映射进另一个设施码,产出的凭证在这栋楼里没有任何一张卡携带。如果迁移摆在桌面上,值得先做的审计是统计不同的设施码数量,以及在用卡号的最大值 —— 这两个数字决定了你是真的需要 34 位,还是只是觉得方便。
比格式活得更久的那条安全注脚
韦根是单向且无认证的。读卡器说话,控制器听着;没有任何加密,而设施码就印在卡上,任何订过一次凭证的人都知道。125 kHz 门禁卡还可以用常见设备轻易克隆,而卡号通常是连续的,所以抓到一帧的攻击者对相邻号码有很好的猜测。
这些都不是换到 34 位能解决的 —— 它靠替换协议解决,也就是 OSDP 做的事:双向、带安全通道与加密,因此读卡器可以被认证,单靠一张克隆卡不够。26 位之所以到处都是,不是因为好,而是因为线、读卡器和门都已经装好了,而格式跟着它们一起走。
如果你在排查一张在两套系统上读起来不同的凭证,先看位数切分,再看字节序 —— 就按这个顺序。帧没有撒谎,它们只是回答了和你所问的稍有不同的那个问题。