当前位置: 首页 > 编程语言 > C#

加密中如何计算对数?分享

时间:2023-04-10 15:03:31 C#

加密中的对数如何计算?我正在尝试通过对字节执行非线性函数来实现SAFER+。该算法需要计算以45为底的字节的对数,我不明白该怎么做。log45(201)=1.39316393当我将它分配给一个字节时,该值被截断为1,我无法恢复准确的结果。我该如何处理?密码学经常使用质数域,在本例中为GF(257)。创建一个如下所示的幂表:exp|日志----+----0|11|452|2263|147...|...128|0......|...255|40----------"log"值为45exp%257。你需要一个带有modPow函数的任意精度算术库(将一个数提升到一个幂,通过一些值取模)来构建这张桌子。您可以看到128的“exp”值是一个特例,因为通常零的对数是未定义的。通过在“log”列中找到一个数来计算它的对数;该行的“exp”列中的值是对数。这是初始化的草图:BigIntegerV45=newBigInteger(45);BigIntegerV257=newBigInteger(257);byte[]exp=newbyte[256];for(intidx=0;idx使用此设置,例如,log45(131)=log[131]=63,and4538=exp[38]=59。(我从来没有写过C#;我是只是从BigInteger文档中猜测;数据类型可能有错误。)所以你有一个字节值(从0到255)并且你想获取logbase45,并将其存储在另一个字节中?正如其他人所说,这样做会损失一些准确性。但是,您不仅可以将双精度结果转换为字节。255的对数基数45约为1.455675。您可以将其存储在一个字节中,但会损失一些精度,乘法它乘以一个常数因子。什么常数因子?你可以使用100,这会给你一个值145,但你会失去几乎一半的字节范围。由于您要表示的最大值是1.455675,因此您可以使用常数乘数255/log45(255),或大约175.176。这有多好让我们看看...varmult=255.0/Math.Log(255,45);Console.WriteLine("比例因子为{0}",mult);双errMax=double.MinValue;双errMin=double.MaxValue;双errTot=0;for(inti=1;i在我的机器上的.NET4下,最大误差为2.1419%,平均误差为1.0501%。您可以通过舍入Math.Pow的结果来减少平均误差...即:vara=Math.Round(Math.Pow(45,(double)b??/mult));这将平均误差降低到0.9300%,但将最大误差增加到3.8462%。向我们展示代码可能有何帮助,但我怀疑你的问题来自存储结果。如果你想存储一个非整数,你不想把它放入一个字节,因为那样会截断它(如你所见)。而是将结果存储为double或更合适的值:doubleresult=math.log(154,45);我应该补充一点,我不确定SAFER+是什么,所以这个答案可能不是很有用,但希望它能为您指明正确的方向.这不是一个真正的答案,但查看此问题的一小部分用户可能对将double转换为byte[]感兴趣。所有可以做的是:doubletheDouble=78.24435;byte[]theResult=BitConverter.GetBytes(theDouble);和byte[]theByteArray=newbyte[]{0,4,2,3};//例如双theCorrespondingDouble=BitConverter.ToDouble(theByteArray);这使用了我认为最初存在于.NET中的BitConverter。以上是C#学习教程:加密中如何计算对数?如果分享的所有内容对您有用,需要了解更多C#学习教程,希望您多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: