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,238 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Sahai-Waters Fuzzy Identity-Based Encryption (SW05)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Amit Sahai, Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Fuzzy Identity-Based Encryption"
|
|
7
|
+
| **Published in:** Eurocrypt 2005
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2004/086.pdf
|
|
9
|
+
| **Notes:** Original construction (Section 4) and large universe construction (Section 6)
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based, fuzzy/attribute-based)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric)
|
|
15
|
+
* **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Christina Garman
|
|
20
|
+
:Date: 10/2011
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
24
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
25
|
+
from charm.toolbox.secretshare import SecretShare
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class IBE_SW05(IBEnc):
|
|
29
|
+
"""
|
|
30
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
31
|
+
>>> group = PairingGroup('SS512')
|
|
32
|
+
>>> max_attributes = 6
|
|
33
|
+
>>> required_overlap = 4
|
|
34
|
+
>>> ibe = IBE_SW05_LUC(group)
|
|
35
|
+
>>> (master_public_key, master_key) = ibe.setup(max_attributes, required_overlap)
|
|
36
|
+
>>> private_identity = ['insurance', 'id=2345', 'oncology', 'doctor', 'nurse', 'JHU'] #private identity
|
|
37
|
+
>>> public_identity = ['insurance', 'id=2345', 'doctor', 'oncology', 'JHU', 'billing', 'misc'] #public identity for encrypt
|
|
38
|
+
>>> (pub_ID_hashed, secret_key) = ibe.extract(master_key, private_identity, master_public_key, required_overlap, max_attributes)
|
|
39
|
+
>>> msg = group.random(GT)
|
|
40
|
+
>>> cipher_text = ibe.encrypt(master_public_key, public_identity, msg, max_attributes)
|
|
41
|
+
>>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text, pub_ID_hashed, required_overlap)
|
|
42
|
+
>>> msg == decrypted_msg
|
|
43
|
+
True
|
|
44
|
+
"""
|
|
45
|
+
def __init__(self, groupObj):
|
|
46
|
+
IBEnc.__init__(self)
|
|
47
|
+
global group, H, util
|
|
48
|
+
group = groupObj
|
|
49
|
+
H = lambda x: group.hash(('0', x), ZR)
|
|
50
|
+
util = SecretShare(group, False)
|
|
51
|
+
|
|
52
|
+
def setup(self, n, d):
|
|
53
|
+
'''
|
|
54
|
+
:Parameters:
|
|
55
|
+
- ``n``: the maximum number of attributes in the system.
|
|
56
|
+
OR the maximum length of an identity
|
|
57
|
+
- ``d``: the set overlap required to decrypt
|
|
58
|
+
'''
|
|
59
|
+
g = group.random(G1)
|
|
60
|
+
y = group.random(ZR)
|
|
61
|
+
Y = pair(g, g) ** y
|
|
62
|
+
|
|
63
|
+
t = [ group.random(ZR) for x in range( n )]
|
|
64
|
+
T = [ g ** i for i in t]
|
|
65
|
+
|
|
66
|
+
pk = { 'g':g, 'Y':Y, 'T': T }
|
|
67
|
+
mk = { 'y':y, 't':t } # master secret
|
|
68
|
+
return (pk, mk)
|
|
69
|
+
|
|
70
|
+
def intersection_subset(self, w, wPrime, d):
|
|
71
|
+
S = []
|
|
72
|
+
for i in range(len(w)):
|
|
73
|
+
for j in range(len(wPrime)):
|
|
74
|
+
if(w[i] == wPrime[j]):
|
|
75
|
+
S.append(w[i])
|
|
76
|
+
|
|
77
|
+
if(len(S) < d):
|
|
78
|
+
assert False, "Cannot decrypt. w and w' do not have enough attributes in common."
|
|
79
|
+
|
|
80
|
+
S_sub = [S[k] for k in range(d)]
|
|
81
|
+
return S_sub
|
|
82
|
+
|
|
83
|
+
def extract(self, mk, ID, pk, dOver, n):
|
|
84
|
+
w_hash = [H(x) for x in ID] # assumes ID is a list
|
|
85
|
+
|
|
86
|
+
#a d-1 degree polynomial q is generated such that q(0) = y
|
|
87
|
+
q = [group.random(ZR) for x in range(dOver)]
|
|
88
|
+
q[0] = mk['y']
|
|
89
|
+
# use secret sharing as building block
|
|
90
|
+
shares = util.genShares(mk['y'], dOver, n, q, w_hash)
|
|
91
|
+
D = {}; t_index = {};
|
|
92
|
+
for i in w_hash:
|
|
93
|
+
j = w_hash.index(i)
|
|
94
|
+
D[i] = (pk['g'] ** (shares[j][1] / mk['t'][j]))
|
|
95
|
+
# dictionary for finding corresponding T public value when encrypting
|
|
96
|
+
# this eliminates ordering of attribute issues
|
|
97
|
+
t_index[i] = j;
|
|
98
|
+
|
|
99
|
+
pk['T_index'] = t_index
|
|
100
|
+
return (w_hash, { 'D':D })
|
|
101
|
+
|
|
102
|
+
def encrypt(self, pk, w_prime, M, n):
|
|
103
|
+
'''
|
|
104
|
+
Encryption with the public key, Wprime and the message M in G2
|
|
105
|
+
'''
|
|
106
|
+
w_prime_hash = [H(x) for x in w_prime]
|
|
107
|
+
s = group.random(ZR)
|
|
108
|
+
|
|
109
|
+
Eprime = M * (pk['Y'] ** s)
|
|
110
|
+
E = {}
|
|
111
|
+
for i in w_prime_hash:
|
|
112
|
+
k = pk['T_index'][i]
|
|
113
|
+
E[i] = pk['T'][k] ** s
|
|
114
|
+
|
|
115
|
+
return { 'wPrime':w_prime_hash, 'Eprime':Eprime, 'E':E}
|
|
116
|
+
|
|
117
|
+
def decrypt(self, pk, sk, CT, w, d):
|
|
118
|
+
'''dID must have an intersection overlap of at least d with Wprime to decrypt
|
|
119
|
+
'''
|
|
120
|
+
S = self.intersection_subset(w, CT['wPrime'], d)
|
|
121
|
+
coeffs = util.recoverCoefficients(S)
|
|
122
|
+
prod = 1
|
|
123
|
+
for i in S:
|
|
124
|
+
prod *= pair(sk['D'][i], CT['E'][i]) ** coeffs[i]
|
|
125
|
+
|
|
126
|
+
return CT['Eprime'] / prod
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
'''
|
|
130
|
+
Sahai-Waters Fuzzy Identity-Based Encryption, Large Universe Construction
|
|
131
|
+
|
|
132
|
+
| From: "A. Sahai, B. Waters Fuzzy Identity-Based Encryption.
|
|
133
|
+
| Published in: Eurocrypt 2005
|
|
134
|
+
| Available from: eprint.iacr.org/2004/086.pdf
|
|
135
|
+
| Notes: Original construction (Section 4) and large universe construction (Section 6).
|
|
136
|
+
|
|
137
|
+
* type: encryption (identity-based)
|
|
138
|
+
* setting: bilinear groups
|
|
139
|
+
|
|
140
|
+
:Authors: Christina Garman
|
|
141
|
+
:Date: 10/2011
|
|
142
|
+
'''
|
|
143
|
+
class IBE_SW05_LUC(IBEnc):
|
|
144
|
+
def __init__(self, groupObj):
|
|
145
|
+
IBEnc.__init__(self)
|
|
146
|
+
global group, H, util
|
|
147
|
+
group = groupObj
|
|
148
|
+
H = lambda x: group.hash(('0', x), ZR)
|
|
149
|
+
util = SecretShare(group, False)
|
|
150
|
+
|
|
151
|
+
def setup(self, n, d):
|
|
152
|
+
'''
|
|
153
|
+
:Parameters:
|
|
154
|
+
- ``n``: the maximum number of attributes in the system.
|
|
155
|
+
OR the maximum length of an identity
|
|
156
|
+
- ``d``: the set overlap required to decrypt
|
|
157
|
+
'''
|
|
158
|
+
g = group.random(G1)
|
|
159
|
+
y = group.random(ZR)
|
|
160
|
+
g1 = g ** y
|
|
161
|
+
g2 = group.random(G1)
|
|
162
|
+
|
|
163
|
+
t = [ group.random(G1) for x in range( n+1 )]
|
|
164
|
+
|
|
165
|
+
pk = { 'g':g, 'g1':g1, 'g2':g2, 't':t }
|
|
166
|
+
mk = { 'y':y } # master secret
|
|
167
|
+
return (pk, mk)
|
|
168
|
+
|
|
169
|
+
def eval_T(self, pk, n, x):
|
|
170
|
+
N = [group.init(ZR,(x + 1)) for x in range(n + 1)]
|
|
171
|
+
N_int = [(x + 1) for x in range(n + 1)]
|
|
172
|
+
|
|
173
|
+
coeffs = util.recoverCoefficients(N)
|
|
174
|
+
prod_result = 1
|
|
175
|
+
for i in N_int:
|
|
176
|
+
j = group.init(ZR, i)
|
|
177
|
+
prod_result *= (pk['t'][i-1] ** coeffs[j])
|
|
178
|
+
|
|
179
|
+
T = (pk['g2'] ** (x * n)) * prod_result
|
|
180
|
+
return T
|
|
181
|
+
|
|
182
|
+
def intersection_subset(self, w, wPrime, d):
|
|
183
|
+
S = []
|
|
184
|
+
for i in range(len(w)):
|
|
185
|
+
for j in range(len(wPrime)):
|
|
186
|
+
if(w[i] == wPrime[j]):
|
|
187
|
+
S.append(w[i])
|
|
188
|
+
|
|
189
|
+
if(len(S) < d):
|
|
190
|
+
assert False, "Cannot decrypt. w and w' do not have enough attributes in common."
|
|
191
|
+
|
|
192
|
+
S_sub = [S[k] for k in range(d)]
|
|
193
|
+
return S_sub
|
|
194
|
+
|
|
195
|
+
def extract(self, mk, ID, pk, dOver, n):
|
|
196
|
+
w_hash = [H(x) for x in ID] # assumes ID is a list
|
|
197
|
+
|
|
198
|
+
r = group.random(ZR)
|
|
199
|
+
#a d-1 degree polynomial q is generated such that q(0) = y
|
|
200
|
+
q = [group.random(ZR) for x in range(dOver)]
|
|
201
|
+
q[0] = mk['y']
|
|
202
|
+
shares = util.genShares(mk['y'], dOver, n, q, w_hash)
|
|
203
|
+
D = {}
|
|
204
|
+
d = {}
|
|
205
|
+
for i in w_hash:
|
|
206
|
+
j = w_hash.index(i)
|
|
207
|
+
D[i] = (pk['g2'] ** shares[j][1]) * (self.eval_T(pk, n, i) ** r)
|
|
208
|
+
d[i] = pk['g'] ** r
|
|
209
|
+
|
|
210
|
+
return (w_hash, { 'D':D, 'd':d })
|
|
211
|
+
|
|
212
|
+
def encrypt(self, pk, w_prime, M, n):
|
|
213
|
+
'''
|
|
214
|
+
Encryption with the public key, Wprime and the message M in G2
|
|
215
|
+
'''
|
|
216
|
+
w_prime_hash = [H(x) for x in w_prime]
|
|
217
|
+
s = group.random(ZR)
|
|
218
|
+
|
|
219
|
+
Eprime = M * (pair(pk['g1'], pk['g2']) ** s)
|
|
220
|
+
Eprimeprime = pk['g'] ** s
|
|
221
|
+
|
|
222
|
+
E = {}
|
|
223
|
+
for i in w_prime_hash:
|
|
224
|
+
E[i] = self.eval_T(pk, n, i) ** s
|
|
225
|
+
|
|
226
|
+
return { 'wPrime':w_prime_hash, 'Eprime':Eprime, 'Eprimeprime':Eprimeprime,'E':E}
|
|
227
|
+
|
|
228
|
+
def decrypt(self, pk, sk, CT, w, d):
|
|
229
|
+
'''dID must have an intersection overlap of at least d with Wprime to decrypt
|
|
230
|
+
'''
|
|
231
|
+
S = self.intersection_subset(w, CT['wPrime'], d)
|
|
232
|
+
#print("S :=", S)
|
|
233
|
+
coeffs = util.recoverCoefficients(S)
|
|
234
|
+
prod = 1
|
|
235
|
+
for i in S:
|
|
236
|
+
prod *= (pair(sk['d'][i], CT['E'][i]) / pair(sk['D'][i], CT['Eprimeprime'])) ** coeffs[i]
|
|
237
|
+
|
|
238
|
+
return CT['Eprime'] * prod
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Waters Identity-Based Encryption (Waters05)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Efficient Identity-Based Encryption Without Random Oracles"
|
|
7
|
+
| **Published in:** Eurocrypt 2005
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2005/369.pdf
|
|
9
|
+
| **Notes:** Section 4 - Secure and practical IBE without random oracles
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Gary Belvin
|
|
20
|
+
:Date: 06/2011
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
24
|
+
from charm.toolbox.IBEnc import *
|
|
25
|
+
from charm.toolbox.bitstring import Bytes
|
|
26
|
+
from charm.toolbox.hash_module import Waters
|
|
27
|
+
import hashlib, math
|
|
28
|
+
|
|
29
|
+
debug = False
|
|
30
|
+
class IBE_N04(IBEnc):
|
|
31
|
+
"""
|
|
32
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
33
|
+
>>> from charm.toolbox.hash_module import Waters
|
|
34
|
+
>>> group = PairingGroup('SS512')
|
|
35
|
+
>>> waters_hash = Waters(group)
|
|
36
|
+
>>> ibe = IBE_N04(group)
|
|
37
|
+
>>> (master_public_key, master_key) = ibe.setup()
|
|
38
|
+
>>> ID = "bob@mail.com"
|
|
39
|
+
>>> kID = waters_hash.hash(ID)
|
|
40
|
+
>>> secret_key = ibe.extract(master_key, kID)
|
|
41
|
+
>>> msg = group.random(GT)
|
|
42
|
+
>>> cipher_text = ibe.encrypt(master_public_key, kID, msg)
|
|
43
|
+
>>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
|
|
44
|
+
>>> decrypted_msg == msg
|
|
45
|
+
True
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
"""Implementation of David Naccahe Identity Based Encryption"""
|
|
49
|
+
def __init__(self, groupObj):
|
|
50
|
+
IBEnc.__init__(self)
|
|
51
|
+
IBEnc.setProperty(self, secDef=IND_ID_CPA, assumption=DBDH, secModel=SM, id=ZR, messageSpace=[GT, 'KEM'])
|
|
52
|
+
global group
|
|
53
|
+
group = groupObj
|
|
54
|
+
|
|
55
|
+
def setup(self, l=32):
|
|
56
|
+
"""l is the security parameter
|
|
57
|
+
with l = 32, and the hash function at 256 bits = n * l with n = 8"""
|
|
58
|
+
global waters
|
|
59
|
+
g = group.random(G1) # generator for group G of prime order p
|
|
60
|
+
|
|
61
|
+
sha2_byte_len = 32
|
|
62
|
+
hLen = sha2_byte_len * 8
|
|
63
|
+
n = int(math.floor(hLen / l))
|
|
64
|
+
waters = Waters(group, n, l, 'sha256')
|
|
65
|
+
|
|
66
|
+
alpha = group.random() #from Zp
|
|
67
|
+
g1 = g ** alpha # G1
|
|
68
|
+
g2 = group.random(G2) #G2
|
|
69
|
+
uprime = group.random(G2)
|
|
70
|
+
U = [group.random() for x in range(n)]
|
|
71
|
+
|
|
72
|
+
pk = {'g':g, 'g1':g1, 'g2': g2, 'uPrime':uprime, 'U': U,
|
|
73
|
+
'n':n, 'l':l}
|
|
74
|
+
|
|
75
|
+
mk = pk.copy()
|
|
76
|
+
mk['g2^alpha'] = g2 ** alpha #master secret
|
|
77
|
+
if debug:
|
|
78
|
+
print(mk)
|
|
79
|
+
|
|
80
|
+
return (pk, mk)
|
|
81
|
+
|
|
82
|
+
def extract(self, mk, v):
|
|
83
|
+
'''v = (v1, .., vn) is an identity'''
|
|
84
|
+
r = group.random()
|
|
85
|
+
|
|
86
|
+
d1 = mk['uPrime']
|
|
87
|
+
for i in range(mk['n']):
|
|
88
|
+
d1 *= mk['U'][i] ** v[i]
|
|
89
|
+
|
|
90
|
+
d1 = mk['g2^alpha'] * (d1 ** r)
|
|
91
|
+
d2 = mk['g'] ** r
|
|
92
|
+
|
|
93
|
+
if debug:
|
|
94
|
+
print("D1 =>", d1)
|
|
95
|
+
print("D2 =>", d2)
|
|
96
|
+
return {'d1': d1, 'd2':d2}
|
|
97
|
+
|
|
98
|
+
def encrypt(self, pk, ID, M): # M:GT
|
|
99
|
+
t = group.random()
|
|
100
|
+
c1 = (pair(pk['g1'], pk['g2']) ** t) * M
|
|
101
|
+
c2 = pk['g'] ** t
|
|
102
|
+
c3 = pk['uPrime']
|
|
103
|
+
for i in range(pk['n']):
|
|
104
|
+
c3 *= pk['U'][i] ** ID[i]
|
|
105
|
+
c3 = c3 ** t
|
|
106
|
+
|
|
107
|
+
if debug:
|
|
108
|
+
print("Encrypting")
|
|
109
|
+
print("C1 =>", c1)
|
|
110
|
+
print("C2 =>", c2)
|
|
111
|
+
print("C3 =>", c3)
|
|
112
|
+
return {'c1':c1, 'c2': c2, 'c3':c3}
|
|
113
|
+
|
|
114
|
+
def decrypt(self, pk, sID, ct):
|
|
115
|
+
num = pair(sID['d2'], ct['c3'])
|
|
116
|
+
dem = pair(ct['c2'], sID['d1'])
|
|
117
|
+
if debug:
|
|
118
|
+
print("Decrypting")
|
|
119
|
+
print("arg1 =>", sID['d2'].type)
|
|
120
|
+
print("arg2 =>", ct['c3'].type)
|
|
121
|
+
print("Num: =>", num)
|
|
122
|
+
print("Dem: =>", dem)
|
|
123
|
+
|
|
124
|
+
return ct['c1'] * num / dem
|
|
125
|
+
|
|
126
|
+
def main():
|
|
127
|
+
group = PairingGroup('SS512')
|
|
128
|
+
waters_hash = Waters(group)
|
|
129
|
+
ibe = IBE_N04(group)
|
|
130
|
+
(master_public_key, master_key) = ibe.setup()
|
|
131
|
+
|
|
132
|
+
ID = "bob@mail.com"
|
|
133
|
+
kID = waters_hash.hash(ID)
|
|
134
|
+
secret_key = ibe.extract(master_key, kID)
|
|
135
|
+
msg = group.random(GT)
|
|
136
|
+
cipher_text = ibe.encrypt(master_public_key, kID, msg)
|
|
137
|
+
decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
|
|
138
|
+
assert msg == decrypted_msg, "invalid decryption"
|
|
139
|
+
if debug: print("Successful Decryption!")
|
|
140
|
+
|
|
141
|
+
if __name__ == "__main__":
|
|
142
|
+
debug = True
|
|
143
|
+
main()
|
|
144
|
+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
r'''
|
|
2
|
+
**Waters Identity-Based Encryption - Optimized (Waters05-Z)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Efficient Identity-Based Encryption Without Random Oracles"
|
|
7
|
+
| **Published in:** Eurocrypt 2005
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2005/369.pdf
|
|
9
|
+
| **Notes:** Section 4 - Optimized implementation for asymmetric groups
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** DBDH (Decisional Bilinear Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Gary Belvin
|
|
20
|
+
:Date: 06/2011
|
|
21
|
+
|
|
22
|
+
:Improved by: Fan Zhang (zfwise@gwu.edu), supported by GWU computer science department
|
|
23
|
+
:Date: 3/2013
|
|
24
|
+
:Notes:
|
|
25
|
+
1. e(g_1, g_2) is pre-calculated as part of public parameters.
|
|
26
|
+
2. Fixed exponentiation by using omega vector in Z_q with u = g^omega.
|
|
27
|
+
3. Stored omega in msk to speed up extract() by computing exponent first.
|
|
28
|
+
4. Works with asymmetric groups (MNT curves).
|
|
29
|
+
5. All sk_id elements in G2 and ct_id elements in G1.
|
|
30
|
+
'''
|
|
31
|
+
from __future__ import print_function
|
|
32
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
33
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
34
|
+
from charm.toolbox.hash_module import Waters
|
|
35
|
+
import math, string, random
|
|
36
|
+
|
|
37
|
+
def randomStringGen(size=30, chars=string.ascii_uppercase + string.digits):
|
|
38
|
+
return ''.join(random.choice(chars) for x in range(size))
|
|
39
|
+
|
|
40
|
+
debug = False
|
|
41
|
+
class IBE_N04_z(IBEnc):
|
|
42
|
+
"""
|
|
43
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,GT
|
|
44
|
+
>>> from charm.toolbox.hash_module import Waters
|
|
45
|
+
>>> group = PairingGroup('SS512')
|
|
46
|
+
>>> waters_hash = Waters(group)
|
|
47
|
+
>>> ibe = IBE_N04_z(group)
|
|
48
|
+
>>> (master_public_key, master_key) = ibe.setup()
|
|
49
|
+
>>> ID = "bob@mail.com"
|
|
50
|
+
>>> kID = waters_hash.hash(ID)
|
|
51
|
+
>>> secret_key = ibe.extract(master_key, ID)
|
|
52
|
+
>>> msg = group.random(GT)
|
|
53
|
+
>>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
54
|
+
>>> decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
|
|
55
|
+
>>> decrypted_msg == msg
|
|
56
|
+
True
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
"""Implementation of David Naccahe Identity Based Encryption"""
|
|
60
|
+
def __init__(self, groupObj):
|
|
61
|
+
IBEnc.__init__(self)
|
|
62
|
+
#IBEnc.setProperty(self, secdef='IND_ID_CPA', assumption='DBDH', secmodel='Standard')
|
|
63
|
+
#, other={'id':ZR}
|
|
64
|
+
#message_space=[GT, 'KEM']
|
|
65
|
+
global group
|
|
66
|
+
group = groupObj
|
|
67
|
+
global waters_hash
|
|
68
|
+
waters_hash = Waters(group)
|
|
69
|
+
|
|
70
|
+
def setup(self, l=32):
|
|
71
|
+
'''l is the security parameter
|
|
72
|
+
with l = 32, and the hash function at 160 bits = n * l with n = 5'''
|
|
73
|
+
global waters
|
|
74
|
+
g = group.random(G1) # generator for group G of prime order p
|
|
75
|
+
|
|
76
|
+
sha2_byte_len = 32
|
|
77
|
+
hLen = sha2_byte_len * 8
|
|
78
|
+
n = int(math.floor(hLen / l))
|
|
79
|
+
waters = Waters(group, n, l, 'sha256')
|
|
80
|
+
|
|
81
|
+
alpha = group.random(ZR) #from Zp
|
|
82
|
+
g1 = g ** alpha # G1
|
|
83
|
+
g2 = group.random(G2) #G2
|
|
84
|
+
u = group.random(ZR)
|
|
85
|
+
uprime = g ** u
|
|
86
|
+
U_z = [group.random(ZR) for x in range(n)]
|
|
87
|
+
U = [g ** x for x in U_z]
|
|
88
|
+
|
|
89
|
+
pk = {'g':g, 'g1':g1, 'g2': g2, 'uPrime':uprime, 'U': U,
|
|
90
|
+
'n':n, 'l':l, 'eg1g2':pair(g1, g2)}
|
|
91
|
+
|
|
92
|
+
mk = {'g1':g1, 'g2': g2, 'n':n, 'g2^alpha': g2 ** alpha, 'U_z':U_z, 'u':u} #master secret
|
|
93
|
+
if debug:
|
|
94
|
+
print(mk)
|
|
95
|
+
|
|
96
|
+
return (pk, mk)
|
|
97
|
+
|
|
98
|
+
def extract(self, mk, ID):
|
|
99
|
+
'''v = (v1, .., vn) is an identity'''
|
|
100
|
+
|
|
101
|
+
v = waters_hash.hash(ID)
|
|
102
|
+
r = group.random(ZR)
|
|
103
|
+
|
|
104
|
+
u = mk['u']
|
|
105
|
+
|
|
106
|
+
for i in range(mk['n']):
|
|
107
|
+
u += mk['U_z'][i] * v[i]
|
|
108
|
+
d1 = mk['g2^alpha'] * (mk['g2'] ** (u * r) )
|
|
109
|
+
d2 = mk['g2'] ** r
|
|
110
|
+
|
|
111
|
+
if debug:
|
|
112
|
+
print("D1 =>", d1)
|
|
113
|
+
print("D2 =>", d2)
|
|
114
|
+
return {'d1': d1, 'd2':d2}
|
|
115
|
+
|
|
116
|
+
def encrypt(self, pk, ID, M): # M:GT
|
|
117
|
+
|
|
118
|
+
v = waters_hash.hash(ID)
|
|
119
|
+
t = group.random(ZR)
|
|
120
|
+
c1 = (pk['eg1g2'] ** t) * M
|
|
121
|
+
c2 = pk['g'] ** t
|
|
122
|
+
c3 = pk['uPrime']
|
|
123
|
+
|
|
124
|
+
for i in range(pk['n']):
|
|
125
|
+
c3 *= pk['U'][i] ** v[i]
|
|
126
|
+
c3 = c3 ** t
|
|
127
|
+
|
|
128
|
+
if debug:
|
|
129
|
+
print("Encrypting")
|
|
130
|
+
print("C1 =>", c1)
|
|
131
|
+
print("C2 =>", c2)
|
|
132
|
+
print("C3 =>", c3)
|
|
133
|
+
return {'c1':c1, 'c2': c2, 'c3':c3}
|
|
134
|
+
|
|
135
|
+
def decrypt(self, pk, sID, ct):
|
|
136
|
+
num = pair(ct['c3'], sID['d2'])
|
|
137
|
+
dem = pair(ct['c2'], sID['d1'])
|
|
138
|
+
if debug:
|
|
139
|
+
print("Decrypting")
|
|
140
|
+
print("arg1 =>", sID['d2'].type)
|
|
141
|
+
print("arg2 =>", ct['c3'].type)
|
|
142
|
+
print("Num: =>", num)
|
|
143
|
+
print("Dem: =>", dem)
|
|
144
|
+
|
|
145
|
+
return ct['c1'] * num / dem
|
|
146
|
+
|
|
147
|
+
def main():
|
|
148
|
+
group = PairingGroup('MNT224')
|
|
149
|
+
waters_hash = Waters(group)
|
|
150
|
+
ibe = IBE_N04_z(group)
|
|
151
|
+
(master_public_key, master_key) = ibe.setup()
|
|
152
|
+
|
|
153
|
+
ID = "bob@mail.com"
|
|
154
|
+
secret_key = ibe.extract(master_key, ID)
|
|
155
|
+
msg = group.random(GT)
|
|
156
|
+
cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
157
|
+
decrypted_msg = ibe.decrypt(master_public_key, secret_key, cipher_text)
|
|
158
|
+
assert msg == decrypted_msg, "invalid decryption"
|
|
159
|
+
if debug: print("Successful Decryption!")
|
|
160
|
+
|
|
161
|
+
if __name__ == "__main__":
|
|
162
|
+
debug = True
|
|
163
|
+
main()
|
|
164
|
+
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Waters Dual System Encryption (Waters09)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Dual System Encryption: Realizing Fully Secure IBE and HIBE under Simple Assumptions"
|
|
7
|
+
| **Published in:** CRYPTO 2009
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2009/385.pdf
|
|
9
|
+
| **Notes:** Fully secure IBE construction using dual system encryption
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric pairings)
|
|
15
|
+
* **Assumption:** DLIN (Decisional Linear) and related assumptions
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele
|
|
20
|
+
:Date: 03/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import ZR,G1,pair
|
|
23
|
+
from charm.toolbox.IBEnc import *
|
|
24
|
+
|
|
25
|
+
debug = False
|
|
26
|
+
class DSE09(IBEnc):
|
|
27
|
+
"""
|
|
28
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup, GT
|
|
29
|
+
>>> group = PairingGroup('SS512')
|
|
30
|
+
>>> ibe = DSE09(group)
|
|
31
|
+
>>> ID = "user2@email.com"
|
|
32
|
+
>>> (master_public_key, master_secret_key) = ibe.setup()
|
|
33
|
+
>>> secret_key = ibe.keygen(master_public_key, master_secret_key, ID)
|
|
34
|
+
>>> msg = group.random(GT)
|
|
35
|
+
>>> cipher_text = ibe.encrypt(master_public_key, msg, ID)
|
|
36
|
+
>>> decrypted_msg = ibe.decrypt(cipher_text, secret_key)
|
|
37
|
+
>>> decrypted_msg == msg
|
|
38
|
+
True
|
|
39
|
+
"""
|
|
40
|
+
def __init__(self, groupObj):
|
|
41
|
+
IBEnc.__init__(self)
|
|
42
|
+
global group, util
|
|
43
|
+
group = groupObj
|
|
44
|
+
|
|
45
|
+
def setup(self):
|
|
46
|
+
g, w, u, h, v, v1, v2 = group.random(G1, 7)
|
|
47
|
+
a1, a2, b, alpha = group.random(ZR, 4)
|
|
48
|
+
|
|
49
|
+
tau1 = v * (v1 ** a1)
|
|
50
|
+
tau2 = v * (v2 ** a2)
|
|
51
|
+
mpk = { 'g':g, 'g^b':g ** b, 'g^a1':g ** a1, 'g^a2':g ** a2,
|
|
52
|
+
'g^ba1':g ** (b * a1), 'g^ba2':g ** (b * a2), 'tau1':tau1, 'tau2':tau2,
|
|
53
|
+
'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'w':w, 'u':u,'h':h,
|
|
54
|
+
'egg_alpha': pair(g, g) ** (alpha * a1 * b) }
|
|
55
|
+
msk = { 'g^alph':g ** alpha, 'g^alph_a1':g ** (alpha * a1),
|
|
56
|
+
'v':v, 'v1':v1, 'v2':v2, 'alpha':alpha }
|
|
57
|
+
return (mpk, msk)
|
|
58
|
+
|
|
59
|
+
def keygen(self, mpk, msk, ID):
|
|
60
|
+
r1, r2, z1, z2, tag_k = group.random(ZR, 5)
|
|
61
|
+
r = r1 + r2
|
|
62
|
+
_ID = group.hash(ID)
|
|
63
|
+
D = {}
|
|
64
|
+
D[1] = msk['g^alph_a1'] * (msk['v'] ** r)
|
|
65
|
+
D[2] = (mpk['g'] ** -msk['alpha']) * (msk['v1'] ** r) * (mpk['g'] ** z1)
|
|
66
|
+
D[3] = mpk['g^b'] ** -z1
|
|
67
|
+
D[4] = (msk['v2'] ** r) * (mpk['g'] ** z2)
|
|
68
|
+
D[5] = mpk['g^b'] ** -z2
|
|
69
|
+
D[6] = mpk['g^b'] ** r2
|
|
70
|
+
D[7] = mpk['g'] ** r1
|
|
71
|
+
K = ((mpk['u'] ** _ID) * (mpk['w'] ** tag_k) * mpk['h']) ** r1
|
|
72
|
+
|
|
73
|
+
sk = { 'ID':_ID, 'D':D, 'K':K, 'tag_k':tag_k }
|
|
74
|
+
return sk
|
|
75
|
+
|
|
76
|
+
def encrypt(self, mpk, M, ID):
|
|
77
|
+
s1, s2, t, tag_c = group.random(ZR, 4)
|
|
78
|
+
s = s1 + s2
|
|
79
|
+
_ID = group.hash(ID)
|
|
80
|
+
|
|
81
|
+
C = {}
|
|
82
|
+
C[0] = M * (mpk['egg_alpha'] ** s2)
|
|
83
|
+
C[1] = mpk['g^b'] ** s
|
|
84
|
+
C[2] = mpk['g^ba1'] ** s1
|
|
85
|
+
C[3] = mpk['g^a1'] ** s1
|
|
86
|
+
C[4] = mpk['g^ba2'] ** s2
|
|
87
|
+
C[5] = mpk['g^a2'] ** s2
|
|
88
|
+
C[6] = (mpk['tau1'] ** s1) * (mpk['tau2'] ** s2)
|
|
89
|
+
C[7] = (mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w'] ** -t)
|
|
90
|
+
|
|
91
|
+
C['E1'] = ((mpk['u'] ** _ID) * (mpk['w'] ** tag_c) * mpk['h']) ** t
|
|
92
|
+
C['E2'] = mpk['g'] ** t
|
|
93
|
+
C['tag_c'] = tag_c
|
|
94
|
+
return C
|
|
95
|
+
|
|
96
|
+
def decrypt(self, ct, sk):
|
|
97
|
+
tag = (1 / (ct['tag_c'] - sk['tag_k']))
|
|
98
|
+
E1, E2 = ct['E1'], ct['E2']
|
|
99
|
+
C, D, K = ct, sk['D'], sk['K']
|
|
100
|
+
_ID = sk['ID']
|
|
101
|
+
# hash IDs
|
|
102
|
+
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])
|
|
103
|
+
A2 = pair(C[6], D[6]) * pair(C[7], D[7])
|
|
104
|
+
A3 = A1 / A2
|
|
105
|
+
A4 = (pair(E1, D[7]) / pair(E2, K)) ** tag
|
|
106
|
+
return C[0] / (A3 / A4)
|
|
107
|
+
|