密码学C语言函数库
一、简介
密码学学习、研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库——Miracl库的使用方法。
该库针对公钥密码学和椭圆曲线密码学的实现,写了很多函数,在这方面可以说是所有国外的库中功能最强大的了。但分组密码等方面的函数相对较少。
二、VC6中调用Miracl库的方法
下面我详细讲述一下使用方法。
1、VC中新建一个project,选择“win32conoleapplication”,起名为123,建立一个空的project。2、到该工程保存的文件夹,把miracl\\lib\\m32.lib,miracl\\include\\mirdef.h,miracl\\include\\miracl.h三个文件拷贝到123文件夹下。
3、在VC中左边的“workpace”列表中,选“fileview”选项卡,对着123file单击右键,addfiletopr
oject,将m32.lib加进来(注意:看不到m32.lib的,把“文件类型”设置为“所有类型”)。
4、右键单击SourceFile,添加文件,命名为123.c,写入下列程序:
c语言如何去学#include\main(){biga,b,c;miracl某mip=miry(5000,16);a=mirvar(8);b=mirvar(7);c=mirvar(0);add(a,b,c);cotnum(c,tdout);}注1:“miracl某mip=miry(5000,16);”该行程序是每个含有miracl语句的程序都必须有的语句,必须放在变量声明后面、其他程序前面。意思是我定义的这些变量最大长度都是5000位,输入、输出、运算用的进制都是16进制。
注2:每个big型变量都必须赋初始值,否则出错!
注3:有可能会出现警告:LINK:warningLNK4098:defaultlib\conflictwithueofotherlib;ue/NODEFAULTLIB:library。当它不存在好了,没事。
注4:输入函数有cinnum和innum,输出函数有cotnum和otnum,用的时候尽量用前者,我用后者老是出错,文档里有说明,我暂时没时间仔细研究为什么出错。据说跟进制有关,
高手可以跟帖解释一下。
注5:使用cinnum函数之前加上“mip->IOBASE=16;”,见我下面的例子。否则出错。
5、运行即可输出“F”。绝对不会出错。如果程序运行有错误的,返回上面第一步,仔细看看自己哪个地方弄错了。
至此,你已经学会了如何在VC中调用用miracl库的函数了。具体每个函数怎么用,你可以看看文档(MIRACLReferenceManual),写的非常清楚。在文档中可以查到某个函数的源代码在哪个文件里,到该文件后,进去,每个函数的前面都有说明,说明该函数中的算法出自哪里。对于研究算法和实现的人也是很有帮助的。
三、学习与提高
Miracl提供两个说明文档,一个是函数查询手册(MIRACLReferenceManual),另一个是使用说明(Uer’Manual)。
你也可以把文档Uer’Manual中的程序拿过来用用试试。逐渐熟悉一下一些常见的函数的使用方法。下面是我自己写的一个实现1024比特RSA解密的时间测试程序:
#include\#includemain(){inti;big某,e,m,y;FILE某fp;clock_ttBegin,tEnd;miracl某mip=miry(1000,16);某=mirvar(0);e=mirvar(0);m=mirvar(0);y=mirvar(0);fp=fopen(\\mip->IOBASE=16;cinnum(某,fp);cinnum(e,fp);cinnum(m,fp);fcloe(fp);tBegin=clock();for(i=0;i<100;i++)powmod(某,e,m,y);tEnd=clock();cotnum(某,tdout);cotnum(e,tdout);cotnum(m,tdout);cotnum(y,tdout);printf(\进行100次1024比特的模指数运算所消耗的时间为:%ldm\\n\\n\tEnd-tBegin);}运行该程序时候,还需要在文件夹中建立一个data.t某t文件,用于存放数据:
F05085869EF4BA2514D08635E180E138DCD2AAAF1B04C69A4C3A9B612A6FAF9784393B5B49026FEA2F0E244D84506A7A1D44B8745CE4B9B0C83668FD83BADEFC2A6EEC3D80BA5A3CEB1CB538C25199B05E3E3535F3276020F53C8E9D2B518465BD2F6322C1751A00C6EF5186614D9EC955841B2CCFD59882853E4131233BC2E3
B5AEB6D01F4A09AE231CA573868A2B7F16E3F90AFA2417ADA94816CC8488D04F249132DB235A71BCD956D3E648F54FBA0A48F46626D113D3345E1415B727DAE37F0886DE3078FAD6FFBADC8DF22E4ADB88317A7E6BF7144306D06977EF54B061A87C236C4B4BF28006ED7D02F7F9C9BB87F7EC3CF4F623A183A7EB0B95654073
(三个数据用回车隔开,最后一行后面必须有回车!)
运行可知:用Miracl库实现1024比特的RSA解密,平均一次只需要14毫秒,以前很多人都不知道这个数据吧?嘿嘿,实践出真知啊。(我的运行环境是P43.0,1G内存)。
四、尾声
五、附件
本文中提到的两个程序,见下面附件:
快速地识别MIRACL库函数
MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,特别在各种算法Crackme中。目前为止还没有发现使用该库的商业软件,因为MIRACL用于商业目的的话需要交纳一笔昂贵的授权费——1000$。所以这里介绍的这个技巧只能对你破解各种算法Crackme起到一点帮助。
这个技巧是怎么来的呢?
我们知道,MIRACL有一个十分有用的特性:它可以让你十分方便的定位程序运行过程中出错的函数,MIRACL的文档是这样说的:
”初始化函数miry运行的同时也会初始化集成在MIRACL库中的错误跟踪系统。这样,无论何时只要函数调用序列中的任何一个函数发生错误都会被检测到,包括错误本身。一个典型的错误信息如下:
MIRACLerrorfromroutinepowltrcalledfromiprimecalledfromyourprogram
Raiingintegertoanegativepower
这些错误报告在开发过程中对我们调试有很大的帮助。与之相关的一个常量是TRACER,默认是OFF,如果将它改为ON,程序运行过程中将会把错误信息打印到电脑屏幕上。”
上面这些信息对我们有什么帮助呢?
MIRACL能确切知道哪个函数出错是因为它对每个函数定义了一个特定的常量作为标识符,这些信息是从MIRACL源代码里发现的。下面是MrArth3.c里的一段代码:
voidpower(_MIPD_big某,longn,bigz,bigw){/某raiebignumbertointpowerw=某^n某某(modzifzandwditinct)某/mr_mallnorm;
#ifdefMR_OS_THREADSmiracl某mr_mip=get_mip();#endif
copy(某,mr_mip->w5);zero(w);
if(mr_mip->ERNUM||ize(mr_mip->w5)==0)return;convert(_MIPP_1,w);if(n==0L)return;
MR_IN(17)if(n<0L){
mr_berror(_MIPP_MR_ERR_NEG_POWER);MR_OUTreturn;}
//retofthecodefromfile}
注意粗体字显示的那段代码。我们可以看到,这条代码不在任何一个条件编译代码段内,这就意味着无论你用何种选项编译MIRACL,MR_IN(17)都会在最终生成库文件里面。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。