Linux下編譯並使用miracl密碼庫


參考:http://blog.sina.com.cn/s/blog_53fdf1590102y9ox.html

MIRACL(Multiprecision Integer and RationalArithmetic C/c++ Library)是一套由Shamus Software Ltd.所開發的一套關於大數運算函數庫,用來設計與大數運算相關的密碼學之應用,包含了RSA 公開密碼學、Diffie-Hellman密鑰交換(Key Exchange)、AES、DSA數字簽名,還包含了較新的橢圓曲線密碼學(Elliptic CurveCryptography)等等。運算速度快,並提供源代碼。

 

經過實驗,Kali-Linux和Ubuntu 16.04都可成功編譯與運行!!!

 

最近做一道CTF題,里面用到了橢圓曲線加密算法,為了了解它的處理流程,特意下載了MIRACL源碼准備使用。剛開始用windows平台下VS 2008編譯,可以生成庫文件miracl.lib。但新建項目寫一個測試程序並添加該miracl.lib編譯出現了一堆錯誤,總也找不到原因,只好轉到Kali Linux下試試,下面是具體過程。

1、 從https://github.com/miracl/MIRACL/archive/master.zip下載github下的項目源碼。我下載的是.zip壓縮包,名字為MIRACL-master.zip。

2、 建立一個目錄miracl用來放置源碼

mkdir miracl

3、 將下載成功的MIRACL-mater.zip放到上述創建的miracl目錄

cd /path/to/miracl
cp /path/to/MIRACL-mater.zip ./

4、 解壓zip包,把所有獨立的文件都放在這個目錄,即將所有非目錄的文件解壓在當前目錄下

unzip -j -aa -L MIRACL-master.zip

5、 用shell文件編譯。如果是64位系統用linux64,如果是32位系統用linux。由於我的系統為64位Kali Linux,因此執行如下命令

bash linux64

6、 運行源碼提供的示例代碼 pk-demo,測試一下是否編譯成功。

./pk-demo

這個程序是個簡單檢驗,迪菲-赫爾曼密鑰交換(Diffie–Hellman key exchange)協議的正確性,如果輸出無錯誤則表示編譯完成

 

編譯完了,自然是要用的,下面介紹兩種在C程序中使用miracl庫的方法。

方法一:

1、 源碼編譯完后的必需的文件是兩個頭文件miracl.h和mirdef.h以及編譯后的靜態函數庫miracl.a,需要在自己寫的C程序中使用。

2、 輸入如下代碼,命名為main.c

mkdir miracl-test
cd miracl-test
nano main.c

 

#include "miracl.h"

void 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);
}

將miracl.a, miracl.h, mirdef.h拷貝到與main.c所在目錄,瀏覽一下當前項目目錄下的文件

cp ../miracl/miracl.a miracl.a
cp ../miracl/miracl.h miracl.h
cp ../miracl/mirdef.h mirdef.h
ls

3、 gcc編譯並輸出main執行程序

gcc main.c miracl.a -o main
./main

 

 

方法二:

1、 將miracl.a放在系統對應的/usr/lib

cp /miracl/miracl.a /usr/lib/libmiracl.a

2、 在/usr/include下面建立文件夾miracl

mkdir /usr/include/miracl

3、 將miracl下的所有頭文件拷貝到/usr/include/miracl

cp ./miracl/*.h /usr/include/miracl

4、 調用miracl時便可直接在自己的程序頭文件中加入

#include <miracl/miracl.h>

使用方法一中的例子,即將main.c中的第一行改為include

5、 gcc編譯並輸出main執行程序

gcc main.c -lmiracl -o main
./main

 

 

 

linux64編譯代碼如下:

rm *.exe
rm miracl.a
cp mirdef.h64 mirdef.h
gcc -c -m64 -O2 mrcore.c
gcc -c -m64 -O2 mrarth0.c
gcc -c -m64 -O2 mrarth1.c
gcc -c -m64 -O2 mrarth2.c
gcc -c -m64 -O2 mralloc.c
gcc -c -m64 -O2 mrsmall.c
gcc -c -m64 -O2 mrio1.c
gcc -c -m64 -O2 mrio2.c
gcc -c -m64 -O2 mrgcd.c
gcc -c -m64 -O2 mrjack.c
gcc -c -m64 -O2 mrxgcd.c
gcc -c -m64 -O2 mrarth3.c
gcc -c -m64 -O2 mrbits.c
gcc -c -m64 -O2 mrrand.c
gcc -c -m64 -O2 mrprime.c
gcc -c -m64 -O2 mrcrt.c
gcc -c -m64 -O2 mrscrt.c
gcc -c -m64 -O2 mrmonty.c
gcc -c -m64 -O2 mrpower.c
gcc -c -m64 -O2 mrsroot.c
gcc -c -m64 -O2 mrcurve.c
gcc -c -m64 -O2 mrfast.c
gcc -c -m64 -O2 mrshs.c
gcc -c -m64 -O2 mrshs256.c
gcc -c -m64 -O2 mrshs512.c
gcc -c -m64 -O2 mrsha3.c
gcc -c -m64 -O2 mrfpe.c
gcc -c -m64 -O2 mraes.c
gcc -c -m64 -O2 mrgcm.c
gcc -c -m64 -O2 mrlucas.c
gcc -c -m64 -O2 mrzzn2.c
gcc -c -m64 -O2 mrzzn2b.c
gcc -c -m64 -O2 mrzzn3.c
gcc -c -m64 -O2 mrzzn4.c
gcc -c -m64 -O2 mrecn2.c
gcc -c -m64 -O2 mrstrong.c
gcc -c -m64 -O2 mrbrick.c
gcc -c -m64 -O2 mrebrick.c
gcc -c -m64 -O2 mrec2m.c
gcc -c -m64 -O2 mrgf2m.c
gcc -c -m64 -O2 mrflash.c
gcc -c -m64 -O2 mrfrnd.c
gcc -c -m64 -O2 mrdouble.c
gcc -c -m64 -O2 mrround.c
gcc -c -m64 -O2 mrbuild.c
gcc -c -m64 -O2 mrflsh1.c
gcc -c -m64 -O2 mrpi.c
gcc -c -m64 -O2 mrflsh2.c
gcc -c -m64 -O2 mrflsh3.c
gcc -c -m64 -O2 mrflsh4.c
cp mrmuldv.g64 mrmuldv.c
gcc -c -m64 -O2 mrmuldv.c
ar rc miracl.a mrcore.o mrarth0.o mrarth1.o mrarth2.o mralloc.o mrsmall.o mrzzn2.o mrzzn3.o
ar r miracl.a mrio1.o mrio2.o mrjack.o mrgcd.o mrxgcd.o mrarth3.o mrbits.o mrecn2.o mrzzn4.o
ar r miracl.a mrrand.o mrprime.o mrcrt.o mrscrt.o mrmonty.o mrcurve.o mrsroot.o mrzzn2b.o
ar r miracl.a mrpower.o mrfast.o mrshs.o mrshs256.o mraes.o mrlucas.o mrstrong.o mrgcm.o    
ar r miracl.a mrflash.o mrfrnd.o mrdouble.o mrround.o mrbuild.o
ar r miracl.a mrflsh1.o mrpi.o mrflsh2.o mrflsh3.o mrflsh4.o 
ar r miracl.a mrbrick.o mrebrick.o mrec2m.o mrgf2m.o mrmuldv.o mrshs512.o mrsha3.o mrfpe.o
rm mr*.o
gcc -m64 -O2 bmark.c miracl.a -o bmark
gcc -m64 -O2 fact.c miracl.a -o fact
g++ -c -m64 -O2 big.cpp
g++ -c -m64 -O2 zzn.cpp
g++ -c -m64 -O2 ecn.cpp
g++ -c -m64 -O2 ec2.cpp
g++ -c -m64 -O2 crt.cpp
g++ -m64 -O2 mersenne.cpp big.o miracl.a -o mersenne
g++ -m64 -O2 brent.cpp big.o zzn.o miracl.a -o brent
g++ -c -m64 -O2 flash.cpp
g++ -m64 -O2 sample.cpp flash.o miracl.a -o sample
g++ -m64 -O2 ecsgen.cpp ecn.o big.o miracl.a -o ecsgen
g++ -m64 -O2 ecsign.cpp ecn.o big.o miracl.a -o ecsign
g++ -m64 -O2 ecsver.cpp ecn.o big.o miracl.a -o ecsver
g++ -m64 -O2 pk-demo.cpp ecn.o big.o miracl.a -o pk-demo
g++ -c -m64 -O2 polymod.cpp
g++ -c -m64 -O2 poly.cpp
g++ -m64 -O2 schoof.cpp polymod.o poly.o ecn.o crt.o zzn.o big.o miracl.a -o schoof

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM