【Miracl密碼庫】橢圓曲線的雙線性配對實例AKE

本文從公眾號復制過來,排版較亂,可參考原文
【Miracl密碼庫】AKE的實現(xiàn)(ake.cpp)
在Miracl密碼庫的基礎(chǔ)上,復現(xiàn)Miracl庫中的案例AKE,了解雙線性配對的原理。測試案例為Miracl庫中的ake.cpp文件
ake.cpp中實現(xiàn)的AKE,源于Mike Scott的Authenticated ID-based Key Exchange and remote log-in with simple token and PIN number
http://eprint.iacr.org/2002/164
復現(xiàn)過程
1.生成靜態(tài)庫miracl.a
【Miracl密碼庫】編譯庫文件
2.添加所需要的庫文件
cp_pair.cpp ?miracl.a ?zzn.h ? ?zzn4.cpp
ake.cpp ? ?ecn.cpp ? ?miracl.h ?zzn2.cpp ?zzn4.h
big.cpp ? ?ecn.h ? ?mirdef.h ?zzn2.h ? ?zzn8.cpp
big.h ? ?ecn4.cpp ?pairing_3.h ?zzn24.cpp ?zzn8.h
bls_pair.cpp ?ecn4.h ? ?zzn.cpp ? ?zzn24.h
根據(jù)ake.cpp文件的相關(guān)說明
Compile with modules as specified below
? For MR_PAIRING_CP curve
? cl /O2 /GX ake.cpp cp_pair.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
? For MR_PAIRING_MNT curve
? cl /O2 /GX ake.cpp mnt_pair.cpp zzn6a.cpp ecn3.cpp zzn3.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
?
? For MR_PAIRING_BN curve
? cl /O2 /GX ake.cpp bn_pair.cpp zzn12a.cpp ecn2.cpp zzn4.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
? For MR_PAIRING_KSS curve
? cl /O2 /GX ake.cpp kss_pair.cpp zzn18.cpp zzn6.cpp ecn3.cpp zzn3.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
? For MR_PAIRING_BLS curve
? cl /O2 /GX ake.cpp bls_pair.cpp zzn24.cpp zzn8.cpp zzn4.cpp zzn2.cpp ecn4.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
首先測試MR_PAIRING_CP
#define?MR_PAIRING_CP??????//?AES-80?security???
#define?AES_SECURITY?80
編輯項目管理Makefile文件為
ake : ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
?g++ -o ake ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
ake.o : ake.cpp
?g++ -c -o ake.o ake.cpp
zzn8.o : zzn8.cpp
?g++ -c -o zzn8.o zzn8.cpp
zzn24.o : zzn24.cpp
?g++ -c -o zzn24.o zzn24.cpp
zzn.o : zzn.cpp
?g++ -c -o zzn.o zzn.cpp
zzn2.o : zzn2.cpp
?g++ -c -o zzn2.o zzn2.cpp
zzn4.o : zzn4.cpp
?g++ -c -o zzn4.o zzn4.cpp
ecn4.o : ecn4.cpp
?g++ -c -o ecn4.o ecn4.cpp
ecn.o : ecn.cpp
?g++ -c -o ecn.o ecn.cpp
big.o : big.cpp
?g++ -c -o big.o big.cpp
cp_pair.o : cp_pair.cpp
?g++ -c -o cp_pair.o cp_pair.cpp
clean :
?rm -f *.o ake
其中MR_PAIRING_CP型明確指定了相關(guān)關(guān)聯(lián)的文件
For MR_PAIRING_CP curve
? cl /O2 /GX ake.cpp cp_pair.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
所以在編譯的過程中,只需要編譯如下文件
ake : ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
?g++ -o ake ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
編譯測試
% make
g++ -c -o ake.o ake.cpp
g++ -c -o zzn2.o zzn2.cpp
g++ -c -o big.o big.cpp
g++ -c -o zzn.o zzn.cpp
g++ -c -o ecn.o ecn.cpp
g++ -c -o cp_pair.o cp_pair.cpp
g++ -o ake ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
% ./ake
Mapping Server ID to point
Mapping Alice & Bob ID's to points
Alice, Bob and the Server visit Trusted Authority
Alice and Server Key Exchange
Alice ?Key= 89EC2E83ADF6354DB21B
Server Key= 89EC2E83ADF6354DB21B
Bob and Server Key Exchange
Bob's ?Key= 1F983883493C1FD49929
Server Key= 1F983883493C1FD49929
MR_PAIRING_CP型AKE測試完成,得到了相應的公私鑰對。
3.測試MR_PAIRING_MNT型
% ls
Makefile ?ecn.h ? ?mirdef.h ?zzn24.cpp ?zzn6a.h
ake.cpp ? ?ecn3.cpp ?mnt_pair.cpp ?zzn24.h ? ?zzn8.cpp
big.cpp ? ?ecn3.h ? ?pairing_3.h ?zzn3.cpp ?zzn8.h
big.h ? ?ecn4.cpp ?zzn.cpp ? ?zzn3.h
bls_pair.cpp ?ecn4.h ? ?zzn.h ? ?zzn4.cpp
cp_pair.cpp ?miracl.a ?zzn2.cpp ?zzn4.h
ecn.cpp ? ?miracl.h ?zzn2.h ? ?zzn6a.cpp
編譯Makefile文件
% make
g++ -c -o ake.o ake.cpp
g++ -c -o mnt_pair.o mnt_pair.cpp
g++ -c -o zzn6a.o zzn6a.cpp
g++ -c -o ecn3.o ecn3.cpp
g++ -c -o zzn3.o zzn3.cpp
g++ -c -o zzn2.o zzn2.cpp
g++ -c -o big.o big.cpp
g++ -c -o zzn.o zzn.cpp
g++ -c -o ecn.o ecn.cpp
g++ -o ake mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
Undefined symbols for architecture arm64:
?<span data-raw-text="" "="" data-textnode-index-1666582084849="609" data-index-1666582084849="3383" data-textnode-notemoji-index-1666582084849="3383" style=";padding: 0px">"_main<span data-raw-text="" "="" data-textnode-index-1666582084849="609" data-index-1666582084849="3389" data-textnode-notemoji-index-1666582084849="3389" style=";padding: 0px">", referenced from:
? ? implicit entry/start for main executable
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [ake] Error 1
修改編譯條件
#define MR_PAIRING_MNT ?// AES-80 security
#define?AES_SECURITY?80
通過編譯,發(fā)現(xiàn)不能通過,提示錯誤是
<span data-raw-text="" "="" data-textnode-index-1666582084849="652" data-index-1666582084849="3689" data-textnode-notemoji-index-1666582084849="3689" style=";padding: 0px">"_main<span data-raw-text="" "="" data-textnode-index-1666582084849="652" data-index-1666582084849="3695" data-textnode-notemoji-index-1666582084849="3695" style=";padding: 0px">", referenced from:
? ? implicit entry/start for main executable
也即沒有main函數(shù),程序不能執(zhí)行,檢查Makefile的編寫,發(fā)現(xiàn)掉了ake.o
ake : ake.o mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
?g++ -o ake ake.o mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
再次執(zhí)行程序
% make
g++ -c -o ake.o ake.cpp
g++ -c -o mnt_pair.o mnt_pair.cpp
g++ -c -o zzn6a.o zzn6a.cpp
g++ -c -o ecn3.o ecn3.cpp
g++ -c -o zzn3.o zzn3.cpp
g++ -c -o zzn2.o zzn2.cpp
g++ -c -o big.o big.cpp
g++ -c -o zzn.o zzn.cpp
g++ -c -o ecn.o ecn.cpp
g++ -o ake ake.o mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
% ./ake
Mapping Server ID to point
Mapping Alice & Bob ID's to points
Alice, Bob and the Server visit Trusted Authority
Alice and Server Key Exchange
Alice ?Key= CC3EE86A798D92251EE
Server Key= CC3EE86A798D92251EE
Bob and Server Key Exchange
Bob's ?Key= BC01538EC6A598F0FD98
Server Key= BC01538EC6A598F0FD98
4.測試MR_PAIRING_BN型
For MR_PAIRING_BN curve
? cl /O2 /GX ake.cpp bn_pair.cpp zzn12a.cpp ecn2.cpp zzn4.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
指定了需要的文件
編譯執(zhí)行Makefile文件
% make
g++ -c -o ake.o ake.cpp
ake.cpp:37:9: warning: 'AES_SECURITY' macro redefined [-Wmacro-redefined]
#define AES_SECURITY 192
? ? ? ?^
ake.cpp:36:9: note: previous definition is here
#define AES_SECURITY 128
? ? ? ?^
1 warning generated.
g++ -c -o bn_pair.o bn_pair.cpp
bn_pair.cpp:1439:8: warning: assigning field to itself [-Wself-assign-field]
? ? ? ?mtbits=mtbits;
? ? ? ? ? ? ?^
1 warning generated.
g++ -c -o zzn12a.o zzn12a.cpp
g++ -c -o ecn2.o ecn2.cpp
g++ -c -o zzn4.o zzn4.cpp
g++ -c -o zzn2.o zzn2.cpp
g++ -c -o big.o big.cpp
g++ -c -o zzn.o zzn.cpp
g++ -c -o ecn.o ecn.cpp
g++ -o ake ake.o bn_pair.o zzn12a.o ecn2.o zzn4.o zzn2.o big.o zzn.o ecn.o miracl.a
% ./ake
Mapping Server ID to point
Mapping Alice & Bob ID's to points
Alice, Bob and the Server visit Trusted Authority
Alice and Server Key Exchange
Alice ?Key= CDC63D1756A764F0285A1E2AC123329132204D5C9269C571
Server Key= CDC63D1756A764F0285A1E2AC123329132204D5C9269C571
Bob and Server Key Exchange
Bob's ?Key= 17D419F8F95565F7969D496224AEE9BB34682E6705BCCC3C
Server Key= 17D419F8F95565F7969D496224AEE9BB34682E6705BCCC3C
雖然有兩個警告信息,但是不影響結(jié)果。
5.測試MR_PAIRING_BLS型
% make
g++ -c -o ake.o ake.cpp
g++ -c -o bls_pair.o bls_pair.cpp
g++ -c -o zzn24.o zzn24.cpp
g++ -c -o zzn8.o zzn8.cpp
g++ -c -o zzn4.o zzn4.cpp
g++ -c -o zzn2.o zzn2.cpp
g++ -c -o ecn4.o ecn4.cpp
g++ -c -o big.o big.cpp
g++ -c -o zzn.o zzn.cpp
g++ -c -o ecn.o ecn.cpp
g++ -o ake ake.o bls_pair.o zzn24.o zzn8.o zzn4.o zzn2.o ecn4.o big.o zzn.o ecn.o miracl.a
% ./ake
Mapping Server ID to point
Mapping Alice & Bob ID's to points
Alice, Bob and the Server visit Trusted Authority
Alice and Server Key Exchange
Alice ?Key= AF9A730D9A22887CF75CF54156099212C75809611CF66847006CE5EA27E764D6
Server Key= AF9A730D9A22887CF75CF54156099212C75809611CF66847006CE5EA27E764D6
Bob and Server Key Exchange
Bob's ?Key= 9214406ADF3C8A31A7A8AC034E5F1E7384E6BC41E881340283BC6421FF80219F
Server Key= 9214406ADF3C8A31A7A8AC034E5F1E7384E6BC41E881340283BC6421FF80219F
全部代碼
Makefile ?ecn2.cpp ?mirdef.h ?zzn2.cpp ?zzn6.h
ake.cpp ? ?ecn2.h ? ?mnt_pair.cpp ?zzn2.h ? ?zzn6a.cpp
big.cpp ? ?ecn3.cpp ?pairing_3.h ?zzn24.cpp ?zzn6a.h
big.h ? ?ecn3.h ? ?zzn.cpp ? ?zzn24.h ? ?zzn8.cpp
bls_pair.cpp ?ecn4.cpp ?zzn.h ? ?zzn3.cpp ?zzn8.h
bn_pair.cpp ?ecn4.h ? ?zzn12a.cpp ?zzn3.h
cp_pair.cpp ?kss_pair.cpp ?zzn12a.h ?zzn4.cpp
ecn.cpp ? ?miracl.a ?zzn18.cpp ?zzn4.h
ecn.h ? ?miracl.h ?zzn18.h ? ?zzn6.cpp
Makefile
# AKE加密算法測試
?# 測試 ake.cpp 文件
# MR_PAIRING_CP
# ake : ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
?# g++ -o ake ake.o miracl.a zzn2.o big.o zzn.o ecn.o cp_pair.o
# MR_PAIRING_MNT
# ake : ake.o mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
?# g++ -o ake ake.o mnt_pair.o zzn6a.o ecn3.o zzn3.o zzn2.o big.o zzn.o ecn.o miracl.a
# MR_PAIRING_BN
# ake : ake.o bn_pair.o zzn12a.o ecn2.o zzn4.o zzn2.o big.o zzn.o ecn.o miracl.a
??#?g++?-o?ake?ake.o?bn_pair.o?zzn12a.o?ecn2.o?zzn4.o?zzn2.o?big.o?zzn.o?ecn.o?miracl.a
# MR_PAIRING_BLS
ake : ake.o bls_pair.o zzn24.o zzn8.o zzn4.o zzn2.o ecn4.o big.o zzn.o ecn.o miracl.a
?g++ -o ake ake.o bls_pair.o zzn24.o zzn8.o zzn4.o zzn2.o ecn4.o big.o zzn.o ecn.o miracl.a
ake.o : ake.cpp
?g++ -c -o ake.o ake.cpp
zzn8.o : zzn8.cpp
?g++ -c -o zzn8.o zzn8.cpp
zzn24.o : zzn24.cpp
?g++ -c -o zzn24.o zzn24.cpp
zzn.o : zzn.cpp
?g++ -c -o zzn.o zzn.cpp
zzn2.o : zzn2.cpp
?g++ -c -o zzn2.o zzn2.cpp
zzn4.o : zzn4.cpp
?g++ -c -o zzn4.o zzn4.cpp
ecn4.o : ecn4.cpp
?g++ -c -o ecn4.o ecn4.cpp
ecn.o : ecn.cpp
?g++ -c -o ecn.o ecn.cpp
big.o : big.cpp
?g++ -c -o big.o big.cpp
bls_pair.o : bls_pair.cpp
?g++ -c -o bls_pair.o bls_pair.cpp
cp_pair.o : cp_pair.cpp
?g++ -c -o cp_pair.o cp_pair.cpp
mnt_pair.o : mnt_pair.cpp
?g++ -c -o mnt_pair.o mnt_pair.cpp
zzn6a.o : zzn6a.cpp
?g++ -c -o zzn6a.o zzn6a.cpp
ecn3.o : ecn3.cpp
?g++ -c -o ecn3.o ecn3.cpp
zzn3.o : zzn3.cpp
?g++ -c -o zzn3.o zzn3.cpp
bn_pair.o : bn_pair.cpp
?g++ -c -o bn_pair.o bn_pair.cpp
zzn12a.o : zzn12a.cpp
?g++ -c -o zzn12a.o zzn12a.cpp
ecn2.o : ecn2.cpp
?g++ -c -o ecn2.o ecn2.cpp
kss_pair.o : kss_pair.cpp
?g++ -c -o kss_pair.o kss_pair.cpp
zzn18.o : zzn18.cpp
?g++ -c -o zzn18.o zzn18.cpp
zzn6.o : zzn6.cpp
?g++ -c -o zzn6.o zzn6.cpp
clean :
?rm -f *.o ake
測試中存在的問題,歡迎留言討論。
本文從公眾號復制過來,排版較亂,可參考原文