RSA算法内核态移植
最近项目中需要在内核态使用RSA加密算法,加密算法对我来说是一篇空白,到网上了解了些,比较好的加密跟认证的库有openssl,crypto++等,但这些库很庞大,而且很多东西因为考虑到复用,而不是单独为实现一个RSA算法而实现,在用户态使用非常方便,只有下载openssl的源码,安装即可调用其实现的加密算库,包括AES,Blowfish,RSA,一系列散列算法MD4,MD5, SHA1等等。由于库太大,RSA需要用到大数运算,素数生成算法等等,随机数生成算法,移植到用户态相当的复杂。网上也由热心的人用C写的源码,但效率和稳定性确实不敢恭维,生成公私密钥对要等几秒钟,估计是大数运算,素数判断算法实现的太笨重了。Java,C++的实现版本很多,看来大家都喜欢使用方便的类库来达到自己的目的,而不关心细节啊。
在google code上查了下,代码很多,但都是有特殊目的,作为某个特定项目的一部分,所以其实现可能考虑到应用环境,基本上没有找到需要的东西。
后来从阿福那里了解到比较小的库xyssl,这是sourceforge上的一个项目,但sourceforge这些天不知道什么原因,页面显示上有问题,所以没帮到我太大的忙,rsa library,xyssl等小的项目都做的比较好,但确不能获得其详细信息,期待sourceforge的复苏。
在网上down了xyssl-0.8的代码,安装,工作正常,接着分析rsa涉及到的文件,分离出来,根据需要进行改动,写makefile(感觉这块要加强,稍复杂点的东西感觉有点应付不过来),能让其正常工作,开始往内核移植,随机数的生成要重新实现,编写读文件模块,从/dev/random,/dev/urandom读随机数,64bit除法要重新写(内核中64bit整数的除法不能直接用/进行),打印调试信息的东西全得改,内存分配模块全得改,跟时间有关的一些东西也需要改……最终没能在内核态跑通,虽然我觉得该考虑的问题已经考虑全面了,但最后有个文件里面关于读取硬件时间的部分还得改,而此时代码很多地方已经被我改得面目全非了,而且不清楚改动是否正确。
开始考虑更简单的版本xyssl的最原始版本,下了xyssl-0.2的代码,rsa的实现一块代码量少了很多,吸取0.8版本的教训,先把要考虑的问题都想了一遍,觉得可行,开始工作,最终能跑在内核态,但一运行就死机,后来发现了一些问题,改正后模块能加载了,然后就是错误链的修正,最终还是以失败告终。
后来发现一个很小的rsalib,但只实现了加解密功能,不能生成密钥对,花了点时间移到内核态,正常工作,剩下的问题就是考虑公私密钥对的生成,由于我时间有限,下周要集中精力复习矩阵论,自己实现时间肯定时间来不及,首先理解代码细节,而不是接口……..所以就想先在用户态生成密钥,传到内核态,等考完矩阵论有时间,再把这部分工作做了。
在用户态生成公私密钥(xyssl库)给rsalib使用,关键是要考虑大数运算实现方法差异(base不同)和密钥编码格式的不同,花了点时间看了大数运算的接口和实现以及可打印密钥的编码格式,并生成密钥测试后,终于能正常工作。
当然,现在的实现方式很不好,造成很多冗余的代码,争取考完后有时间把这块优化一下,把密钥对的生成在内核态实现了,这样也更安全嘛。这次需要吸取的教训就是做事前应好好分析下工作量及可能性,整体的把握一下,而不是遇到没想到的问题时干着急,正应证了一句话:凡事预则立,不预则废!
如果哪位仁兄有RSA的内核实现版本,请跟我联系一下,感激不尽!