字节数组上的非线性操作

时间:2011-12-02 18:24:38

标签: c# math encryption logarithm

  

可能重复:
  Finding Byte logarithm

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

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

第二阶段是非线性层,它对字节的值使用POWER和LOGARITHMS,这里的问题是当我们将值“取为45的基数”时,结果是浮点数加倍,而这个值应作为一个字节传递给第3阶段,以与第一阶段相同的方式处理。

2 个答案:

答案 0 :(得分:1)

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

exp | log
----+----
  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。

答案 1 :(得分:0)

您可以使用Linq表达式执行此操作,如下所示

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

但这会截断双倍,因为它必须做......

在查看SAFER +之后

编辑,它使用Log45(0)= 128的约定来避免数字溢出。