94 lines
2.3 KiB
C++
94 lines
2.3 KiB
C++
/*
|
|
Boneh, Di Crescenzo, Ostrovsky & Persiano
|
|
Public Key Encryption with keyword Search
|
|
|
|
See http://eprint.iacr.org/2003/195.pdf
|
|
Section 3.1
|
|
|
|
(From reading the protocol to a working implementation - 10 minutes!)
|
|
|
|
Compile with modules as specified below
|
|
|
|
For MR_PAIRING_CP curve
|
|
cl /O2 /GX peks.cpp cp_pair.cpp zzn2.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
|
|
|
|
For MR_PAIRING_MNT curve
|
|
cl /O2 /GX peks.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 peks.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 peks.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 peks.cpp bls_pair.cpp zzn24.cpp zzn8.cpp zzn4.cpp zzn2.cpp ecn4.cpp big.cpp zzn.cpp ecn.cpp miracl.lib
|
|
|
|
Test program
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <ctime>
|
|
|
|
//********* choose just one of these pairs **********
|
|
//#define MR_PAIRING_CP // AES-80 security
|
|
//#define AES_SECURITY 80
|
|
|
|
//#define MR_PAIRING_MNT // AES-80 security
|
|
//#define AES_SECURITY 80
|
|
|
|
#define MR_PAIRING_BN // AES-128 or AES-192 security
|
|
#define AES_SECURITY 128
|
|
//#define AES_SECURITY 192
|
|
|
|
//#define MR_PAIRING_KSS // AES-192 security
|
|
//#define AES_SECURITY 192
|
|
|
|
//#define MR_PAIRING_BLS // AES-256 security
|
|
//#define AES_SECURITY 256
|
|
//*********************************************
|
|
|
|
#include "pairing_3.h"
|
|
|
|
int main()
|
|
{
|
|
PFC pfc(AES_SECURITY); // initialise pairing-friendly curve
|
|
|
|
time_t seed;
|
|
time(&seed);
|
|
irand((long)seed);
|
|
|
|
G1 g,h,PA;
|
|
Big alpha,r,PB;
|
|
GT t;
|
|
G2 HW,TW;
|
|
|
|
// keygen
|
|
|
|
pfc.random(g);
|
|
pfc.precomp_for_mult(g); // precompute on fixed g
|
|
pfc.random(alpha); // private key
|
|
h=pfc.mult(g,alpha); // public key
|
|
pfc.precomp_for_mult(h);
|
|
|
|
// PEKS
|
|
pfc.random(r);
|
|
pfc.hash_and_map(HW,(char *)"test");
|
|
t=pfc.pairing(HW,pfc.mult(h,r));
|
|
PA=pfc.mult(g,r);
|
|
PB=pfc.hash_to_aes_key(t); // [PA,PB] added to ciphertext
|
|
|
|
// Trapdoor
|
|
|
|
pfc.hash_and_map(HW,(char *)"test"); // key word we are looking for
|
|
TW=pfc.mult(HW,alpha);
|
|
pfc.precomp_for_pairing(TW);
|
|
|
|
// Test
|
|
if (pfc.hash_to_aes_key(pfc.pairing(TW,PA))==PB)
|
|
cout << "yes" << endl;
|
|
else cout << "no" << endl;
|
|
|
|
return 0;
|
|
}
|