Visual Stdio 2019 中編譯調用miracl庫實現雙線性配對


前言
最近實現密碼算法,需要使用到橢圓曲線加密、雙線性配對等數學工具,只會些C++,故選擇調用miracl大數庫。在啃了好幾天的github上的源碼后,才對它有所了解。寫下此篇博客,希望后來研究者可以少走彎路~~

1.前期准備
(1)miracl函數庫lib生成

https://miracl.com/miracl/(函數庫下載網址)

在使用miracl大數庫之前需要配置環境,我使用的開發軟件是VS2019版本,語言C++

lib的配置參照此博主,寫的很詳細,不再贅述:https://blog.csdn.net/qq_36290650/article/details/83421230?spm=1001.2014.3001.5501

不過最后該博客認為源文件必須改成.c后綴,我使用cpp后綴也是可以的

(2)雙線性配對的介紹和調用

miracl庫里有兩種默認的配對,一型和三型配對,前者使用eta_T配對(在有限域GF(2^m)上)和Tate配對(在有限域GF(p)上),后者使用最優ate配對。一型配對使用pairing_1.h聲明,ssp_pair.cpp實現,三型配對使用pairing_3.h聲明,ss2_pair.cpp實現(所述的文件皆在源碼中pairing目錄下)。配對實現基於四種安全等級:AES_80、AES_128、AES_192和AES_256,一型配對僅支持前兩種。關於選擇哪種配對更好,說明文件給出了解釋。這里,我選擇了安全等級128的一型eta_T配對,配置和實現都將基於一型配對。

 

 

 

打開一型配對聲明文件pairing_1.h,G1、GT數據類型如下所示

一型配對模式是GT=e(G1,G1),選擇eta_T配對時,在源文件定義#define MR_PAIRING_SSP;選擇Tate配對時,在源文件定義#define MR_PAIRING_SS2

 

 

 

我們繼續查看ecn.h和zzn2.h,發現ecn.h還包含了一個big.h的頭文件,zzn2.h包含一個zzn.h。

 

 

 

到此我們可以確定想要調用一型eta_T配對,需要的文件有

pairing_1.h

ssp_pairing.cpp

zzn.h

zzn.cpp

zzn2.h

zzn2.cpp

ecn.h

ecn2.cpp

big.h

big.cpp

以及1中所需要的mirdef.h、miracl.h和兩個資源文件lib、pdb

現在開始寫項目啦~>0<

新建VS空項目,將上面所述的文件復制到項目目錄下

 

 

 

右鍵項目,添加現有項,添加這些文件

 

 

 

右鍵重新生成,這里會有一些報錯,是由於源碼的編寫方式不標准導致的,比如說類中的友元函數無法在聲明的時候添加默認參數,所以刪掉false

其他的問題就不詳細描述,只要稍微修改就可

 

 

 

然后右鍵添加空項目(.cpp),加上頭文件

#include <iostream>
//security define
#define AES_SECURITY 128
#define MR_PAIRING_SSP
#include "pairing_1.h"

using namespace std;
extern "C"
{
#include "miracl.h"
#include "mirdef.h"

}
int main()
{

}

我所用的語言是C++,但是兩個大數庫的頭要用C編譯,右鍵重新生成,編譯成功。(撒花~~)

 

2、相關源碼
(1)Big類

big.h定義了Big類,Big數據類型相當於對big數據類型的進一步擴充

Big a;//定義一個Big類型變量,默認初始化為0

Big對運算符進行了重載,支持加減乘除等基本運算操作

 

 

 

 

Big類中常用函數:

a. 乘法取模

定義:Big modmult(const Big&,const Big&,const Big&);

Big a,b,c,m;

c=modmult(a,b,m); //c=(a*b)modm

b. 除法取模

定義:Big moddiv(const Big&,const Big&,const Big&);

Big a,b,c,m;

c=moddiv(a,b,m); //c=(a/b)modm

c. 冪次方函數

定義:Big pow(const Big&, int, const Big&); // x^m mod n

Big pow(int, const Big&, const Big&); // x^m mod n

Big pow(const Big&, const Big&, const Big&); // x^m mod n

Big a,b,c,m;

c=pow(a,b,m); //c=(a^b)modm

d. 隨機數生成

定義:Big rand(const Big&); //0 < rand < parameter

Big a,b;

a=rand(b); // 0ab

 

(2)G1類、GT類

pairing.h聲明了G1和GT類

不同的配對方式G1和G2表現為不同的數據類型,eta_T配對中,G1的數據類型是ecn,GT的數據類型是zzn2

G1、GT類對運算符進行了重載,支持如下運算操作

 

 

 

 

 

(3)PFC類

pairing.h聲明了PFC(pairing friendly curve)類

PFC類中聲明了雙線性配對友好的橢圓曲線的參數以及相關運算函數

s=安全系數 ord[0]=橢圓曲線的階

 

 

 

ssp_pairing.cpp初始化橢圓曲線以及定義了PFC類中的函數

 

 

 

PFC類中常用函數:(使用前先建立類對象,如PFC pfc(128);)

a. G1點乘

定義:G1 mult(const G1&,const Big&)

Big a; G1 P,Q;

Q=pfc.mult(P,a); //Q=aP

b. GT冪次運算

定義:GT power(const GT&,const Big&);

Big a; GT P,Q;

Q=pfc.power(P,a); //Q=a^P

c. 字符串哈希轉換為G1點

定義:Big PFC::hash_to_group(char *ID)

G1 b=pfc.hash_to_group((char *)"Robert");

d. 隨機生成AES密鑰

定義:void PFC::rankey(Big& k)

Big a;

pfc.rankey(a);

e. 雙線性配對

定義:GT PFC::pairing(const G1& x,const G1& y)

G1 P,Q;GT Z;

Z=pfc.pairing(P,Q); //Z=e(P,Q);

(待續~~~)

本博客文章為博主學習筆記,針對博主需要所寫,內容可能不夠完善或者有誤,歡迎各位批評指正~轉載請說明博客來處>3<
————————————————
版權聲明:本文為CSDN博主「書儀」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43566247/article/details/116642210


免責聲明!

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



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