1. 程式人生 > >密碼學C語言函式庫——Miracl庫快速上手中文指南(VC)

密碼學C語言函式庫——Miracl庫快速上手中文指南(VC)

一、簡介


密碼學學習、研究人員往往著重於理論研究,難以與實踐直接掛鉤,今天介紹一下國外著名密碼學C語言函式庫——Miracl庫的使用方法。



該庫針對公鑰密碼學和橢圓曲線密碼學的實現,寫了很多函式,在這方面可以說是所有國外的庫中功能最強大的了。但分組密碼等方面的函式相對較少。


二、VC6中呼叫Miracl庫的方法



下面我詳細講述一下使用方法。


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 "miracl.h"
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 "LIBC" 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 "miracl.h"
#include <time.h>
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("data.txt", "r+");
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("\n\n進行100次1024位元的模指數運算所消耗的時間為:%ld ms\n\n", tEnd - tBegin);
}

執行該程式時候,還需要在資料夾中建立一個data.txt檔案,用於存放資料:
F05085869EF4BA2514D08635E180E138DCD2AAAF1B04C69A4C3A9B612A6FAF9784393B5B49026FEA2F0E244D84506A7A1D44B8745CE4B9B0C83668FD83BADEFC2A6EEC3D80BA5A3CEB1CB538C25199B05E3E3535F3276020F53C8E9D2B518465BD2F6322C1751A00C6EF5186614D9EC955841B2CCFD59882853E4131233BC2E3
D98E5FC36267464CE6947FEEE0EC8BC7AA611AD15D68F234BAC62C18C9DEF38BA135550D54EBCD179EA40F377A01066B13E61FF8C9639B2D3A19EC7B8CC58877F7266FDDDC776C563D277DB0204C9CE7213D87E76750478531E3B09685629B1B9FEB06E118A5F3E978F8AED1D0C202A5728021831A5012D43DE53C9CAFFF4E1D
B5AEB6D01F4A09AE231CA573868A2B7F16E3F90AFA2417ADA94816CC8488D04F249132DB235A71BCD956D3E648F54FBA0A48F46626D113D3345E1415B727DAE37F0886DE3078FAD6FFBADC8DF22E4ADB88317A7E6BF7144306D06977EF54B061A87C236C4B4BF28006ED7D02F7F9C9BB87F7EC3CF4F623A183A7EB0B95654073


(三個資料用回車隔開,最後一行後面必須有回車!)


執行可知:用Miracl庫實現1024位元的RSA解密,平均一次只需要14毫秒,以前很多人都不知道這個資料吧?嘿嘿,實踐出真知啊。(我的執行環境是P4 3.0,1G記憶體)。


四、尾聲


國外著名密碼學函式庫還有:GMP、NTL、Crypto++、LibTomCrypt(LibTomMath)、OpenSSL等,本站密碼演算法快速實現版塊有一些簡介(http://www.mathmagic.cn/bbs/index.asp?boardid=25)。歡迎對密碼演算法快速實現有興趣的各位有志之士前來討論。

轉載自 http://www.mathmagic.cn/bbs/simple/?t7050.html