C# 字节数组的非线性运算

C# 字节数组的非线性运算,c#,math,encryption,logarithm,C#,Math,Encryption,Logarithm,可能重复: 我正在实现SAFER+算法,该算法使用16字节字节数组并对字节执行操作 第一阶段包括带子键的XOR和ADDITON函数,这里没有要提到的问题 第二个阶段是非线性层,它对字节值使用幂和对数,这里的问题是,当我们将值的对数“以45为底”时,结果是浮点双精度,这个值应该作为一个字节传递给第三阶段,以与第一阶段相同的方式进行处理。您可以使用Linq表达式执行此操作,如下所示 inputBytes.Select(b => b == 0 ? (byte)128 : Convert.ToB

可能重复:

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

第一阶段包括带子键的XOR和ADDITON函数,这里没有要提到的问题


第二个阶段是非线性层,它对字节值使用幂和对数,这里的问题是,当我们将值的对数“以45为底”时,结果是浮点双精度,这个值应该作为一个字节传递给第三阶段,以与第一阶段相同的方式进行处理。

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

inputBytes.Select(b => b == 0 ? (byte)128 : Convert.ToByte(System.Math.Log(Convert.ToDouble(b), 45))).ToArray();
但这将截断双精度,因为它必须这样做


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

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

exp | log ----+---- 0 | 1 1 | 45 2 | 226 3 | 147 ... | ... 128 | 0 ... | ... 255 | 40 ---------
例如,在这种设置中,log45(131)=
log[131]
=63,4538=
exp[38]
=59。

问题是如何将日志以45为底?或者如何将结果转换为字节(或者它应该是指字节数组?)问题是如何使用日志的结果并将其保留为字节,以便我可以继续使用算法,因为结果是浮点值,当存储在字节中时,它将被trunicated。亲爱的Henk,它实际上不是重复的,因为我认为这个问题大家都不清楚,所以我试着澄清一下情况。当然它必须截断,除非你想把每个双精度数组转换成字节数组???@Eng.Aws-基本的想法是你改进了一个问题,而不是再发一次。请参阅编辑链接和FAQ.inputBytes.select?我应该如何定义以使其可用?谢谢。Select是一种Linq扩展方法,从.NET3.5开始提供:要使用Linq,只需在代码中添加“using System.Linq”。日志是mod 257。在这种情况下,Math.log没有意义。您不需要使用任意精度的算术,32位整数就足够了。但是您必须编写自己的modPow函数。它应该只需要10-15行。是的,你当然可以自己写,但我知道.NET有一个
biginger
类,非常类似于我在这里展示的Java。
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;