密码学C语言函数库

2020-06-05 09:08

一、简介

密码学学习、研究人员往往着重于理论研究,难以与实践直接挂钩,今天介绍一下国外著名密码学C语言函数库——Miracl库的使用方法。

Miracl库的官方网站是http://www.shamus.ie/,完全开源,任何人可以去免费下载使用。由于国外网速有限,本站提供下载地址:http://www.mathmagic.cn/bbs/dispbbs.asp?boardID=16&ID=5153&page=1(版本略旧,但不会影响使用,我一直用这个版本)。

该库针对公钥密码学和椭圆曲线密码学的实现,写了很多函数,在这方面可以说是所有国外的库中功能最强大的了。但分组密码等方面的函数相对较少。

二、VC6中调用Miracl库的方法

一般我们采用VC 6.0来使用Miracl库,本站提供VC6的下载地址:http://www.mathmagic.cn/bbs/dispbbs.asp?boardID=18&ID=5772&page=1。

下面我详细讲述一下使用方法。

1、VC中新建一个project,选择“win32 console application”,起名为123,建立一个空的project。 2、找到该工程保存的文件夹,把miracl\\lib\\ms32.lib,miracl\\include\\mirdef.h,miracl\\include\\miracl.h三个文件拷贝到123文件夹下。

3、在VC中左边的“workspace”列表中,选“fileview”选项卡,对着123 files单击右键,add files t o project,将ms32.lib加进来(注意:看不到ms32.lib的,把“文件类型”设置为“所有类型”)。

4、右键单击Source Files,添加文件,命名为123.c,写入下列程序:

#include \main() { big a, b, c; miracl *mip = mirsys(5000, 16); a=mirvar(8); b=mirvar(7); c=mirvar(0); add(a, b, c); cotnum(c, stdout); } 注1:“miracl *mip = mirsys(5000, 16);”该行程序是每个含有miracl语句的程序都必须有的语句,必须放在变量声明后面、其他程序前面。意思是我定义的这些变量最大长度都是5000位,输入、输出、运算用的进制都是16进制。

注2:每个big型变量都必须赋初始值,否则出错!

注3:有可能会出现警告:LINK : warning LNK4098: defaultlib \conflicts with use of other libs; use /NODEFAULTLIB:library。当它不存在好了,没事。

注4:输入函数有cinnum和innum,输出函数有cotnum和otnum,用的时候尽量用前者,我用后者老是出错,文档里有说明,我暂时没时间仔细研究为什么出错。据说跟进制有关,高手可以跟帖解释一下。

注5:使用cinnum函数之前加上“mip->IOBASE = 16;”,见我下面的例子。否则出错。

5、运行即可输出“F”。绝对不会出错。如果程序运行有错误的,返回上面第一步,仔细看看自己哪个地方弄错了。

至此,你已经学会了如何在VC中调用用miracl库的函数了。具体每个函数怎么用,你可以看看文档(MIRACL Reference Manual),写的非常清楚。在文档中可以查到某个函数的源代码在哪个文件里,找到该文件后,进去找找,每个函数的前面都有说明,说明该函数中的算法出自哪里。对于研究算法和实现的人也是很有帮助的。

三、学习与提高

Miracl提供两个说明文档,一个是函数查询手册(MIRACL Reference Manual),另一个是使用说明(User’s Manual)。

你也可以把文档User’s Manual中的程序拿过来用用试试。逐渐熟悉一下一些常见的函数的使用方法。 下面是我自己写的一个实现1024比特RSA解密的时间测试程序:

#include \#include main() { int i; big x, e, m, y; FILE *fp; clock_t tBegin, tEnd; miracl *mip = mirsys(1000, 16); x = mirvar(0); e = mirvar(0); m = mirvar(0); y = mirvar(0); fp = fopen(\\ mip->IOBASE = 16; cinnum(x, fp); cinnum(e, fp); cinnum(m, fp); fclose(fp); tBegin = clock(); for (i = 0; i < 100; i ++) powmod(x, e, m, y); tEnd = clock(); cotnum(x, stdout); cotnum(e, stdout); cotnum(m, stdout); cotnum(y, stdout); printf(\进行100次1024比特的模指数运算所消耗的时间为:%ld ms\\n\\n\tEnd - tBegin); } 运行该程序时候,还需要在文件夹中建立一个data.txt文件,用于存放数据:

F05085869EF4BA2514D08635E180E138DCD2AAAF1B04C69A4C3A9B612A6FAF9784393B5B49026FEA2F0E244D84506A7A1D44B8745CE4B9B0C83668FD83BADEFC2A6EEC3D80BA5A3CEB1CB538C25199B05E3E3535F3276020F53C8E9D2B518465BD2F6322C1751A00C6EF5186614D9EC955841B2CCFD59882853E4131233BC2E3

D98E5FC36267464CE6947FEEE0EC8BC7AA611AD15D68F234BAC62C18C9DEF38BA135550D54EBCD179EA40F377A01066B13E61FF8C9639B2D3A19EC7B8CC58877F7266FDDDC776C563D277DB0204C9CE7213D87E76750478531E3B09685629B1B9FEB06E118A5F3E978F8AED1D0C202A5728021831A5012D43DE53C9CAFFF4E1D

B5AEB6D01F4A09AE231CA573868A2B7F16E3F90AFA2417ADA94816CC8488D04F249132DB235A71BCD956D3E648F54FBA0A48F46626D113D3345E1415B727DAE37F0886DE3078FAD6FFBADC8DF22E4ADB88317A7E6BF7144306D06977EF54B061A87C236C4B4BF28006ED7D02F7F9C9BB87F7EC3CF4F623A183A7EB0B95654073

(三个数据用回车隔开,最后一行后面必须有回车!)

运行可知:用Miracl库实现1024比特的RSA解密,平均一次只需要14毫秒,以前很多人都不知道这个数据吧?嘿嘿,实践出真知啊。(我的运行环境是P4 3.0,1G内存)。

四、尾声

国外著名密码学函数库还有:GMP、Crypto++、LibTomCrypt(LibTomMath)、OpenSSL等,本站密码算法快速实现版块有一些简介(http://www.mathmagic.cn/bbs/index.asp?boardid=25&page=1)。欢迎对密码算法快速实现有兴趣的各位有志之士前来讨论。

五、附件

本文中提到的两个程序,见下面附件:

快速地识别MIRACL库函数

从bLaCk-eye的网站上down到的,觉得挺有用的。网址是http://www.secretashell.com/cryptocrk/,这里东西不少,推荐去看看。

MIARCL是当前使用比较广泛的基于公钥加密算法保护实现的大数库之一,特别在各种算法Crackme中。目前为止还没有发现使用该库的商业软件,因为MIRACL用于商业目的的话需要交纳一笔昂贵的授权费——1000$。所以这里介绍的这个技巧只能对你破解各种算法Crackme起到一点帮助。

这个技巧是怎么来的呢?

我们知道,MIRACL有一个十分有用的特性:它可以让你十分方便的定位程序运行过程中出错的函数,MIRACL的文档是这样说的:

”初始化函数mirsys运行的同时也会初始化集成在MIRACL库中的错误跟踪系统。这样,无论何时只要函数调用序列中的任何一个函数发生错误都会被检测到,包括错误本身。一个典型的错误信息如下:

MIRACL error from routine powltr called from isprime called from your program

Raising integer to a negative power

这些错误报告在开发过程中对我们调试有很大的帮助。与之相关的一个常量是TRACER,默认是OFF,如果将它改为ON,程序运行过程中将会把错误信息打印到电脑屏幕上。”

上面这些信息对我们有什么帮助呢?

MIRACL能确切知道哪个函数出错是因为它对每个函数定义了一个特定的常量作为标识符,这些信息是从MIRACL源代码里发现的。下面是MrArth3.c里的一段代码:

void power(_MIPD_ big x,long n,big z,big w) { /* raise big number to int power w=x^n * * (mod z if z and w distinct) */ mr_small norm;

#ifdef MR_OS_THREADS miracl *mr_mip=get_mip(); #endif

copy(x,mr_mip->w5); zero(w);

if(mr_mip->ERNUM || size(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_OUT return; }

//rest of the code from file }

注意粗体字显示的那段代码。我们可以看到,这条代码不在任何一个条件编译代码段内,这就意味着无论你用何种选项编译MIRACL,MR_IN(17)都会在最终生成库文件里面。

将这段代码反汇编的结果是:

mov dword ptr [esi+eax*4+20h], 11h

11h的十进制正是17。

现在你明白如何去识别MIRACL库的函数了吧:调试时跟进有疑问的CALL,搜索下面形式的指令:

mov dword ptr [esi+eax*4+20h], XXh

在你自己的函数特征值表中查找XX,或者直接对照我在后面列出的那个表。

有了这个所有函数特征值对应表后我们就可以十分轻松的识别MIRACL里的所有函数。这个方法的优点就是每个函数对应的特征值一般不会由于库版本的升级而发生变化,因此可以比较放心的使用。缺点呢就是你必须自己动手去一个一个函数地去识别。对于这点一个好的解决办法就是编写一个IDA的脚本,自动搜索那些的指令并根据特征值修改函数名。 附表:

MIRACL MAGIC NUMBERS TABLE: by bLaCk-eye

from an original ideea by bF!^k23

NUMBER OF FUNCTIONS: 08Eh Innum equ 01h Otnum equ 02h Jack equ 03h normalise equ 04h


密码学C语言函数库.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:安全生产工作职责分工

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: