可能重复:
查找字节对数
我正在实现 SAFER+ 算法,该算法使用 16 字节字节数组并在字节上执行操作。
第一阶段包括XOR和ADDITON功能与子键,这里没有问题。
第二阶段是非线性层,它对字节的值使用 POWER 和 LOGARITHMS,这里的问题是,当我们对 Value 的“以 45 为底”的 log 时,结果是浮点 double,应该传递这个值到阶段 3 作为一个字节,以与阶段 1 相同的方式处理。
可能重复:
查找字节对数
我正在实现 SAFER+ 算法,该算法使用 16 字节字节数组并在字节上执行操作。
第一阶段包括XOR和ADDITON功能与子键,这里没有问题。
第二阶段是非线性层,它对字节的值使用 POWER 和 LOGARITHMS,这里的问题是,当我们对 Value 的“以 45 为底”的 log 时,结果是浮点 double,应该传递这个值到阶段 3 作为一个字节,以与阶段 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。
您可以使用 Linq 表达式执行此操作,如下所示
inputBytes.Select(b => b == 0 ? (byte)128 : Convert.ToByte(System.Math.Log(Convert.ToDouble(b), 45))).ToArray();
但这会截断双精度,因为它必须这样做......
在查看 SAFER+ 后进行编辑,它使用 Log45(0)=128 的约定来避免数字溢出。