第三章 如何改进和优化RSA算法
这章呢,我想谈谈在实际应用出现的问题和理解。
由于近期要开始各种忙了,所以写完这章后我短时间内也不打算出什么资料了=- =(反正平时就没有出资料的习惯。)
在讲第一章的时候我提到过两个函数在真实应用时舍弃掉的,为何这样说呢?
因为在实际应用中,生成了数据规模N和两把密钥E与D即可进行RSA算法的运作,在应用RSA时只需要一个a^b%c幂模运算函数,所以优化点集中在了数据类型和数据加密解密速度上。
注意RSA函数有个特点,就是根据源数据产生的密文一定是属于n内的,因为一旦被加密数据大于n就会导致的密文不唯一(当同余式的任意整数k不唯一),基于此性质可知,这函数还是一个一对一函数,也就是说RSA的工作原理其实就是洗牌(你也可以拿RSA来充当不重复随机数生成函数来用哦~)。
那么我们就来谈谈优化吧,首先确定好待加密的单一数据规模,也就是加密的位长,用C语言的话来说就是,是一次加密一个字节(char)呢还是四个字节(int)呢?这取决于算法的执行环境,这个类型的选择可能会出现在单片机的开发上,像51单片机这样的默认处理都是一字节,从优化的角度上来讲就应该使用对应处理速度的数据类型,也就是每次加密char数据,而在一般的intel家的都是32位以上的了,如果还在用char的处理方案估计要急死还有浪费(本来就可以处理更多但你非要拿四分之一出来处理),所以对于32位机的就应该直接应用int了。
但是,不知道还有同学有没有注意到一个问题,就是a^b%c幂模运算函数设计的问题,对于常规的算法就是对a^b的结果执行mod运算。可是我们知道a^b是极其容易超出本身的最大值的,那么这将会无法算出正确的值而导致数据错乱,解决办法有更换更大的数据类型或采用不定长的数据类型(大数运算库gmp之类的),还有改进算法,不过今天我就不讲前面两种方案了,直接说第三种方案吧,第三种方案其实就藏在我的另外一篇日志中,据此点击传送门~
至此我们来说说RSA的安全性吧,它主要体现在哪里呢?然后又将如何改进安全性呢?
如果我们要改进一个密码学算法,就要从如何破解它去展开思考,要破解RSA算法,我们可以从数据规模N与两把密匙E和D下手。
首先确保RSA算法的所有值都不被外人得知,假如我从数据规模N下手,由于网上大部分代码(人)喜欢用两个质数p和q来产生数据规模N(特殊的欧拉函数性质),这将导致N与φ(N)满足N=pq,φ(N)=(p-1)(q-1)。那么我们要做的事情就是对N进行因式分解,分解成两个质数的乘积,在计算机看来这可是个苦力活啊,因为普通的计算机处理问题和大部分普通人一样,最擅长的就是蛮力解决问题,比如要算6可以分解成哪几对两个数乘积则有(1,6)(2,3),这对你来说很简单吧,现在换65536呢,你能写出有多少对乘积?当然,换成量子计算机的并行运算这种压根不是问题,而RSA的难度仅仅在这里,而这个在现在的计算机看来还真的没什么难度。所以我们要破解数据规模N可以利用素数表来得到为两素数乘积为N的所有可能素数对,然后再运用筛法来获取满足E与φ(N)互质的乘法逆元D,最后再通过一下中间人攻击(在A和B之间监听后转发的家伙)记录A与B两人的RSA密文通信,只要将所拥有的记录解密出来后的数据没有重合则可以依据数据量来表示破解程度,但一旦出现重合现象,则退回上层换密钥E重新产生密钥D再尝试,如果还不行就只能换产生数据规模N的两个质数p和q,所以针对这种的破解是相当轻松的。
为了提高破解难度我们应该不要使用特殊欧拉函数来生成数据规模,用标准欧拉函数生成的数据规模虽然也是可以被筛法试出来的,但是它意味着第三方破解者的试除法的可能性数据更加庞大,不仅是围绕素数表而是围绕所有整数的可能。不过就现在而言,有个应用在量子计算机上的秀尔算法已经无视了这种问题,遇到这样的被攻破也是正常,难道我们就这样放弃了吗,不,我们还可以针对中间人攻击的密文再加密,因为只要没有可用的密文源你根本没法展开破解,那么从这点上我们可以利用其他方法来混淆密文,比如使用AES等这类对称密钥加密算法,这类算法仅依靠一个私有的公共key来进行数据的加解密。当然,一旦key被外人知道了基本就GG了,可是当做到这样的时候,外界的破解重心就转移到了AES上,相当于给RSA上了一堵墙。只是日防夜防,家贼难防。对于直接反编译代码(逆向工程)拆开源程序的静态数据的破解(直接获取密钥E和数据规模N)我们又该怎么防呢?
这个问题我将会在以后尝试讲解 Diffie-Hellman算法以及离散对数知识的运用(ECC问题),他们有一个很神奇的特点就是你可以用任意的数据生成指定唯一的数据,缺点就是需要大数库的支持,因为这样多对一的映射会导致要加密数据规模N必然得有大于当前数据规模N更多的数,ECC算法如今已经逐步取代RSA开始在一些国家机关使用了,在我国有个叫国家商用密码管理办公室的网站,并在国家密码管理局发布了SM2椭圆曲线公钥密码算法文件和推荐曲线参数,也就是ECC算法文件,啊,跑题了,就当给大家科普一些密码学方面的资料吧= -=。
至此所有章节已经讲完,不知道有没有同学觉得有点意思或者说有收获呢(代码),希望有更多科班出身的同学多多关注后端,因为前端那些是给路人和培训出来的人玩的。如果想在编程方面比别人有更多优势,依鄙人之见,可以从操作系统,编译原理,算法设计,数学建模,密码学,机器学习,计算机视觉,计算机网络,高并发集群设计,数学函数实现等方面下手,望各位同学获取优异成绩之余也能多多动手编程,最最最后附上一句话:要想人前装逼,必先人后受苦。