可能重复:
Finding Byte logarithm
我正在实现SAFER +算法,该算法使用16字节字节数组并对字节执行操作。
第一阶段包括与子键的XOR和ADDITON功能,这里没有问题。
第二阶段是非线性层,它对字节的值使用POWER和LOGARITHMS,这里的问题是当我们将值“取为45的基数”时,结果是浮点数加倍,而这个值应作为一个字节传递给第3阶段,以与第一阶段相同的方式处理。
答案 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的约定来避免数字溢出。