2017-05-17 36 views
0

我有一個獨特的10位電話號碼,我想從它生成一個9個字符的唯一字母數字ID。它不需要是可逆的,但應該從相同的電話號碼生成相同的唯一字母數字ID。從10位數字的種子生成9字節的alphunumeric

+0

你似乎矛盾自己。一方面,你說你想從電話號碼中產生*獨特的*字母數字標識符,然後你說「它不需要是可逆的」。如果標識符是唯一的,那麼映射是可逆的(如果沒有其他的話,通過暴力)。無論如何:1)什麼編程語言? 2)你有什麼嘗試? –

+0

爲了唯一性嘗試使用某種形式的加密;不同的輸入保證產生獨特的輸出。對於字母數字輸出,請嘗試使用加密輸入的Base32轉換。不要將電話號碼視爲字符,而應視爲整數,這會減少所需加密的位大小。查看格式保留加密以獲得進一步幫助。 – rossum

回答

1

這是一種可能性。它爲0到9999999999範圍內的所有數字提供了一個唯一的9個字符的字母數字標識符,這樣反相不易計算(只有100億個可能的數字,真正的安全性是不可能的,但很容易使其難以實現對於臨時用戶)。它是基於使用一個原始根模p,其中p是選擇爲比10^10大的素數模冪:

1)首先添加1〜數,以確保它不爲0

2)然後將原始根提升到這個數字,mod p。這是很容易通過平方

3通過'X'做 與模冪)收件結果以十六進制

4)墊如果結果少於9位數。

這裏是一個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' 

非蠻力攻擊將需要解決的基極 - 17 discrete log問題(MOD 10000000259)。這並不是特別困難,但並不重要,可能足以阻止偶然的嘗試恢復原始號碼。只要p > 10^10p-1的十六進制表示的長度爲9個十六進制數字或更少,就可以用另一個素數替換p(並且a通過相應的原始根)。如果從服務器端將數字轉換爲標識符,那麼偶然的攻擊者將無法訪問ap,這會增加一層「安全通過隱匿」(可疑的安全性,但總比沒有好)。

+0

非常感謝,這就是我一直在尋找的。 – user1625348