【Miracl密码库】椭圆曲线的双线性配对实例AKE

本文从公众号复制过来,排版较乱,可参考原文
【Miracl密码库】AKE的实现(ake.cpp)
在Miracl密码库的基础上,复现Miracl库中的案例AKE,了解双线性配对的原理。测试案例为Miracl库中的ake.cpp文件
ake.cpp中实现的AKE,源于Mike Scott的Authenticated ID-based Key Exchange and remote log-in with simple token and PIN number
http://eprint.iacr.org/2002/164
复现过程
1.生成静态库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
根据ake.cpp文件的相关说明
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型明确指定了相关关联的文件
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
通过编译,发现不能通过,提示错误是
<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函数,程序不能执行,检查Makefile的编写,发现掉了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
再次执行程序
% 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
指定了需要的文件
编译执行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
虽然有两个警告信息,但是不影响结果。
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
测试中存在的问题,欢迎留言讨论。
本文从公众号复制过来,排版较乱,可参考原文