7

ここに私が最善の解決策を作成しようとしている問題があります。[0...N]の範囲の負でない整数の有限セットがあります。このセット内の各数値を文字列として表現し、そのような文字列を逆方向に元の数値に変換できる必要があります。したがって、これは全単射関数でなければなりません。

追加の要件は次のとおりです。

  1. 数値の文字列表現は、元の数値を少なくともある程度難読化する必要があります。したがって、 f(x) = x.toString()のような原始的なソリューションは機能しません。
  2. 文字列の長さは重要です。短いほど良いです。
  3. Kの文字列表現を知っている場合、 K+1の文字列表現を推測するのは(ある程度)自明ではないことを望みます。

p.1 & p.2 の明らかな解決策は、Base64 (またはすべての値に適合する BaseXXX) 表記のようなものを使用することです。しかし、追加の労力を最小限に抑えて p.3 に収めることができるでしょうか? 常識では、BaseXXX 値に対して全単射の「String <-> String」関数がさらに必要であることがわかります。助言がありますか?または、3 つの要件すべてを満たすために使用する BaseXXX よりも優れたものがあるでしょうか?

4

5 に答える 5

1

これをあまり安全にする必要がない場合は、BaseXXX でエンコードした後に単純な対称暗号を使用できます。たとえば、整数のキー シーケンス [n₁、n₂、n₃...] を選択して、Vigenere 暗号を使用できます。

暗号の背後にある基本的な考え方は単純です。各文字 C を C + K (mod 26) としてエンコードします。ここで、K はキーの要素です。先に進むにつれて、次の文字のキーから次の番号を取得し、キーの値がなくなるとラップアラウンドします。

ここには実際には 2 つのオプションがあります。最初に数値を baseXXX の文字列に変換してから暗号化するか、同じ考え方を使用して各数値を 1 文字として暗号化することができます。その場合は、 から に変更mod 26mod N + 1ます。

考えてみると、さらに単純なオプションはxor、キーと値の要素だけにすることです。(Vigenere 式を使用するのとは対照的に。) これは難読化にも同様に機能すると思います。

于 2012-01-12T10:10:33.890 に答える
1

この方法は要件 1 ~ 3 を満たしていますが、計算コストが少し高すぎる可能性があります。

  1. p > N+2大きすぎない素数を見つける
  2. を法とする原始根 、つまり乗法次数を法とする数を求めるgppp-1
  3. のため0 <= k <= Nに、みましょうenc(k) = min {j > 0 : g^j == (k+2) (mod p)}
  4. f(k) = enc(k).toString()
于 2012-01-12T11:23:05.410 に答える
1

長さ の表を作成しますM。このテーブルは、0 からM-1ランダムな順序で異なる短い文字列に数字をマップする必要があります。表の文字列を使用して整数を基数としてM表現し、数値の桁を表します。単純な反転でデコードします。

ではM=26、各桁に文字を使用できます。またはM=256、各桁に 1 バイトを使用します。

リモートでも良い暗号化アプローチではありません!

于 2012-01-12T11:37:09.013 に答える
0

では、元の数値を難読化する文字列が必要ですが、str(K) がわかっている場合に str(K+1) を決定できるようにしますか?

やってみたらどうですか、秘密はどこですかf(x) = (x + a).toString()aその場合、外部のユーザーはxから判断できませんf(x)が、文字列 "1234" がある場合、たとえば不明なx場合は "1235" が にマップされると確信できますx+1

于 2012-01-12T10:10:03.077 に答える
0

p。1およびp。3も少し矛盾していて、少し曖昧です。

整数の16進表現を使用することを提案します。

17 => 0x11
123123 => 1E0F3
于 2012-01-12T10:11:44.543 に答える