2017-05-17 12 views
0

私は一意の10桁の電話番号を持っているので、それから9文字の固有の英数字のIDを生成したい。それは可逆である必要はありませんが、同じ電話番号から同じ一意の英数字のIDを生成する必要があります。10桁の数字のシードから9バイトの英数字を生成する

+0

あなたは自分自身と矛盾しているようです。一方では、電話番号から*ユニーク*の英数字の識別子を生成したいとし、それから "それは可逆である必要はありません"と言います。識別子が一意である場合、マッピングは可逆的です(他に何もない場合はブルートフォースによって)。いずれにしても、1)どのようなプログラミング言語ですか? 2)何を試しましたか? –

+0

一意性のために、ある形式の暗号化を試してください。独自の出力を生成するために異なる入力が保証されています。英数字出力の場合は、暗号化された入力のBase32変換を試してください。電話番号を文字として扱うのではなく、整数で指定すると、必要な暗号化のビットサイズが小さくなります。さらなるヘルプのために、フォーマットを保存する暗号を見てください。 – rossum

答えて

1

ここに1つの可能性があります。逆数が簡単に計算できないように0から9999999999の範囲のすべての数字にユニークな9文字の英数字の識別子を与えます(100億の可能な数だけ真のセキュリティは不可能ですが、難しくするのは簡単ですカジュアルユーザーの場合)。それはp10^10よりも大きくなるように選ばれた素数である原始根のモッズpを使用して、べき乗剰余演算に基づいています。

1)まず、それは0

ていないことを確認するために、数に1を加えます2)次に、プリミティブのルートをこの数字に変更します。修飾子はpです。結果がより少ない9数字を持っている場合、これは)進

4に結果を書く)'X'によってパッド

3を二乗することにより、べき乗剰余演算で を行うのは簡単です。例えば

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() 

:ここ

は、Python実装である

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

非ブルートフォース攻撃は、ベース17 discrete log問題(MOD 10000000259)を解決する必要があります。これは特に難しいことではありませんが、ささいなことではなく、元の番号を回復しようとする偶然の試みを断念するのにはおそらく適切です。 p > 10^10およびp-1の長さが9桁の16進数である限り、pを別の素数(および対応する基本ルートによってa)に置き換えることができます。数字から識別子への変換がサーバー側に残っていると、偶然の攻撃者はapにアクセスすることができず、「不明瞭なセキュリティ」のレイヤーを追加することになります。

+0

ありがとう、これは私が探していたものです。 – user1625348

関連する問題