解码新泽西州驾照代码

逆向工程 加密 编码
2021-06-16 20:28:33

新泽西州的驾照号码不是随机的。它们遵循以下格式:Affff lllii mmyye,其中A是某人姓氏的第一个字母,ffff姓氏剩余字母到四位数数字lll的某种映射,是全名到三位数数字的映射,ii是代表中间名首字母的代码(根据下表:

|   | 6 | 7 | 8 |
|---|---|---|---|
| 1 | a | j |   |
| 2 | b | k | s |
| 3 | c | l | t |
| 4 | d | m | u |
| 5 | e | n | v |
| 6 | f | o | w |
| 7 | g | p | x |
| 8 | h | q | y |
| 9 | i | r | z |

其中首字母对应的数字为10*列号+行号。mm对应出生月份,对应出生yy年份。 e是(对应于值1-8眼睛的颜色BROBLUGRYGRNBLK,等等)

我唯一不明白的是名称如何映射到整数值。对于姓氏映射,我只有 5 个示例:(忽略第一个字母,因为它不会影响映射

aab    -> 0001
ackson -> 0062
eals   -> 2024
eimel  -> 2278
ounds  -> 6810

对于名字,我只有四个:

Alexander -> 019
Richard   -> 655
John      -> 407
Matthew   -> 529

有没有人知道如何完成实现,甚至是一个通用映射函数,它将最大 25 个长度的字符串散列到一个四位数或三位数,同时保持字典顺序(<​​=,而不是 <)。

我尝试过的事情

将每个字母转换为数字 1-26。 然后,仅取前四个数字,按照规则 26^3 * 第一个数字 + 26^2 * 第二个数字 + 26 * 第三个 + 第四个创建数字。然后,将这个数除以 26^4 + 26^3 + 26^2 + 26,再乘以 10000,将小数映射为 0-9999。这会产生以下映射:

aab -> 0000
ackson -> 0035
eals -> 1547
emiel -> 1722
ounds -> 5695

获取前 10,000 个最常见姓氏的列表。 按第二个字母排序,然后检查索引。这会产生以下映射:

aab -> 0005
ackson -> 0128
eals -> 2813
emiel -> 3235
ounds -> 7588

每个字母细分 10,000第一个数字(根据 1-26)将其切成 26 块之一。第二个将一块切割成 26 个之一,依此类推。这会产生以下映射:

aab -> 0000
ackson -> 0028
eals -> 1536
emiel -> 1648
ounds -> 5656

将前四个字母中的每一个都转换为 1-26。 将所有这些连接起来,将结果乘以 10,000,再除以 26262626。这会产生以下映射:

aab -> 0003
ackson -> 0392
eals -> 1908
emiel -> 1953
ounds -> 5792

对 0-25 执行上述操作,除以 25252525。 这会产生以下映射:

aab -> 0000
ackson -> 0008
eals -> 1584
emiel -> 1631
ounds -> 5623

附加样品

虽然我相信上述所有样本都是正确的,但我试图追踪更真实的样本数据点。我可以保证的如下:

姓氏

avis -> 0921
eals -> 2024
olff -> 6247
orello -> 6581

名字

Alexander -> 019
Andrew -> 042
Gabriel -> 270
Lena -> 456
4个回答

这还不是一个完整的答案,但也许我发现的内容可以与其他信息相结合,以提出完整的解决方案。

名字编码

如果我们假设是线性编码,那么我们就有了根据您的四个样本来解决这个问题所需的一切。如果我们将字母值视为a=0, b=1, ...大写或小写,则您的四个样本可以变成四个线性方程:

a*0 +b*11+c*4 +d*23 =  19  (Alex)
a*12+b*0 +c*19+d*19 = 529  (Matt)
a*9 +b*14+c*7 +d*13 = 407  (John)
a*17+b*8 +c*2 +d*7  = 655  (Rich)

由于我们有四个方程和四个未知数,因此可以使用简单但繁琐的代数或使用高斯消元以矩阵形式轻松求解。(对于看起来很丑的数学很抱歉,但与其他 StackExchange 站点不同的是,ReverseEngineering 显然不支持 MathML,这很不幸。)

如果这样做,您将获得以下值:

a = 83700 / 2279
b = 9484  / 2279
c = 16030 / 2279
d = −5441 / 2279

一切都非常整洁和准确,但有一个问题,即任何四个样本都会产生一些答案。问题是它是否适用于所有可能的名称,不幸的是,答案是否定的

更多样品

我在互联网上进行了一些搜索,并找到了更多样本。这是一张俄罗斯间谍的新泽西执照图片,这是一份警察指南(参见第 60 页)。本来自 NJ MVC 的小册子将“Dennis J. Driver”编码为 D4047-16371

如果我们在这些新样本上尝试上面的名字方程,它们会失败,所以不太正确。结果表明加权并不那么简单。搜索时,我还发现安大略和魁北克的许可证似乎使用相同的名字和姓氏编码。因此,例如,此安大略临时许可证验证“Dennis”在安大略和新泽西的编码为 163。

当我对所有名字值与第一个字母l(编码为a=0, b=1, ...进行线性回归时,我得到R^2 值为0.986的方程32.42*l+52.55这表明这是高度线性的。

姓氏实验

我尝试了一个非常简单的姓氏编码实验,这是一种非常简单的方法,在您尝试过的事情列表中没有提到。那是简单地将每个字符视为基数为 26 的数字。使用第一个字符后面的 4 个字符,正确获得了“Baab”和“Jackson”的编码,但没有其他匹配。

其他编码方案

我对现有的编码方案做了一些搜索。Soundex 既容易找到又容易打折,但它有很多变体,并且可能使用了一些扩展变体。我无法找到产生这些特定值的 Soundex 变体,但我在此过程中学到了一些有趣的东西。

首先,也许并不奇怪,长期以来一直需要尝试使用某种编码来匹配数据库中的名称。通常,该问题称为记录链接,通常被认为是将可能拼写错误的名称与数据库中可能匹配的子集进行数学运算。Soundex 已用于此目的,但发现有些缺乏有效性。

我找到的其他计划,或至少找到了参考资料,包括:

  1. 编辑距离
  2. Jaro 记录链接方法
  3. 各种语音算法
  4. Cutter-Sanborn Four-Figure用于对图书馆的作者姓名进行编码

这个stringmetric 项目似乎是一个很好的算法实现集合,并带有原始描述论文的链接,但我还没有尝试过所有这些。

也许如果有人这样做,他们可以在这里报告。

我在上面没有看到这个,但是男性或女性也被编码了。在最后五位数字中,前 2 位是出生月份。男性是 01-12。增加了女性 50。所以从 51(一月)到 62(十二月)还有,我的名字是亚历山德拉,它也是 019,就像你的亚历山大例子一样。没有中间名反映为 00 我知道有中间名 alexandra 的朋友有 61 = (ii) 另一个,是 Serafina 中间名 82 = (ii) 另一个,是 Dorothy 中间名 64 = (ii) 我建议收集更多要比较的名称样本

如果您仍在尝试解决这个问题,我已经取得了一些进展。在 u/jccool5000 在 reddit ( post ) 的帮助下,他们收集了 900 多个样本,其中大部分来自安大略省。AFAIK、安大略和新泽西共享相同的编码——魁北克,不太确定。我做了一些数据操作来解决这个问题。

从姓氏的数字开始,4 位数字中的第 1 位对应于姓氏的第 2 个字母,因为第 1 个字母已直接编码为许可证编号的第一个字母。

0 = A
1 = B C D
2 = E
3 = F G H
4 = I J K
5 = L M N
6 = O
7 = P Q R
8 = S T
9 = U V W X Y Z

剩下的三个数字也代表姓氏的第二个字母,从 000 到 999。但是,每个第二位数字都有自己的 000-999 范围。也就是说:

  • 假设姓氏 XA 是 X0001
  • 假设姓氏 XAZZZ 是 X0999,或者接近 999。
  • 假设姓氏 XB 是 X1001
  • 假设姓氏 XDZZZ 是 X1999,或者接近 999。
  • 假设姓氏 XE 是 X2001
  • 假设姓氏 XEZZZ 是 X2999,或者接近 999。

您可以参考上表查看 999 何时会重置回 000。这只是我目前发现的模式。我不知道这些数字是如何分配给名字的。

名字代码要简单得多,但同时,它的分布也不均匀。与名字代码的区别在于它只从 000 (Aaron) 到 799 (Zoe 的 796)。我所说的不均匀分布是指以 A 开头的名称,范围从 000 到 071,其中 071 有一些以 BA 开头的名称。同时,以 Y 开头的名称被限制在不小于 785 到不大于 792 的小范围内。

许多州使用一种叫做 SoundEx 的东西来生成驾照号码(有时你甚至会在政府表格和/或计算机屏幕上看到 SoundEx 要求他们提供驾照号码。)

soundex 系统旨在通过语音映射听起来与接近值相似的名称,即使它们的拼写可能大不相同,例如 Pheiffer 与 Fifer)

另请参阅 Metaphone 之类的内容。此外,他们可能不会直接使用 soundex。

维基百科