从 10 位数字的种子生成 9 字节字母数字

generate 9 byte alphunumeric from a seed of 10 digits number

我有一个唯一的 10 位数字 phone 号码,我想从中生成一个 9 个字符的唯一字母数字 ID。它不需要是可逆的,但应该从相同的 phone 数字生成相同的唯一字母数字 ID。

这是一种可能。它为 0 到 9999999999 范围内的所有数字提供了一个唯一的 9 字符字母数字标识符,其逆运算不易计算(只有 100 亿个可能的数字,真正的安全是不可能的,但它很容易使它变得困难对于临时用户)。它基于使用原根 mod p 的 mod 平方求幂,其中 p 是选择大于 10^10 的素数:

1) 先给数字加1,确保不是0

2) 然后将原根提升到这个数,mod p。这很容易做到 mod平方取幂

3) 将结果写入十六进制

4) 如果结果少于 9 位,则用 'X' 填充。

这是一个 Python 实现:

p = 10000000259 #prime
a = 17 #primitive root mod p

#assumes num is an integer in range 0 to 9999999999:

def unique_id(num):
    num += 1 #so num is in range 1 to p-1
    num = pow(a,num,p)
    h = hex(num)[2:]
    return (h + 'x'*(9 - len(h))).upper()

例如:

>>> unique_id(12024561111) #White House phone number
'1614351BX'

非暴力攻击需要解决 base-17 discrete log 问题 (mod 10000000259)。这不是特别难,但很重要,可能足以阻止恢复原始数字的随意尝试。您可以将 p 替换为另一个质数(并且将 a 替换为相应的原始根),只要 p > 10^10p-1 的十六进制表示为 9 个十六进制数字或更少在长度上。如果从数字到标识符的转换保留在服务器端,那么偶然的攻击者将无法访问 ap,这会添加一层 "security through obscurity"(可疑的安全性,但聊胜于无。