进行一次RSA加解密,你需要上百毫秒,但是别人也许仅需10多毫秒,这是质的差别,所以效率问题是密码算法实现首先要考虑的问题。
这几天一直在写一个大数处理类,这可是公钥密码学的基础。其实现在开源的密码学函数库有很多,像:GMP、Crypto++、LibTomCrypt(LibTomMath)、OpenSSL、Miracl。这些开源的库大多效率已经很高,只是想想自己学信安,一个大数运算类都没有实现,心中难免有点虚。
想想是用纯C进行封装,还是尽量使用C++的优势呢?上课的时候,听我们密码学应用老师说过,其实如果C++程序写得好,一样能达到C的语言的效率,而C程序写得好,基本上可以达到60%的汇编程序。于是冒然选择了C++,而且使用了STL。这里使用了STL里的vector和deque容器,因为它们可以简化很多代码。我只用400行写出来的东西,那些库却用了上千行。但是测试我的效率,发现却别他们低一个数量级。程序中空间和时间果真是不可能都达到最好的效果的!要么用时间换空间,要么用空间换时间。
在最先完成的一个版本中,我并没有考虑效率的问题。唯一考虑了的是充分利用CPU的字长,所以我的大数的处理时2^32进制的。但后来,在效率上和其他库进行了对比以后,发现效率相差太远了。我想是不是没有优化的结果?于是我尝试着对代码进行优化。结果是一次1024位的除法运算速度提高了2个毫秒。这让我看到了希望,但是,我绞尽脑汁,黔驴技穷(可能个人能力有限)。
我实在是受不了了!STL虽好,但是它给程序带来了构造和析构对象的额外开销,而且容器的强大的内存分配机制也会给程序带来一定的开销。所以我准备放弃这个使用STL的版本,重新设计!
这次实践让我学到许多,而且也暴露了一些我编程时的问题。认识来源于实践,认识又指导我们再实践!加油!