素数被利用在 密码学 上,所谓的 公钥 就是将想要传递的信息在编码时加入砠数,编码之后传送给收信人,任何人栶到此信息后,若没有此收信人所拥有砄 密钥 ,则解密的过程中(实为寻找素数的蠇程),将会因为找素数的过程( 分解质因数 )过久而无法解读信息。
哪些数是素数
人们很难捕捉到素数的分布规律。素数之间的间隔要多大有多大,对于无论多大的自然数n,总是存在两个素数,它们之间的距离大于n而且其间没有素数。理由很简单,对于n,以下n个整数是相继排列的,而且都是合数:(n+1)!+2,(n+1)!+3,…(n+1)!+(n+1)。可见在(n+1)!+1和(n+1)!+(n+2)之间没有素数。
几千年来,历代数学家都希望能找到一个数学公式,把全部素数都表示出来。欧拉找到公式N=n2+n+41,当n=-40,-39,…0,1,…39时,N都是素数,只有80个素数。后来有人证明,N=n2+n+72491,当n=0,1,2,…11000时都是素数,也只有一万多个。可以证明,整系数多项式是不可能用来表示全部的素数,而不表示合数的。
十七世纪费马猜测,2的2n次方+1,n=0,1,2…时是素数,这样的数叫费马素数,可惜当n=5时,232+1就不是素数,至今也没有找到第六个费马素数。
18世纪发现的最大素数是231-1,19世纪发现的最大素数是2127-1,20世纪末人类已知的最大素数是2859433-1,用十进制表示,这是一个258715位的数字。
素数与密码
本世纪七十年代,几位美国数学家提出一种编码方法,这种方法可以把通讯双方的约定公开,然而却无法破译密码,这种奇迹般的密码就与素数有关。
人们知道,任何一个自然数都可以分解为素数的乘积,如果不计因数的次序,分解形式是唯一的。这叫做算术基本定理,欧几里得早已证明了的。可是将一个大整数分解却没有一个简单通行的办法,只能用较小的素数一个一个去试除,耗时极大。如果用电子计算机来分解一个100位的数字,所花的时间要以万年计。可是将两个100位的数字相乘,对计算机却十分容易。美国数学家就利用了这一点发明了编制容易而破译难的密码方式。这种编码方式以三位发明者姓氏的首字母命名为RSA码。
例如,A、B两位通讯者约定两个数字N和e,A想要将数字M发给B,他不是直接将M发出,而是将M连乘e次,然后除以N,将余数K发给B。B有一个秘密的数字d,连A也不知道,他将K连乘d次,然后除以N,得到的余数就是原来的数M。
数字是这样选择的,N=p×q,p、q是选定的两个大的素数,选取e、d,使ed-1是(p-1)×(q-1)的倍数,而且使e和p-1、q-1没有公因数,这是容易做到的。根据这个方法,编码规则可以公开,可是由于N太大,分解得到p、q几乎是不可能的,他人也就无从知道d,不可能破译密码了。
RSA提出后,三位发明家曾经公布了一条密码,悬赏100美元破译,他们预言,人们至少需要20000年,才能破译,即使计算机性能提高百倍,也需要200年。但只过了不到18年,这个密码就被人破译,意思是:“The magic words are squeamish ossifrage”。这个密码如此快的破解,是因为全世界二十多个国家的六百多位工作者自发联合起来,利用计算机网络,同时进行因式分解,并不断交流信息,汇总计算结果,用了不到一年的时间,就将129位的N分解成64位和65位的两个素数的积。计算机网络将分解效率提高了近万倍,这是发明者当初没有预想到的。但是,如果提高位数到200或300位,工作量将会大的不可思议,即使计算机技术有重大突破,破译也几乎不可能。