0

難読化された文字列が次の条件に対処する必要がある場合、長さが 11 の英数字文字列を難読化する必要があります。
- 11 文字の長さのままにする必要があります。
- 英数字のみで構成する必要があります (つまり、10 桁 + 小文字 26 文字 + 大文字 26 文字で構成できます)。
- 元の文字列への難読化を解除する方法が必要です。

コード全体を難読化する必要はなく、一度に 1 つの文字列だけを難読化する必要があることに注意してください。
- コア Java でそれを行う方法はありますか?
-例、例へのリンク、またはそのようなコードのガイドラインへのリンクを希望する助けをいただければ幸いです。
- 誰かがそのようなケースに対処するサード パーティのパッケージを知っている場合は、そのリンクを残してください。

前もって感謝します!


Zoul が提案した回答/アルゴリズムについて: 私はすべてを実装しましたが、現在、隠蔽の問題に問題があります。これは私がしたことです:

  • 私は現在、random_striZoul によって提案された値を使用しました。これはテスト用です。13は必要ないので、11の長さにしたことに注意してください.

  • 上記の結果として、使用した ASCII 配列値を使用しましたが、これも 11: に切り捨てられます[114, 97, 110, 100, 111, 109, 95, 115, 116, 114, 105]

  • 利用可能な 62 文字すべての配列を準備してシャッフルすると、次のシャッフルされた文字配列が得られました。

[h、P、y、8、o、n、5、V、X、R、2、g、Q、p、Z、E、s、x、b、Y、m、v、u、c、j 、 9、
 w、4、I、l、z、B、U、K、S、f、7、1、0、i、k、M、q、e、r、F、3、C、J、W、O、 t、
 d、N、T、A、G、6、a、D、H、L]

このシャッフルされた配列はハードコードされており、今後はすべてのプログラム実行に対して一定です。

  • 11 文字の入力文字列をループし、各文字について、次のようにシャッフルされた配列から難読化された文字のインデックスを見つけます: 現在の文字 + ASCII_ARRAY[現在の文字インデックス]。たとえば、入力が「1bS0EMtBbK7」の場合、最初の文字が「1」の場合、(1 + 114) を実行すると、「1」に 114 を加えた ASCII 値が得られ、(49 + 114) が得られます。 --> 163.

  • 次に、シャッフルされた chars 配列で難読化された char のインデックスを見つけるために、163 modulo array length を実行し、このインデックスで char を取得します。

問題は、値がまだ連続していることです。つまり、2 つの連続する入力の場合、出力結果も連続します。ここで何が欠けていますか?前もって感謝します!

4

2 に答える 2

2

結果を読みやすくする必要があるため、適切な解決策は、文字で構成される配列内の文字をシフトすることa-zA-Z0-9です。シフトはモジュロ配列サイズになります。配列の最後に到達すると、再び先頭に戻ります。これはROT13に似ています。そして、これはあなたが1つずつシフトする方法です:

sampletextzZ9
tbnqmfufyuA0a

難読化を少し強化するために、文字ごとに異なるシフト定数を使用できます。ランダムに生成された 2 番目の文字列を用意し、ソース テキストの各文字を、ランダムに生成された文字の対応する文字の ASCII コードでシフトします。

random_string # token
114, 97, 110, 100, 111, 109, 95, 115, 116, 114, 105, 110, 103 # ASCII codes
text # source text to obfuscate

t + 114 = …
e +  97 = …
x + 110 = …
t + 100 = …

次に、ランダム トークンをコードに格納する必要があります。これはあいまいさによるセキュリティですが、これらのシナリオでは通常問題ありません。ランダム トークンは、印刷可能な文字に限定されず、バイナリにすることもできます。これにより、結果のオブジェクト コード内で少しカモフラージュされます。

文字列の連続性を隠す必要がある場合は、a-zA-Z0-9シフトに使用される配列をシャッフルできます。擬似乱数ジェネレーターを使用してシャッフルを実行し、シードを記憶して、難読化解除のためにまったく同じシャッフルを実行できるようにします。うまくシャッフルすれば、おそらくランダム トークンを削除して、同じ定数を使用して各文字をシフトすることができます。

難読化を解除するには、後方にシフトするだけです。ウィキペディアのCaesar cipherROT13も参照してください。

于 2013-03-03T08:04:11.417 に答える
1

入力文字列が 0 から 62^11-1 までの整数のセットと同等であると考える場合、本当に必要なのはその整数のセットの可逆順列だけです。次のことをお勧めします: 62^11 と互いに素な数 p を見つけます。次に、p のモジュラー乗法逆数である q を見つけます。つまり、p * q = 1 (mod 62^11) となるような q を見つけます。ここで、難読化するには、p (mod 62^11) を掛けます。難読化を解除するには、q (mod 62^11) を掛けます。

これを zoul の回答で提案された文字ごとにランダムに生成されたローテーションと組み合わせると、平均的なオブザーバーにはかなりランダムに見えるが、順序付けられた入力に簡単に変換できる一連の文字列になります。順序。

完全なランダムな順列を生成して保存する以外に、整数のシーケンスを可逆的に順列する暗号的に安全な方法があるかどうかはわかりませんが、これはおそらくサイズ 62^11 のリストには適していません。

于 2013-03-03T09:18:17.323 に答える