1

5桁の数字を難読化したい

気になる難読化された数値のプロパティ:

  • 他の難読化された数値と衝突することは不可能です (またはフォールバックとして、非常にありそうもない)
  • それも5桁の数字です(アルファベットは使用しないでください)
  • 計算の支援がなければ、通常の人間が簡単に決定することはできません (たとえば、「2 を掛けて 5 を引く」のような明白なものではありません)。
  • それはアルゴリズムです...可能なすべての5桁の数字のルックアップテーブルを対応するハッシュまたはその他の「ブルートフォース」手法に保存するのとは対照的です

私が気にしない難読化された数値のプロパティ:

  • 繰り返し可能かどうか、つまり「12345」が常に「73624」になる場合、私は大丈夫です
  • 暗号的に安全かどうか

これまでのところ、私の要件に合ったものは見つかりませんでした...しかし、これは「良い」解決策が存在しないのではなく、記憶力の低下、不完全な教育、または疑わしいライフスタイルの選択によるものであることを願っています.

C# に簡単に変換できる例はおまけです。

アップデート:

今のところ単純なビットマッピングを行うというアイデアを使用して調査しています。

   static List<int> bitMapping = new List<int>() { 8, 6, 9, 3, 7, 5, ... etc... };

    private static int Obfuscate(int number)
    {
        var bits = new bool[bitMapping.Count];
        foreach (var ordinal in bitMapping)
        {
            var mask = (int)Math.Pow(2, ordinal);
            var bit = (mask & number) == mask;
            var mappedOrdinal = bitMapping[ordinal];
            bits[mappedOrdinal] = bit;
        }

        var obfuscatedNumber = 0;
        for (var ordinal = 0; ordinal < bits.Length; ordinal++)
        {
            if (bits[ordinal])
            {
                obfuscatedNumber += (int)Math.Pow(2, ordinal);
            }
        }
        return obfuscatedNumber;

これまでのところ、私の要件のほとんどを満たしているようです。

4

2 に答える 2

2

それはあなたのニーズには単純すぎるかもしれませんが、機能し、追加ほど明白ではないかもしれないものは XOR 演算です:

12345 ^ 65535 = 53190
53190 ^ 65535 = 12345

コメントで述べたように、衝突を避けるために (元の数値のすべてのビットが反転されるように)、2 番目のオペランドが (2 n - 1) の形式であることが重要です。また、ビット数が最初のオペランド以上になるように、十分な長さである必要があります。

結果を 5 桁の数値にするために、左に 0 を埋め込む必要がある場合もあります。

于 2013-01-30T00:31:40.880 に答える
0

衝突を望まない場合は、乗算/除算が行われます。その場合、私は

  1. 5桁のシード値を数値に追加します。6桁にオーバーフローした場合は、6桁目を破棄します。

  2. 一貫した方法で数字を並べ替えます。

例えば

12345 + 97531=109876または09876オーバーフローを破棄した後68097に並べ替え

于 2013-01-30T00:18:04.783 に答える