-1

可能重复:
查找字节对数

我正在实现 SAFER+ 算法,该算法使用 16 字节字节数组并在字节上执行操作。

第一阶段包括XOR和ADDITON功能与子键,这里没有问题。

第二阶段是非线性层,它对字节的值使用 POWER 和 LOGARITHMS,这里的问题是,当我们对 Value 的“以 45 为底”的 log 时,结果是浮点 double,应该传递这个值到阶段 3 作为一个字节,以与阶段 1 相同的方式处理。

4

2 回答 2

1

创建一个如下所示的幂表:

经验 | 日志
----+----
  0 | 1
  1 | 45
  2 | 226
  3 | 147
... | ...
128 | 0
... | ...
255 | 40
---------

“log”值是 45 exp % 257。您需要一个带有modPow函数的任意精度算术库(将数字乘以幂,取模某个值)来构建此表。您可以看到“exp”的值 128 是一种特殊情况,因为通常零的对数是未定义的。

通过在“log”列中找到一个数字来计算它的对数;该行的“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();

但这会截断双精度,因为它必须这样做......

在查看 SAFER+ 后进行编辑,它使用 Log45(0)=128 的约定来避免数字溢出。

于 2011-12-02T18:49:44.177 回答