-1

重複の可能性:
バイト対数の検索

SAFER+ アルゴリズムを実装しています。このアルゴリズムは 16 バイトのバイト配列を使用し、バイトに対して操作を実行します。

最初のフェーズには、サブキーを使用した XOR および ADDITON 関数が含まれます。ここで言及する問題はありません。

2 番目のフェーズは、バイトの値に対して POWER と LOGARITHMS を使用する非線形レイヤーです。ここで問題となるのは、値の「基数 45 まで」のログを取得する場合です。結果は浮動小数点 double であり、この値を渡す必要があります。フェーズ 1 と同じ方法で処理されるバイトとしてフェーズ 3 へ。

4

2 に答える 2

1

次のようなべき乗表を作成します。

指数 | ログ
----+----
  0 | 1
  1 | 45
  2 | 226
  3 | 147
... | ...
128 | 0
... | ...
255 | 40
----------

「対数」値は 45 exp % 257 ですmodPow。このテーブルを作成するには、関数 (数値を累乗し、ある値を法とする) を備えた任意精度の算術ライブラリが必要です。通常、ゼロの対数は定義されていないため、"exp" 128 の値は特殊なケースであることがわかります。

「ログ」列でそれを見つけて、数値の対数を計算します。その行の「exp」列の値は対数です。

初期化のスケッチは次のとおりです。

BigInteger V45 = BigInteger.valueOf(45);
BigInteger V257 = BigInteger.valueOf(257);
int[] exp = new int[256];
int[] log = new int[256];
for (int idx = 0; idx < 256; ++idx)
  exp[idx] = V45.modPow(BigInteger.valueOf(idx), V257).intValue() % 256;
for (int idx = 0; idx < 256; ++idx)
  log[exp[idx]] = idx;

この設定では、たとえば、log 45 (131) = log[131]= 63、および 45 38 = exp[38]= 59 です。

于 2011-12-02T19:07:47.557 に答える
0

次のようにLinq式を使用してこれを行うことができます

inputBytes.Select(b => b == 0 ? (byte)128 : Convert.ToByte(System.Math.Log(Convert.ToDouble(b), 45))).ToArray();

しかし、これは、必要に応じて、doubleを切り捨てます...

SAFER +を見た後に編集され、数値オーバーフローを回避するためにLog45(0)=128という規則を使用します。

于 2011-12-02T18:49:44.177 に答える