如何对大数字进行数学运算

时间:2014-04-28 06:26:01

标签: math cryptography biginteger plc iec61131-3

我有一个关于处理非常大数字的问题。我试图运行RSA算法,并假设我有512位数d和1024位数n。 decrypted_word = crypted_word ^ d mod n,isn' t?但那些d和n都是非常大的数字!非标准变量类型可以处理我的512位数字。无处不在,rsa最后需要512位素数,但实际上我怎么能对这样的数字执行任何数学运算呢?

还有一个想法。我无法使用额外的库。我用java生成我的素数,使用BigInteger,但在我的系统上,我只有基本的变量类型,STRING256是最大的。

2 个答案:

答案 0 :(得分:3)

假设您的最大整数大小为64位。在大多数语言中,字符串对于数学运算没有用,所以忽略字符串类型。现在选择一半大小的整数,即32位。这些数组可以解释为基数2 32 中数字的数字。有了这些,您就可以进行长additionmultiplication,就像您习惯使用基础10和笔和纸一样。在每个基本步骤中,您将两个32位数量组合在一起,以产生32位结果和可能的一些进位。如果您使用64位算术进行基本操作,则将这两者作为单个64位变量的一部分,然后您必须将其拆分为32位结果数字(通过位掩码或简单截断强制转换)和剩余进位(通过位移)。

分工更难。但是如果已知除数,那么你可以使用乘法来做division by constant。考虑一个例子:除以7. 7的倒数是1/7 = 0.142857 ....所以你可以乘以它来获得相同的结果。显然我们不想在这里做任何浮点数学。但你也可以简单地乘以14286然后省略结果的后六位数。如果您的股息足够小,这将是正确的结果。多么小?好吧,你将x / 7计算为x * 14286/100000,因此误差将是x *(14286/100000 - 1/7)= x / 350000,因此只要x <350000,你就安全了。只要RSA设置中的模数已知,即只要密钥对保持不变,就可以使用此方法进行整数除法,也可以使用它来计算余数。但请记住使用base 2 32 而不是base 10,并检查逆常数所需的位数。

您可能需要考虑另一种方法,即可更轻松地进行模数减少,即使n是可变的。您可以使用2 1024 -n到2 1024 -1,而不是将剩余部分表示为数字0到n-1。因此,如果您的初始数小于2 1024 -n,则添加n以转换为此新编码。这样做的好处是,您可以执行缩减步骤而不进行任何划分。 2 1024 相当于2 1024 -n在此设置中,因此基本模数减少将通过将一些数字拆分为其较低的1024位及其较高的余数来开始。较高的休息将右移1024位(这只是数组索引的变化),然后乘以2 1024 -n最后添加到下半部分。您必须这样做,直到您可以确定结果不超过1024位。这通常取决于n,所以对于固定的n你可以预先计算(对于大n我预期它在加法后是两个减少步骤但是在乘法之后是hree步骤,但是请仔细检查那个)而对于变量n你必须在运行时检查。在最后,您可以返回到通常的表示:如果结果不小于n,则减去n。如果n> 2 512 ,所有这些应该如所描述的那样起作用。如果不是,即如果模数的最高位为零,则可能需要进一步调整。 Haven没有想到这一点,因为到目前为止我只使用这种方法来获得接近2的幂的固定模量。

现在进行指数化。我非常建议你为此binary approach做。当计算x d 时,从x开始,x 2 = x * x,x 4 = x 2 * x 2 ,x 8 = ...,即计算所有2的幂指数。您还保留了一些初始化为一个的中间结果。在每个步骤中,如果在指数d中设置了相应的位,则将相应的功率乘以该中间结果。所以,让我们说你有d = 11。然后你计算1 * x 1 * x 2 * x 8 因为d = 11 = 1 + 2 + 8 = 1011 <子> 2 。这样,如果你的指数有512位,你最多只需要1024次乘法。其中一半用于二次幂幂,另一半用于合二权的幂。所有这一切中的每一次乘法都应该立即进行模数减少,以保持较低的内存要求。

请注意,上述取幂过程的速度将以这种简单的形式取决于实际设置的d中的位数。因此,这可能会打开side channel attack,这可能会让攻击者访问有关d的信息。但如果你担心侧通道攻击,那么你真的应该有专家来开发你的实现,因为我想可能会有更多我没有想到的。

答案 1 :(得分:0)

您可以编写一些可以在Microsoft下执行的宏,用于+, - ,x,/,modulo,x power y等函数,这些函数通常适用于任何小于十位或十万位的整数(实际 - 不是理论上的) - 限制CPU的内部存储器)。请注意,逻辑与小学时的逻辑完全相同。

例如为:P = 1819181918953471(2 ^ 8091)除法器 - 1,Q =((2 ^ 8091) - 1)/ P,模(2 ^ 8043; Q)= 233225049958594489297642487352160527465088733631637179020483553367609406976159908715897287655088134346657328040319280454485827759404751268378805196413090186685926225334347451870049183927154428744934254443850937186​​05461240482371261514886704075186619878194235490396202667733422641436251739877125473437191453772352527250063213916768204844936898278633350886662141141963562157184401647467451404036455043333801666890925659608198009284637923691723589801130623143981948238440635691182121543342187092677259674911744400973454032209502359935457437167937310250876002326101738107930637025183950650821770087660200075266862075383130669519130999029920527656234911392421991471757068187747362854148720728923205534341236146499449910896530359729077300366804846439225483086901484209333236595803263313219725469715699546041162923522784170350104589716544529751439438021914727772620391262534105599688603950923321008883179433474898 0343182858891291155565414796707610403880753529341373268832872458218889994744210011557215665478139704968095559963138546311374907742975648819018776876281761067719182069454343508735096796381098878319322794706310976040189398557889905426270726260492817841528070976594852388385609583168882381372375485905284508903287800802868440387963251014889779885496395239880028250552864697402278423885387518709716916175431416581423130599343269248678461517497775752793103942965621915306028170145494646142538868438326459468664663629504846295542588557144017854729877278410408058162244136570364999591177012490284351913277572766442729447434792962687498289275655599514419451432696568663552103104822355202205802135334250162989939036157537143434560145774792254359150312258635519116051170293930856329473738726353301817188206698368301473129489660286829605182252139602188672078254178300162810361219593847073917183338928496652485128029266016762511997116989787253990489543258874103170604006204127972401297871588391649693824985377425 79233544463501470239575760940937130926062252501116458281610468726777710383038372260777522143500312913040987942762244940009811450966646527814576364565964518092955053720983465333258335601691477534154940549197873199633313223848155047098569827560014018412679602636286195283270106917742919383395056306107175539370483171915774381614222806960872813575048014729965930007408532959309197608469115633821869206793759322044599554551057140046156235152048507130125695763956991351137040435703946195318000567664233417843805257728。

最后一步花了大约0.1秒。

wpjo(willibrord oomen on academia.edu)