charm-crypto-framework 0.61.1__cp313-cp313-macosx_10_13_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- charm/__init__.py +5 -0
- charm/adapters/__init__.py +0 -0
- charm/adapters/abenc_adapt_hybrid.py +90 -0
- charm/adapters/dabenc_adapt_hybrid.py +145 -0
- charm/adapters/ibenc_adapt_hybrid.py +72 -0
- charm/adapters/ibenc_adapt_identityhash.py +80 -0
- charm/adapters/kpabenc_adapt_hybrid.py +91 -0
- charm/adapters/pkenc_adapt_bchk05.py +121 -0
- charm/adapters/pkenc_adapt_chk04.py +91 -0
- charm/adapters/pkenc_adapt_hybrid.py +98 -0
- charm/adapters/pksig_adapt_naor01.py +89 -0
- charm/config.py +7 -0
- charm/core/__init__.py +0 -0
- charm/core/benchmark/benchmark_util.c +353 -0
- charm/core/benchmark/benchmark_util.h +61 -0
- charm/core/benchmark/benchmarkmodule.c +476 -0
- charm/core/benchmark/benchmarkmodule.h +162 -0
- charm/core/benchmark.cpython-313-darwin.so +0 -0
- charm/core/crypto/AES/AES.c +1464 -0
- charm/core/crypto/AES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES/DES.c +113 -0
- charm/core/crypto/DES.cpython-313-darwin.so +0 -0
- charm/core/crypto/DES3/DES3.c +26 -0
- charm/core/crypto/DES3.cpython-313-darwin.so +0 -0
- charm/core/crypto/__init__.py +0 -0
- charm/core/crypto/cryptobase/XOR.c +80 -0
- charm/core/crypto/cryptobase/_counter.c +496 -0
- charm/core/crypto/cryptobase/_counter.h +54 -0
- charm/core/crypto/cryptobase/block_template.c +900 -0
- charm/core/crypto/cryptobase/block_template.h +69 -0
- charm/core/crypto/cryptobase/cryptobasemodule.c +220 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_argchk.h +44 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cfg.h +186 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_cipher.h +941 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_custom.h +556 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_des.c +1912 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_hash.h +407 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_mac.h +496 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_macros.h +435 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_math.h +534 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_misc.h +103 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pk.h +653 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_pkcs.h +90 -0
- charm/core/crypto/cryptobase/libtom/tomcrypt_prng.h +199 -0
- charm/core/crypto/cryptobase/stream_template.c +271 -0
- charm/core/crypto/cryptobase/strxor.c +229 -0
- charm/core/crypto/cryptobase.cpython-313-darwin.so +0 -0
- charm/core/engine/__init__.py +5 -0
- charm/core/engine/protocol.py +293 -0
- charm/core/engine/util.py +174 -0
- charm/core/math/__init__.py +0 -0
- charm/core/math/elliptic_curve/ecmodule.c +1986 -0
- charm/core/math/elliptic_curve/ecmodule.h +230 -0
- charm/core/math/elliptic_curve.cpython-313-darwin.so +0 -0
- charm/core/math/elliptic_curve.pyi +63 -0
- charm/core/math/integer/integermodule.c +2539 -0
- charm/core/math/integer/integermodule.h +145 -0
- charm/core/math/integer.cpython-313-darwin.so +0 -0
- charm/core/math/integer.pyi +76 -0
- charm/core/math/pairing/miracl/miracl_config.h +37 -0
- charm/core/math/pairing/miracl/miracl_interface.h +118 -0
- charm/core/math/pairing/miracl/miracl_interface2.h +126 -0
- charm/core/math/pairing/miracl/pairingmodule2.c +2094 -0
- charm/core/math/pairing/miracl/pairingmodule2.h +307 -0
- charm/core/math/pairing/pairingmodule.c +2230 -0
- charm/core/math/pairing/pairingmodule.h +241 -0
- charm/core/math/pairing/relic/pairingmodule3.c +1853 -0
- charm/core/math/pairing/relic/pairingmodule3.h +233 -0
- charm/core/math/pairing/relic/relic_interface.c +1337 -0
- charm/core/math/pairing/relic/relic_interface.h +217 -0
- charm/core/math/pairing/relic/test_relic.c +171 -0
- charm/core/math/pairing.cpython-313-darwin.so +0 -0
- charm/core/math/pairing.pyi +69 -0
- charm/core/utilities/base64.c +248 -0
- charm/core/utilities/base64.h +15 -0
- charm/schemes/__init__.py +0 -0
- charm/schemes/abenc/__init__.py +0 -0
- charm/schemes/abenc/abenc_accountability_jyjxgd20.py +647 -0
- charm/schemes/abenc/abenc_bsw07.py +146 -0
- charm/schemes/abenc/abenc_ca_cpabe_ar17.py +684 -0
- charm/schemes/abenc/abenc_dacmacs_yj14.py +298 -0
- charm/schemes/abenc/abenc_lsw08.py +159 -0
- charm/schemes/abenc/abenc_maabe_rw15.py +236 -0
- charm/schemes/abenc/abenc_maabe_yj14.py +297 -0
- charm/schemes/abenc/abenc_tbpre_lww14.py +309 -0
- charm/schemes/abenc/abenc_unmcpabe_yahk14.py +223 -0
- charm/schemes/abenc/abenc_waters09.py +144 -0
- charm/schemes/abenc/abenc_yct14.py +208 -0
- charm/schemes/abenc/abenc_yllc15.py +178 -0
- charm/schemes/abenc/ac17.py +248 -0
- charm/schemes/abenc/bsw07.py +141 -0
- charm/schemes/abenc/cgw15.py +277 -0
- charm/schemes/abenc/dabe_aw11.py +204 -0
- charm/schemes/abenc/dfa_fe12.py +144 -0
- charm/schemes/abenc/pk_hve08.py +179 -0
- charm/schemes/abenc/waters11.py +143 -0
- charm/schemes/aggrsign_MuSig.py +150 -0
- charm/schemes/aggrsign_bls.py +267 -0
- charm/schemes/blindsig_ps16.py +654 -0
- charm/schemes/chamhash_adm05.py +113 -0
- charm/schemes/chamhash_rsa_hw09.py +100 -0
- charm/schemes/commit/__init__.py +0 -0
- charm/schemes/commit/commit_gs08.py +77 -0
- charm/schemes/commit/commit_pedersen92.py +53 -0
- charm/schemes/encap_bchk05.py +62 -0
- charm/schemes/grpsig/__init__.py +0 -0
- charm/schemes/grpsig/groupsig_bgls04.py +114 -0
- charm/schemes/grpsig/groupsig_bgls04_var.py +115 -0
- charm/schemes/hibenc/__init__.py +0 -0
- charm/schemes/hibenc/hibenc_bb04.py +105 -0
- charm/schemes/hibenc/hibenc_lew11.py +193 -0
- charm/schemes/ibenc/__init__.py +0 -0
- charm/schemes/ibenc/clpkc_rp03.py +119 -0
- charm/schemes/ibenc/ibenc_CW13_z.py +168 -0
- charm/schemes/ibenc/ibenc_bb03.py +94 -0
- charm/schemes/ibenc/ibenc_bf01.py +121 -0
- charm/schemes/ibenc/ibenc_ckrs09.py +120 -0
- charm/schemes/ibenc/ibenc_cllww12_z.py +172 -0
- charm/schemes/ibenc/ibenc_lsw08.py +120 -0
- charm/schemes/ibenc/ibenc_sw05.py +238 -0
- charm/schemes/ibenc/ibenc_waters05.py +144 -0
- charm/schemes/ibenc/ibenc_waters05_z.py +164 -0
- charm/schemes/ibenc/ibenc_waters09.py +107 -0
- charm/schemes/ibenc/ibenc_waters09_z.py +147 -0
- charm/schemes/joye_scheme.py +106 -0
- charm/schemes/lem_scheme.py +207 -0
- charm/schemes/pk_fre_ccv11.py +107 -0
- charm/schemes/pk_vrf.py +127 -0
- charm/schemes/pkenc/__init__.py +0 -0
- charm/schemes/pkenc/pkenc_cs98.py +108 -0
- charm/schemes/pkenc/pkenc_elgamal85.py +122 -0
- charm/schemes/pkenc/pkenc_gm82.py +98 -0
- charm/schemes/pkenc/pkenc_paillier99.py +118 -0
- charm/schemes/pkenc/pkenc_rabin.py +254 -0
- charm/schemes/pkenc/pkenc_rsa.py +186 -0
- charm/schemes/pksig/__init__.py +0 -0
- charm/schemes/pksig/pksig_CW13_z.py +135 -0
- charm/schemes/pksig/pksig_bls04.py +87 -0
- charm/schemes/pksig/pksig_boyen.py +156 -0
- charm/schemes/pksig/pksig_chch.py +97 -0
- charm/schemes/pksig/pksig_chp.py +70 -0
- charm/schemes/pksig/pksig_cl03.py +150 -0
- charm/schemes/pksig/pksig_cl04.py +87 -0
- charm/schemes/pksig/pksig_cllww12_z.py +142 -0
- charm/schemes/pksig/pksig_cyh.py +132 -0
- charm/schemes/pksig/pksig_dsa.py +76 -0
- charm/schemes/pksig/pksig_ecdsa.py +71 -0
- charm/schemes/pksig/pksig_hess.py +104 -0
- charm/schemes/pksig/pksig_hw.py +110 -0
- charm/schemes/pksig/pksig_lamport.py +63 -0
- charm/schemes/pksig/pksig_ps01.py +135 -0
- charm/schemes/pksig/pksig_ps02.py +124 -0
- charm/schemes/pksig/pksig_ps03.py +119 -0
- charm/schemes/pksig/pksig_rsa_hw09.py +206 -0
- charm/schemes/pksig/pksig_schnorr91.py +77 -0
- charm/schemes/pksig/pksig_waters.py +115 -0
- charm/schemes/pksig/pksig_waters05.py +121 -0
- charm/schemes/pksig/pksig_waters09.py +121 -0
- charm/schemes/pre_mg07.py +150 -0
- charm/schemes/prenc/pre_afgh06.py +126 -0
- charm/schemes/prenc/pre_bbs98.py +123 -0
- charm/schemes/prenc/pre_nal16.py +216 -0
- charm/schemes/protocol_a01.py +272 -0
- charm/schemes/protocol_ao00.py +215 -0
- charm/schemes/protocol_cns07.py +274 -0
- charm/schemes/protocol_schnorr91.py +125 -0
- charm/schemes/sigma1.py +64 -0
- charm/schemes/sigma2.py +129 -0
- charm/schemes/sigma3.py +126 -0
- charm/schemes/threshold/__init__.py +59 -0
- charm/schemes/threshold/dkls23_dkg.py +556 -0
- charm/schemes/threshold/dkls23_presign.py +1089 -0
- charm/schemes/threshold/dkls23_sign.py +761 -0
- charm/schemes/threshold/xrpl_wallet.py +967 -0
- charm/test/__init__.py +0 -0
- charm/test/adapters/__init__.py +0 -0
- charm/test/adapters/abenc_adapt_hybrid_test.py +29 -0
- charm/test/adapters/dabenc_adapt_hybrid_test.py +56 -0
- charm/test/adapters/ibenc_adapt_hybrid_test.py +36 -0
- charm/test/adapters/ibenc_adapt_identityhash_test.py +32 -0
- charm/test/adapters/kpabenc_adapt_hybrid_test.py +30 -0
- charm/test/benchmark/abenc_yllc15_bench.py +92 -0
- charm/test/benchmark/benchmark_test.py +148 -0
- charm/test/benchmark_threshold.py +260 -0
- charm/test/conftest.py +38 -0
- charm/test/fuzz/__init__.py +1 -0
- charm/test/fuzz/conftest.py +5 -0
- charm/test/fuzz/fuzz_policy_parser.py +76 -0
- charm/test/fuzz/fuzz_serialization.py +83 -0
- charm/test/schemes/__init__.py +0 -0
- charm/test/schemes/abenc/__init__.py +0 -0
- charm/test/schemes/abenc/abenc_bsw07_test.py +39 -0
- charm/test/schemes/abenc/abenc_dacmacs_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_lsw08_test.py +33 -0
- charm/test/schemes/abenc/abenc_maabe_yj14_test.py +16 -0
- charm/test/schemes/abenc/abenc_tbpre_lww14_test.py +16 -0
- charm/test/schemes/abenc/abenc_waters09_test.py +38 -0
- charm/test/schemes/abenc/abenc_yllc15_test.py +74 -0
- charm/test/schemes/chamhash_adm05_test.py +31 -0
- charm/test/schemes/chamhash_rsa_hw09_test.py +29 -0
- charm/test/schemes/commit/__init__.py +0 -0
- charm/test/schemes/commit/commit_gs08_test.py +24 -0
- charm/test/schemes/commit/commit_pedersen92_test.py +26 -0
- charm/test/schemes/dabe_aw11_test.py +45 -0
- charm/test/schemes/encap_bchk05_test.py +21 -0
- charm/test/schemes/grpsig/__init__.py +0 -0
- charm/test/schemes/grpsig/groupsig_bgls04_test.py +35 -0
- charm/test/schemes/grpsig/groupsig_bgls04_var_test.py +39 -0
- charm/test/schemes/hibenc/__init__.py +0 -0
- charm/test/schemes/hibenc/hibenc_bb04_test.py +28 -0
- charm/test/schemes/ibenc/__init__.py +0 -0
- charm/test/schemes/ibenc/ibenc_bb03_test.py +26 -0
- charm/test/schemes/ibenc/ibenc_bf01_test.py +24 -0
- charm/test/schemes/ibenc/ibenc_ckrs09_test.py +25 -0
- charm/test/schemes/ibenc/ibenc_lsw08_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_sw05_test.py +32 -0
- charm/test/schemes/ibenc/ibenc_waters05_test.py +31 -0
- charm/test/schemes/ibenc/ibenc_waters09_test.py +27 -0
- charm/test/schemes/pk_vrf_test.py +29 -0
- charm/test/schemes/pkenc/__init__.py +0 -0
- charm/test/schemes/pkenc_test.py +255 -0
- charm/test/schemes/pksig/__init__.py +0 -0
- charm/test/schemes/pksig_test.py +376 -0
- charm/test/schemes/rsa_alg_test.py +340 -0
- charm/test/schemes/threshold_test.py +1792 -0
- charm/test/serialize/__init__.py +0 -0
- charm/test/serialize/serialize_test.py +40 -0
- charm/test/toolbox/__init__.py +0 -0
- charm/test/toolbox/conversion_test.py +30 -0
- charm/test/toolbox/ecgroup_test.py +53 -0
- charm/test/toolbox/integer_arithmetic_test.py +441 -0
- charm/test/toolbox/paddingschemes_test.py +238 -0
- charm/test/toolbox/policy_parser_stress_test.py +969 -0
- charm/test/toolbox/secretshare_test.py +28 -0
- charm/test/toolbox/symcrypto_test.py +108 -0
- charm/test/toolbox/test_policy_expression.py +16 -0
- charm/test/vectors/__init__.py +1 -0
- charm/test/vectors/test_bls_vectors.py +289 -0
- charm/test/vectors/test_pedersen_vectors.py +315 -0
- charm/test/vectors/test_schnorr_vectors.py +368 -0
- charm/test/zkp_compiler/__init__.py +9 -0
- charm/test/zkp_compiler/benchmark_zkp.py +258 -0
- charm/test/zkp_compiler/test_and_proof.py +240 -0
- charm/test/zkp_compiler/test_batch_verify.py +248 -0
- charm/test/zkp_compiler/test_dleq_proof.py +264 -0
- charm/test/zkp_compiler/test_or_proof.py +231 -0
- charm/test/zkp_compiler/test_proof_serialization.py +121 -0
- charm/test/zkp_compiler/test_range_proof.py +241 -0
- charm/test/zkp_compiler/test_representation_proof.py +325 -0
- charm/test/zkp_compiler/test_schnorr_proof.py +221 -0
- charm/test/zkp_compiler/test_thread_safety.py +169 -0
- charm/test/zkp_compiler/test_zkp_parser.py +139 -0
- charm/toolbox/ABEnc.py +26 -0
- charm/toolbox/ABEncMultiAuth.py +66 -0
- charm/toolbox/ABEnumeric.py +800 -0
- charm/toolbox/Commit.py +24 -0
- charm/toolbox/DFA.py +89 -0
- charm/toolbox/FSA.py +1254 -0
- charm/toolbox/Hash.py +39 -0
- charm/toolbox/IBEnc.py +62 -0
- charm/toolbox/IBSig.py +64 -0
- charm/toolbox/PKEnc.py +66 -0
- charm/toolbox/PKSig.py +56 -0
- charm/toolbox/PREnc.py +32 -0
- charm/toolbox/ZKProof.py +289 -0
- charm/toolbox/__init__.py +0 -0
- charm/toolbox/bitstring.py +49 -0
- charm/toolbox/broadcast.py +220 -0
- charm/toolbox/conversion.py +100 -0
- charm/toolbox/eccurve.py +149 -0
- charm/toolbox/ecgroup.py +143 -0
- charm/toolbox/enum.py +60 -0
- charm/toolbox/hash_module.py +91 -0
- charm/toolbox/integergroup.py +323 -0
- charm/toolbox/iterate.py +22 -0
- charm/toolbox/matrixops.py +76 -0
- charm/toolbox/mpc_utils.py +296 -0
- charm/toolbox/msp.py +175 -0
- charm/toolbox/mta.py +985 -0
- charm/toolbox/node.py +120 -0
- charm/toolbox/ot/__init__.py +22 -0
- charm/toolbox/ot/base_ot.py +374 -0
- charm/toolbox/ot/dpf.py +642 -0
- charm/toolbox/ot/mpfss.py +228 -0
- charm/toolbox/ot/ot_extension.py +589 -0
- charm/toolbox/ot/silent_ot.py +378 -0
- charm/toolbox/paddingschemes.py +423 -0
- charm/toolbox/paddingschemes_test.py +238 -0
- charm/toolbox/pairingcurves.py +85 -0
- charm/toolbox/pairinggroup.py +186 -0
- charm/toolbox/policy_expression_spec.py +70 -0
- charm/toolbox/policytree.py +189 -0
- charm/toolbox/reCompiler.py +346 -0
- charm/toolbox/redundancyschemes.py +65 -0
- charm/toolbox/schemebase.py +188 -0
- charm/toolbox/secretshare.py +104 -0
- charm/toolbox/secretutil.py +174 -0
- charm/toolbox/securerandom.py +73 -0
- charm/toolbox/sigmaprotocol.py +46 -0
- charm/toolbox/specialprimes.py +45 -0
- charm/toolbox/symcrypto.py +279 -0
- charm/toolbox/threshold_sharing.py +553 -0
- charm/toolbox/xmlserialize.py +94 -0
- charm/toolbox/zknode.py +105 -0
- charm/zkp_compiler/__init__.py +89 -0
- charm/zkp_compiler/and_proof.py +460 -0
- charm/zkp_compiler/batch_verify.py +324 -0
- charm/zkp_compiler/dleq_proof.py +423 -0
- charm/zkp_compiler/or_proof.py +305 -0
- charm/zkp_compiler/range_proof.py +417 -0
- charm/zkp_compiler/representation_proof.py +466 -0
- charm/zkp_compiler/schnorr_proof.py +273 -0
- charm/zkp_compiler/thread_safe.py +150 -0
- charm/zkp_compiler/zk_demo.py +489 -0
- charm/zkp_compiler/zkp_factory.py +330 -0
- charm/zkp_compiler/zkp_generator.py +370 -0
- charm/zkp_compiler/zkparser.py +269 -0
- charm_crypto_framework-0.61.1.dist-info/METADATA +337 -0
- charm_crypto_framework-0.61.1.dist-info/RECORD +323 -0
- charm_crypto_framework-0.61.1.dist-info/WHEEL +5 -0
- charm_crypto_framework-0.61.1.dist-info/licenses/LICENSE.txt +165 -0
- charm_crypto_framework-0.61.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Boneh-Franklin Identity-Based Encryption (BF-IBE)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Dan Boneh, Matthew Franklin
|
|
5
|
+
|
|
6
|
+
| **Title:** "Identity-Based Encryption from the Weil Pairing"
|
|
7
|
+
| **Published in:** Crypto 2001
|
|
8
|
+
| **Available from:** https://crypto.stanford.edu/~dabo/papers/bfibe.pdf
|
|
9
|
+
| **Notes:** Section 4.2 - BasicIdent scheme with Fujisaki-Okamoto transformation
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** BDH (Bilinear Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele
|
|
20
|
+
:Date: 2/2011
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import ZR,G1,G2,pair
|
|
23
|
+
from charm.core.math.integer import randomBits,integer,bitsize
|
|
24
|
+
from charm.toolbox.hash_module import Hash,int2Bytes,integer
|
|
25
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class IBE_BonehFranklin(IBEnc):
|
|
29
|
+
"""
|
|
30
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup
|
|
31
|
+
>>> group = PairingGroup('MNT224', secparam=1024)
|
|
32
|
+
>>> ibe = IBE_BonehFranklin(group)
|
|
33
|
+
>>> (master_public_key, master_secret_key) = ibe.setup()
|
|
34
|
+
>>> ID = 'user@email.com'
|
|
35
|
+
>>> private_key = ibe.extract(master_secret_key, ID)
|
|
36
|
+
>>> msg = b"hello world!!!!!"
|
|
37
|
+
>>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
38
|
+
>>> ibe.decrypt(master_public_key, private_key, cipher_text)
|
|
39
|
+
b'hello world!!!!!'
|
|
40
|
+
"""
|
|
41
|
+
def __init__(self, groupObj):
|
|
42
|
+
IBEnc.__init__(self)
|
|
43
|
+
global group,h
|
|
44
|
+
group = groupObj
|
|
45
|
+
h = Hash(group)
|
|
46
|
+
|
|
47
|
+
def setup(self):
|
|
48
|
+
s, P = group.random(ZR), group.random(G2)
|
|
49
|
+
P2 = s * P
|
|
50
|
+
# choose H1, H2 hash functions
|
|
51
|
+
pk = { 'P':P, 'P2':P2 }
|
|
52
|
+
sk = { 's':s }
|
|
53
|
+
if(debug):
|
|
54
|
+
print("Public parameters...")
|
|
55
|
+
group.debug(pk)
|
|
56
|
+
print("Secret parameters...")
|
|
57
|
+
group.debug(sk)
|
|
58
|
+
return (pk, sk)
|
|
59
|
+
|
|
60
|
+
def extract(self, sk, ID):
|
|
61
|
+
d_ID = sk['s'] * group.hash(ID, G1)
|
|
62
|
+
k = { 'id':d_ID, 'IDstr':ID }
|
|
63
|
+
if(debug):
|
|
64
|
+
print("Key for id => '%s'" % ID)
|
|
65
|
+
group.debug(k)
|
|
66
|
+
return k
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def encrypt(self, pk, ID, M): # check length to make sure it is within n bits
|
|
70
|
+
Q_id = group.hash(ID, G1) #standard
|
|
71
|
+
g_id = pair(Q_id, pk['P2'])
|
|
72
|
+
#choose sig = {0,1}^n where n is # bits
|
|
73
|
+
sig = integer(randomBits(group.secparam))
|
|
74
|
+
r = h.hashToZr(sig, M)
|
|
75
|
+
|
|
76
|
+
enc_M = self.encodeToZn(M)
|
|
77
|
+
if bitsize(enc_M) / 8 <= group.messageSize():
|
|
78
|
+
C = { 'U':r * pk['P'], 'V':sig ^ h.hashToZn(g_id ** r) , 'W':enc_M ^ h.hashToZn(sig) }
|
|
79
|
+
else:
|
|
80
|
+
print("Message cannot be encoded.")
|
|
81
|
+
return None
|
|
82
|
+
|
|
83
|
+
if(debug):
|
|
84
|
+
print('\nEncrypt...')
|
|
85
|
+
print('r => %s' % r)
|
|
86
|
+
print('sig => %s' % sig)
|
|
87
|
+
print("V' =>", g_id ** r)
|
|
88
|
+
print('enc_M => %s' % enc_M)
|
|
89
|
+
group.debug(C)
|
|
90
|
+
return C
|
|
91
|
+
|
|
92
|
+
def decrypt(self, pk, sk, ct):
|
|
93
|
+
U, V, W = ct['U'], ct['V'], ct['W']
|
|
94
|
+
sig = V ^ h.hashToZn(pair(sk['id'], U))
|
|
95
|
+
dec_M = W ^ h.hashToZn(sig)
|
|
96
|
+
M = self.decodeFromZn(dec_M)
|
|
97
|
+
|
|
98
|
+
r = h.hashToZr(sig, M)
|
|
99
|
+
if(debug):
|
|
100
|
+
print('\nDecrypt....')
|
|
101
|
+
print('V =>', V)
|
|
102
|
+
print("V' =>", pair(sk['id'], U))
|
|
103
|
+
print('sig => %s' % sig)
|
|
104
|
+
print('r => %s' % r)
|
|
105
|
+
if U == r * pk['P']:
|
|
106
|
+
if debug: print("Successful Decryption!!!")
|
|
107
|
+
return M
|
|
108
|
+
if debug: print("Decryption Failed!!!")
|
|
109
|
+
return None
|
|
110
|
+
|
|
111
|
+
def encodeToZn(self, message):
|
|
112
|
+
assert type(message) == bytes, "Input must be of type bytes"
|
|
113
|
+
return integer(message)
|
|
114
|
+
|
|
115
|
+
def decodeFromZn(self, element):
|
|
116
|
+
if type(element) == integer:
|
|
117
|
+
msg = int2Bytes(element)
|
|
118
|
+
return msg
|
|
119
|
+
return None
|
|
120
|
+
|
|
121
|
+
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Camenisch-Kohlweiss-Rial-Sheedy Blind Anonymous IBE (CKRS09)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Jan Camenisch, Markulf Kohlweiss, Alfredo Rial, Caroline Sheedy
|
|
5
|
+
|
|
6
|
+
| **Title:** "Blind and Anonymous Identity-Based Encryption and Authorised Private Searches on Public Key Encrypted Data"
|
|
7
|
+
| **Published in:** PKC 2009
|
|
8
|
+
| **Available from:** http://www.iacr.org/archive/pkc2009/54430202/54430202.pdf
|
|
9
|
+
| **Notes:** Section 4.1 - First blind and anonymous IBE scheme
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based, blind, anonymous)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric pairings)
|
|
15
|
+
* **Assumption:** DBDH and related assumptions
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele, Mike Rushanan
|
|
20
|
+
:Date: 02/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
24
|
+
from charm.toolbox.conversion import Conversion
|
|
25
|
+
from charm.toolbox.bitstring import Bytes
|
|
26
|
+
from charm.toolbox.iterate import dotprod2
|
|
27
|
+
from charm.toolbox.hash_module import Waters
|
|
28
|
+
import hashlib
|
|
29
|
+
|
|
30
|
+
debug = False
|
|
31
|
+
class IBE_CKRS(IBEnc):
|
|
32
|
+
"""
|
|
33
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup, GT
|
|
34
|
+
>>> group = PairingGroup('SS512')
|
|
35
|
+
>>> ibe = IBE_CKRS(group)
|
|
36
|
+
>>> (master_public_key, master_secret_key) = ibe.setup()
|
|
37
|
+
>>> ID = "bob@mail.com"
|
|
38
|
+
>>> secret_key = ibe.extract(master_public_key, master_secret_key, ID)
|
|
39
|
+
>>> msg = group.random(GT)
|
|
40
|
+
>>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
41
|
+
>>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
|
|
42
|
+
>>> decrypted_msg == msg
|
|
43
|
+
True
|
|
44
|
+
"""
|
|
45
|
+
def __init__(self, groupObj):
|
|
46
|
+
global group,hashObj
|
|
47
|
+
group = groupObj
|
|
48
|
+
|
|
49
|
+
def setup(self, n=5, l=32):
|
|
50
|
+
"""n integers with each size l"""
|
|
51
|
+
global lam_func, waters
|
|
52
|
+
lam_func = lambda i,x,y: x[i] ** y[i]
|
|
53
|
+
waters = Waters(group, n, l)
|
|
54
|
+
alpha, t1, t2, t3, t4 = group.random(ZR, 5)
|
|
55
|
+
z = list(group.random(ZR, n))
|
|
56
|
+
g = group.random(G1)
|
|
57
|
+
h = group.random(G2)
|
|
58
|
+
omega = pair(g, h) ** (t1 * t2 * alpha)
|
|
59
|
+
g_l = [g ** i for i in z]
|
|
60
|
+
h_l = [h ** i for i in z]
|
|
61
|
+
v1, v2 = g ** t1, g ** t2
|
|
62
|
+
v3, v4 = g ** t3, g ** t4
|
|
63
|
+
msk = { 'alpha':alpha, 't1':t1, 't2':t2, 't3':t3, 't4':t4 }
|
|
64
|
+
mpk = { 'omega':omega, 'g':g, 'h':h, 'g_l':g_l, 'h_l':h_l,
|
|
65
|
+
'v1':v1, 'v2':v2, 'v3':v3, 'v4':v4, 'n':n, 'l':l }
|
|
66
|
+
return (mpk, msk)
|
|
67
|
+
|
|
68
|
+
def extract(self, mpk, msk, ID):
|
|
69
|
+
r1, r2 = group.random(ZR, 2) # should be params of extract
|
|
70
|
+
hID = waters.hash(ID)
|
|
71
|
+
hashID2 = mpk['h_l'][0] * dotprod2(range(1,mpk['n']), lam_func, mpk['h_l'], hID)
|
|
72
|
+
d = {}
|
|
73
|
+
|
|
74
|
+
d[0] = mpk['h'] ** ((r1 * msk['t1'] * msk['t2']) + (r2 * msk['t3'] * msk['t4']))
|
|
75
|
+
d[1] = (mpk['h'] ** (-msk['alpha'] * msk['t2'])) * (hashID2 ** (-r1 * msk['t2']))
|
|
76
|
+
d[2] = (mpk['h'] ** (-msk['alpha'] * msk['t1'])) * (hashID2 ** (-r1 * msk['t1']))
|
|
77
|
+
d[3] = hashID2 ** (-r2 * msk['t4'])
|
|
78
|
+
d[4] = hashID2 ** (-r2 * msk['t3'])
|
|
79
|
+
return { 'd':d }
|
|
80
|
+
|
|
81
|
+
def encrypt(self, mpk, ID, msg):
|
|
82
|
+
s, s1, s2 = group.random(ZR, 3)
|
|
83
|
+
hID = waters.hash(ID)
|
|
84
|
+
hashID1 = mpk['g_l'][0] * dotprod2(range(1,mpk['n']), lam_func, mpk['g_l'], hID)
|
|
85
|
+
c = {}
|
|
86
|
+
c_pr = (mpk['omega'] ** s) * msg
|
|
87
|
+
c[0] = hashID1 ** s
|
|
88
|
+
c[1] = mpk['v1'] ** (s - s1)
|
|
89
|
+
c[2] = mpk['v2'] ** s1
|
|
90
|
+
c[3] = mpk['v3'] ** (s - s2)
|
|
91
|
+
c[4] = mpk['v4'] ** s2
|
|
92
|
+
return {'c':c, 'c_prime':c_pr }
|
|
93
|
+
|
|
94
|
+
def decrypt(self, mpk, sk, ct):
|
|
95
|
+
c, d = ct['c'], sk['d']
|
|
96
|
+
msg = ct['c_prime'] * pair(c[0], d[0]) * pair(c[1], d[1]) * pair(c[2], d[2]) * pair(c[3], d[3]) * pair(c[4], d[4])
|
|
97
|
+
return msg
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def main():
|
|
101
|
+
groupObj = PairingGroup('SS512')
|
|
102
|
+
ibe = IBE_CKRS(groupObj)
|
|
103
|
+
(mpk, msk) = ibe.setup()
|
|
104
|
+
|
|
105
|
+
# represents public identity
|
|
106
|
+
ID = "bob@mail.com"
|
|
107
|
+
sk = ibe.extract(mpk, msk, ID)
|
|
108
|
+
|
|
109
|
+
M = groupObj.random(GT)
|
|
110
|
+
ct = ibe.encrypt(mpk, ID, M)
|
|
111
|
+
m = ibe.decrypt(mpk, sk, ct)
|
|
112
|
+
if debug: print('m =>', m)
|
|
113
|
+
|
|
114
|
+
assert m == M, "FAILED Decryption!"
|
|
115
|
+
if debug: print("Successful Decryption!!! m => '%s'" % m)
|
|
116
|
+
|
|
117
|
+
if __name__ == "__main__":
|
|
118
|
+
debug = True
|
|
119
|
+
main()
|
|
120
|
+
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
r'''
|
|
2
|
+
**Chen-Lim-Ling-Wang-Wee Shorter IBE (CLLWW12)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Jie Chen, Hoon Wei Lim, San Ling, Huaxiong Wang, Hoeteck Wee
|
|
5
|
+
|
|
6
|
+
| **Title:** "Shorter IBE and Signatures via Asymmetric Pairings"
|
|
7
|
+
| **Published in:** Pairing 2012
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2012/224
|
|
9
|
+
| **Notes:** Section 4 - Shorter IBE construction based on SXDH assumption
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** SXDH (Symmetric External Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Fan Zhang (zfwise@gwu.edu), supported by GWU computer science department
|
|
20
|
+
:Date: 3/2013
|
|
21
|
+
:Notes: Optimized implementation stores msk = {alpha, d_1*, d_2*} instead of
|
|
22
|
+
pre-computed group elements. Computes (alpha + r*ID)*d_1* - r*d_2* before
|
|
23
|
+
exponentiation, reducing G2 exponentials from 8 to 4.
|
|
24
|
+
'''
|
|
25
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
26
|
+
from charm.toolbox.matrixops import *
|
|
27
|
+
from charm.core.crypto.cryptobase import *
|
|
28
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
29
|
+
|
|
30
|
+
debug = False
|
|
31
|
+
class IBE_Chen12_z(IBEnc):
|
|
32
|
+
"""
|
|
33
|
+
>>> group = PairingGroup('MNT224', secparam=1024)
|
|
34
|
+
>>> ibe = IBE_Chen12_z(group)
|
|
35
|
+
>>> (master_public_key, master_secret_key) = ibe.setup()
|
|
36
|
+
>>> ID = 'user@email.com'
|
|
37
|
+
>>> private_key = ibe.extract(master_secret_key, ID)
|
|
38
|
+
>>> msg = group.random(GT)
|
|
39
|
+
>>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
40
|
+
>>> decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
|
|
41
|
+
>>> print (decryptedMSG==msg)
|
|
42
|
+
True
|
|
43
|
+
"""
|
|
44
|
+
def __init__(self, groupObj):
|
|
45
|
+
IBEnc.__init__(self)
|
|
46
|
+
global group
|
|
47
|
+
group = groupObj
|
|
48
|
+
|
|
49
|
+
def setup(self):
|
|
50
|
+
g1 = group.random(G1)
|
|
51
|
+
g2 = group.random(G2)
|
|
52
|
+
alpha = group.random(ZR)
|
|
53
|
+
#generate the 4*4 dual pairing vector spaces.
|
|
54
|
+
d11, d12, d13, d14, d21, d22, d23, d24 = group.random(ZR, 8)
|
|
55
|
+
d31, d32, d33, d34, d41, d42, d43, d44 = group.random(ZR, 8)
|
|
56
|
+
D11, D12, D13, D14 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
|
|
57
|
+
D21, D22, D23, D24 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
|
|
58
|
+
D31, D32, D33, D34 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
|
|
59
|
+
D41, D42, D43, D44 = group.init(ZR),group.init(ZR),group.init(ZR),group.init(ZR)
|
|
60
|
+
|
|
61
|
+
one = group.random(ZR)
|
|
62
|
+
|
|
63
|
+
[D11, D12, D13, D14] = GaussEliminationinGroups([[d11, d12, d13, d14, one],
|
|
64
|
+
[d21, d22, d23, d24, group.init(ZR, 0)],
|
|
65
|
+
[d31, d32, d33, d34, group.init(ZR, 0)],
|
|
66
|
+
[d41, d42, d43, d44, group.init(ZR, 0)]])
|
|
67
|
+
[D21, D22, D23, D24] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
|
|
68
|
+
[d21, d22, d23, d24, one],
|
|
69
|
+
[d31, d32, d33, d34, group.init(ZR, 0)],
|
|
70
|
+
[d41, d42, d43, d44, group.init(ZR, 0)]])
|
|
71
|
+
[D31, D32, D33, D34] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
|
|
72
|
+
[d21, d22, d23, d24, group.init(ZR, 0)],
|
|
73
|
+
[d31, d32, d33, d34, one],
|
|
74
|
+
[d41, d42, d43, d44, group.init(ZR, 0)]])
|
|
75
|
+
[D41, D42, D43, D44] = GaussEliminationinGroups([[d11, d12, d13, d14, group.init(ZR, 0)],
|
|
76
|
+
[d21, d22, d23, d24, group.init(ZR, 0)],
|
|
77
|
+
[d31, d32, d33, d34, group.init(ZR, 0)],
|
|
78
|
+
[d41, d42, d43, d44, one]])
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
#generate public parameters.
|
|
82
|
+
PP2 = (pair(g1, g2))**(alpha*one)
|
|
83
|
+
gd11 = g1**d11
|
|
84
|
+
gd12 = g1**d12
|
|
85
|
+
gd13 = g1**d13
|
|
86
|
+
gd14 = g1**d14
|
|
87
|
+
gd21 = g1**d21
|
|
88
|
+
gd22 = g1**d22
|
|
89
|
+
gd23 = g1**d23
|
|
90
|
+
gd24 = g1**d24
|
|
91
|
+
pk = { 'PP2':PP2,
|
|
92
|
+
'gd11':gd11, 'gd12':gd12,'gd13':gd13, 'gd14':gd14,
|
|
93
|
+
'gd21':gd21, 'gd22':gd22, 'gd23':gd23, 'gd24':gd24 }
|
|
94
|
+
#generate private parameters
|
|
95
|
+
## gD11 = g2**D11
|
|
96
|
+
## gD12 = g2**D12
|
|
97
|
+
## gD13 = g2**D13
|
|
98
|
+
## gD14 = g2**D14
|
|
99
|
+
## gD21 = g2**D21
|
|
100
|
+
## gD22 = g2**D22
|
|
101
|
+
## gD23 = g2**D23
|
|
102
|
+
## gD24 = g2**D24
|
|
103
|
+
## msk = { 'alpha':alpha, 'gD11':gD11, 'gD12':gD12, 'gD13':gD13, 'gD14':gD14,
|
|
104
|
+
## 'gD21':gD21, 'gD22':gD22, 'gD23':gD23, 'gD24':gD24 }
|
|
105
|
+
msk = {'alpha': alpha, 'g2':g2,
|
|
106
|
+
'D11':D11, 'D12':D12, 'D13':D13, 'D14':D14,
|
|
107
|
+
'D21':D21, 'D22':D22, 'D23':D23, 'D24':D24}
|
|
108
|
+
if(debug):
|
|
109
|
+
print("Public parameters...")
|
|
110
|
+
group.debug(pk)
|
|
111
|
+
print("Secret parameters...")
|
|
112
|
+
group.debug(msk)
|
|
113
|
+
return (pk, msk)
|
|
114
|
+
|
|
115
|
+
def extract(self, msk, ID):
|
|
116
|
+
_ID = group.hash(ID)
|
|
117
|
+
r = group.random(ZR)
|
|
118
|
+
sk_id1 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D11'] - r * msk['D21'])
|
|
119
|
+
sk_id2 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D12'] - r * msk['D22'])
|
|
120
|
+
sk_id3 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D13'] - r * msk['D23'])
|
|
121
|
+
sk_id4 = msk['g2']**((msk['alpha']+ r * _ID) * msk['D14'] - r * msk['D24'])
|
|
122
|
+
|
|
123
|
+
k = { 'sk_id1':sk_id1, 'sk_id2':sk_id2, 'sk_id3':sk_id3,
|
|
124
|
+
'sk_id4':sk_id4 }
|
|
125
|
+
|
|
126
|
+
if(debug):
|
|
127
|
+
print("Generate User SK...")
|
|
128
|
+
group.debug(k)
|
|
129
|
+
return k
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def encrypt(self, pk, ID, M):
|
|
133
|
+
s = group.random(ZR)
|
|
134
|
+
_ID = group.hash(ID)
|
|
135
|
+
#M is an element in GT
|
|
136
|
+
C0 = (pk['PP2']**s)*M
|
|
137
|
+
C11 = (pk['gd11']**s)*(pk['gd21']**(s*_ID))
|
|
138
|
+
C12 = (pk['gd12']**s)*(pk['gd22']**(s*_ID))
|
|
139
|
+
C13 = (pk['gd13']**s)*(pk['gd23']**(s*_ID))
|
|
140
|
+
C14 = (pk['gd14']**s)*(pk['gd24']**(s*_ID))
|
|
141
|
+
|
|
142
|
+
CT = { 'C0':C0, 'C11':C11, 'C12':C12, 'C13':C13, 'C14':C14 }
|
|
143
|
+
|
|
144
|
+
if(debug):
|
|
145
|
+
print('\nEncrypt...')
|
|
146
|
+
group.debug(CT)
|
|
147
|
+
return CT
|
|
148
|
+
|
|
149
|
+
def decrypt(self, pk, sk, ct):
|
|
150
|
+
Mprime = ct['C0']/(pair(ct['C11'],sk['sk_id1'])*pair(ct['C12'],sk['sk_id2'])*
|
|
151
|
+
pair(ct['C13'],sk['sk_id3'])*pair(ct['C14'],sk['sk_id4']))
|
|
152
|
+
|
|
153
|
+
if(debug):
|
|
154
|
+
print('\nDecrypt....')
|
|
155
|
+
return Mprime
|
|
156
|
+
|
|
157
|
+
def main():
|
|
158
|
+
|
|
159
|
+
group = PairingGroup('MNT224', secparam=1024)
|
|
160
|
+
ibe = IBE_Chen12_z(group)
|
|
161
|
+
(master_public_key, master_secret_key) = ibe.setup()
|
|
162
|
+
ID = 'user@email.com'
|
|
163
|
+
private_key = ibe.extract(master_secret_key, ID)
|
|
164
|
+
msg = group.random(GT)
|
|
165
|
+
cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
166
|
+
decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
|
|
167
|
+
print (decryptedMSG==msg)
|
|
168
|
+
|
|
169
|
+
if __name__ == '__main__':
|
|
170
|
+
debug = True
|
|
171
|
+
main()
|
|
172
|
+
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Lewko-Sahai-Waters Revocable IBE (LSW08)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Allison Lewko, Amit Sahai, Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Revocation Systems with Very Small Private Keys"
|
|
7
|
+
| **Published in:** IEEE S&P 2010
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2008/309.pdf
|
|
9
|
+
| **Notes:** Fully secure IBE construction with revocable keys
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based, revocable)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric pairings)
|
|
15
|
+
* **Assumption:** DLIN and related assumptions
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele
|
|
20
|
+
:Date: 1/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import ZR,G1,pair
|
|
23
|
+
from charm.toolbox.IBEnc import *
|
|
24
|
+
|
|
25
|
+
debug = False
|
|
26
|
+
class IBE_Revoke(IBEnc):
|
|
27
|
+
"""
|
|
28
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup, GT, G2
|
|
29
|
+
>>> group = PairingGroup('SS512')
|
|
30
|
+
>>> num_users = 5 # total # of users
|
|
31
|
+
>>> ibe = IBE_Revoke(group)
|
|
32
|
+
>>> ID = "user2@email.com"
|
|
33
|
+
>>> S = ["user1@email.com", "user3@email.com", "user4@email.com"]
|
|
34
|
+
>>> (master_public_key, master_secret_key) = ibe.setup(num_users)
|
|
35
|
+
>>> secret_key = ibe.keygen(master_public_key, master_secret_key, ID)
|
|
36
|
+
>>> msg = group.random(GT)
|
|
37
|
+
>>> cipher_text = ibe.encrypt(master_public_key, msg, S)
|
|
38
|
+
>>> decrypted_msg = ibe.decrypt(S, cipher_text, secret_key)
|
|
39
|
+
>>> decrypted_msg == msg
|
|
40
|
+
True
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
def __init__(self, groupObj):
|
|
44
|
+
IBEnc.__init__(self)
|
|
45
|
+
global group, util
|
|
46
|
+
group = groupObj
|
|
47
|
+
|
|
48
|
+
def setup(self, n):
|
|
49
|
+
g, w, h, v, v1, v2 = group.random(G1, 6)
|
|
50
|
+
a1, a2, b, alpha = group.random(ZR, 4)
|
|
51
|
+
|
|
52
|
+
tau1 = v * (v1 ** a1)
|
|
53
|
+
tau2 = v * (v2 ** a2)
|
|
54
|
+
pk = {'n':n, 'g':g, 'g^b':g ** b, 'g^a1':g ** a1, 'g^a2':g ** a2,
|
|
55
|
+
'g^ba1':g ** (b * a1), 'g^ba2':g ** (b * a2), 'tau1':tau1, 'tau2':tau2,
|
|
56
|
+
'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'w':w, 'h':h,
|
|
57
|
+
'egg_alpha': pair(g, g) ** (alpha * a1 * b)}
|
|
58
|
+
sk = {'g^alph':g ** alpha, 'g^alph_a1':g ** (alpha * a1),
|
|
59
|
+
'g^b':g ** b,'v':v, 'v1':v1, 'v2':v2, 'alpha':alpha }
|
|
60
|
+
return (pk, sk)
|
|
61
|
+
|
|
62
|
+
def keygen(self, mpk, msk, ID):
|
|
63
|
+
d1, d2, z1, z2 = group.random(ZR, 4)
|
|
64
|
+
d = d1 + d2
|
|
65
|
+
_ID = group.hash(ID.upper())
|
|
66
|
+
D = {}
|
|
67
|
+
D[1] = msk['g^alph_a1'] * (msk['v'] ** d)
|
|
68
|
+
D[2] = (mpk['g'] ** -msk['alpha']) * (msk['v1'] ** d) * (mpk['g'] ** z1)
|
|
69
|
+
D[3] = mpk['g^b'] ** -z1
|
|
70
|
+
D[4] = (msk['v2'] ** d) * (mpk['g'] ** z2)
|
|
71
|
+
D[5] = mpk['g^b'] ** -z2
|
|
72
|
+
D[6] = mpk['g^b'] ** d2
|
|
73
|
+
D[7] = mpk['g'] ** d1
|
|
74
|
+
K = ((mpk['w'] ** _ID) * mpk['h']) ** d1
|
|
75
|
+
|
|
76
|
+
sk = { 'ID':_ID, 'D':D, 'K':K }
|
|
77
|
+
return sk
|
|
78
|
+
|
|
79
|
+
def encrypt(self, mpk, M, S):
|
|
80
|
+
s1, s2 = group.random(ZR, 2)
|
|
81
|
+
s = s1 + s2
|
|
82
|
+
# number of revoked users
|
|
83
|
+
r = len(S); t_r = group.random(ZR, r)
|
|
84
|
+
t = 0
|
|
85
|
+
for i in t_r: t += i
|
|
86
|
+
|
|
87
|
+
C = {}
|
|
88
|
+
C[0] = M * (mpk['egg_alpha'] ** s2)
|
|
89
|
+
C[1] = mpk['g^b'] ** s
|
|
90
|
+
C[2] = mpk['g^ba1'] ** s1
|
|
91
|
+
C[3] = mpk['g^a1'] ** s1
|
|
92
|
+
C[4] = mpk['g^ba2'] ** s2
|
|
93
|
+
C[5] = mpk['g^a2'] ** s2
|
|
94
|
+
C[6] = (mpk['tau1'] ** s1) * (mpk['tau2'] ** s2)
|
|
95
|
+
C[7] = (mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w'] ** -t)
|
|
96
|
+
|
|
97
|
+
c1 = [i for i in range(r)]; c2 = [i for i in range(r)]
|
|
98
|
+
for i in range(len(t_r)):
|
|
99
|
+
c1[i] = mpk['g'] ** t_r[i]
|
|
100
|
+
S_hash = group.hash(S[i].upper())
|
|
101
|
+
c2[i] = ((mpk['w'] ** S_hash) * mpk['h']) ** t_r[i]
|
|
102
|
+
C['i1'] = c1
|
|
103
|
+
C['i2'] = c2
|
|
104
|
+
return C
|
|
105
|
+
|
|
106
|
+
def decrypt(self, S, ct, sk):
|
|
107
|
+
C, D, K = ct, sk['D'], sk['K']
|
|
108
|
+
_ID = sk['ID']
|
|
109
|
+
# hash IDs
|
|
110
|
+
S_id = [group.hash(i.upper()) for i in S]
|
|
111
|
+
if debug: print("hashed IDs: ", S_id)
|
|
112
|
+
if _ID in S_id: print("Your ID:", _ID, "is in revoked list!"); return
|
|
113
|
+
A1 = pair(C[1], D[1]) * pair(C[2], D[2]) * pair(C[3], D[3]) * pair(C[4], D[4]) * pair(C[5], D[5])
|
|
114
|
+
A2 = pair(C[6], D[6]) * pair(C[7], D[7])
|
|
115
|
+
A3 = A1 / A2
|
|
116
|
+
A4 = 1
|
|
117
|
+
for i in range(len(S_id)):
|
|
118
|
+
A4 *= (pair(C['i1'][i], K) / pair(C['i2'][i], D[7])) ** (1 / (_ID - S_id[i]))
|
|
119
|
+
return C[0] / (A3 / A4)
|
|
120
|
+
|