Fea程序密码学

时间:2016-12-09 15:09:09

标签: maple modular-arithmetic

我只是想知道是否有人可以帮我一个简单程序的代码。我已经编写了这个程序,但我似乎正在努力计算具有较大值en的值。

但是现在当我尝试计算以下fea(2, 968365546456, 132132156132132)时,会出现错误说:

  

错误,(在fea中)数字异常:溢出

任何人都可以帮我处理代码,以便我可以修复错误吗?我假设它需要一个if语句?

到目前为止我的代码是:

fea := proc (x, e, n)
    (x^e) mod n;  
end proc;

The procedure

2 个答案:

答案 0 :(得分:2)

主题mod的帮助页面说明了这一点:

"To compute `mod`(i^n,m) where i is an integer, it is undesirable
 to use this "obvious" syntax because the powering will be
 performed first over the integers (possibly resulting in a very
 large integer) before reduction modulo m. Rather, the inert
 operator &^ should be used: i &^ n mod m.  In the latter form,
 the powering will be performed intelligently by the mod operation."

所以让我们看看:

restart;

12367^ 13 mod 87; # for basic test

                          67

fea := proc (x, e, n)
   (x &^ e) mod n;  
end proc:

fea(12367, 13, 87);

                           67

# The following returns very quickly.

fea(2, 968365546456, 132132156132132);

               131464616935876

您的原件试图计算中间结果:

restart;

2^968365546456;
Error, numeric exception: overflow

答案 1 :(得分:1)

计算能力的最佳方法之一是Square and Multiply Algorithm for Modular Exponentiation

此算法采用以下形式

Square and Multiply Algorithm for Modular Exponentiation

例如 Example

该算法的枫树proc如下

Maple code

假设我们想要计算^ b mod n。这一行

for i从0到b而2 ^ i< = b do c:= c + 1 end do

计算数字b的二进制长度。这一行

对于i从0到c-1,如果irem(m,2,'q')= 1那么B [1,c-i]:= 1结束if; m:= q end do

获得数字b的二进制形式并放置在矩阵中。这一行

for i to c do m:= irem(m ^ 2,n);如果B [1,i] = 1则m:= irem(m * a,n)如果结束则结束

做平方和乘法算法。请举一个例子来学习它。

如果你想获得(a ^ b mod n),你应该先运行代码和 之后写Pow(a,b,n)并输入密钥。比如你的 数字,运行程序后你应该写

Pow(2,968365546456,132132156132132)

在输入密钥后,您会看到以下消息

2 ^(968365546456)mod(132132156132132)=(131464616935876)

请参阅source code。 这个领域最好的书是Introduction to Cryptography with Maple