字节数组上的非线性运算
本文关键字:非线性 运算 字节数 数组 字节 | 更新日期: 2023-09-27 18:16:37
可能重复:
查找字节对数
我正在实现SAFER+算法,该算法使用16字节字节数组,并对字节执行操作。
第一阶段包括XOR和ADDITON函数和子键,这里没有问题。
第二阶段是非线性层,它对字节的值使用POWER和LOGARITHMS,这里的问题是,当我们将log取为值的"以45为底"时,结果是浮点双精度,该值应作为字节传递到第3阶段,以与第一阶段相同的方式处理。
创建一个取幂表,如下所示:
exp|log----+----0|11|452 | 2263 | 147…|。。。128|0…|。。。255 | 40---------
"log"值为45exp%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;
使用这种设置,例如,log45(131(=log[131]
=63,并且4538=exp[38]
=59。
您可以使用如下的Linq表达式
inputBytes.Select(b => b == 0 ? (byte)128 : Convert.ToByte(System.Math.Log(Convert.ToDouble(b), 45))).ToArray();
但这将截断双精度,因为它必须这样做…
编辑查看SAFER+后,它使用Log45(0(=128的约定来避免数字溢出。