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,105 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Boneh-Boyen Hierarchical Identity-Based Encryption (BB04-HIBE)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Dan Boneh, Xavier Boyen
|
|
5
|
+
|
|
6
|
+
| **Title:** "Efficient Selective Identity-Based Encryption Without Random Oracles"
|
|
7
|
+
| **Published in:** Eurocrypt 2004
|
|
8
|
+
| **Available from:** http://crypto.stanford.edu/~dabo/pubs/papers/bbibe.pdf
|
|
9
|
+
| **Notes:** Section 4.1 - Core HIBE implementation
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (hierarchical identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** Decisional Bilinear Diffie-Hellman (DBDH)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele
|
|
20
|
+
:Date: 3/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.toolbox.iterate import dotprod2
|
|
24
|
+
from charm.toolbox.hash_module import Waters
|
|
25
|
+
|
|
26
|
+
debug = False
|
|
27
|
+
class HIBE_BB04:
|
|
28
|
+
"""
|
|
29
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup, GT
|
|
30
|
+
>>> group = PairingGroup('SS512')
|
|
31
|
+
>>> hibe = HIBE_BB04(group)
|
|
32
|
+
>>> (master_public_key, master_key) = hibe.setup()
|
|
33
|
+
>>> ID = "bob@mail.com"
|
|
34
|
+
>>> (public_key, secret_key) = hibe.extract(3, master_public_key, master_key, ID)
|
|
35
|
+
>>> msg = group.random(GT)
|
|
36
|
+
>>> cipher_text = hibe.encrypt(master_public_key, public_key, msg)
|
|
37
|
+
>>> decrypted_msg = hibe.decrypt(public_key, secret_key, cipher_text)
|
|
38
|
+
>>> decrypted_msg == msg
|
|
39
|
+
True
|
|
40
|
+
|
|
41
|
+
"""
|
|
42
|
+
def __init__(self, groupObj):
|
|
43
|
+
global group, hash_func
|
|
44
|
+
group = groupObj
|
|
45
|
+
hash_func = lambda k,w,x,y,z: ((w ** x[k]) * y[k]) ** z[k]
|
|
46
|
+
|
|
47
|
+
def setup(self, l=5, z=32):
|
|
48
|
+
""" j represents maximum depth of HIBE system,
|
|
49
|
+
z represents the bit size of each integer_j of identity.
|
|
50
|
+
"""
|
|
51
|
+
assert l > 0, "invalid number of levels (need more than 0)"
|
|
52
|
+
alpha, beta = group.random(ZR, 2)
|
|
53
|
+
g = group.random(G1)
|
|
54
|
+
gb = group.random(G2)
|
|
55
|
+
g1 = g ** alpha
|
|
56
|
+
g1b = gb ** alpha
|
|
57
|
+
delta = [group.random(ZR) for i in range(l)]
|
|
58
|
+
h = [g ** delta[i] for i in range(l)]
|
|
59
|
+
hb = [gb ** delta[i] for i in range(l)]
|
|
60
|
+
g0b = gb ** (alpha * beta)
|
|
61
|
+
v = pair(g, g0b)
|
|
62
|
+
|
|
63
|
+
mpk = { 'g': g, 'g1':g1, 'h':h, 'gb':gb, 'g1b':g1b, 'hb':hb, 'v':v, 'l':l, 'z':z }
|
|
64
|
+
mk = { 'g0b':g0b }
|
|
65
|
+
return (mpk, mk)
|
|
66
|
+
|
|
67
|
+
def extract(self, level, mpk, mk, ID):
|
|
68
|
+
j = level
|
|
69
|
+
assert j >= 1 and j <= mpk['l'], "invalid level: 1 - %d" % mpk['l']
|
|
70
|
+
I = Waters(group, j, mpk['z']).hash(ID)
|
|
71
|
+
r = [group.random(ZR) for i in range(j)]
|
|
72
|
+
g_b = [mpk['gb'] ** r[i] for i in range(j)]
|
|
73
|
+
hashID = mk['g0b'] * dotprod2(range(j), hash_func, mpk['g1b'], I, mpk['hb'], r)
|
|
74
|
+
return { 'ID':ID, 'j':j }, { 'd0':hashID, 'dn':g_b }
|
|
75
|
+
|
|
76
|
+
# TODO: come back to this
|
|
77
|
+
def derive(self, mpk, pk):
|
|
78
|
+
j = pk['j'] # pk[j-1]
|
|
79
|
+
assert pk['j'] + 1 <= mpk['l'], "invalid level: 1 - %d" % mpk['l']
|
|
80
|
+
I = Waters(group, j, mpk['z']).hash(pk['ID'])
|
|
81
|
+
|
|
82
|
+
r = [group.random(ZR) for i in range(j)]
|
|
83
|
+
g_b = [pk['dn'][i] * (mpk['gb'] ** r[i]) for i in range(j)] # j-1
|
|
84
|
+
g_b.append( pk['gb'] ** r[j] ) # represents j
|
|
85
|
+
hashID = dID['d0'] * dotprod2(range(j+1), hash_func, mpk['g1b'], I, mpk['hb'], r)
|
|
86
|
+
return { 'ID':ID, 'j':j }, { 'd0':hashID, 'dn':g_b}
|
|
87
|
+
|
|
88
|
+
def encrypt(self, mpk, pk, M):
|
|
89
|
+
I = Waters(group, pk['j'], mpk['z']).hash(pk['ID'])
|
|
90
|
+
s = group.random(ZR)
|
|
91
|
+
A = M * (mpk['v'] ** s)
|
|
92
|
+
B = mpk['g'] ** s
|
|
93
|
+
C = {}
|
|
94
|
+
for i in range(pk['j']):
|
|
95
|
+
C[i] = ((mpk['g1'] ** I[i]) * mpk['h'][i]) ** s
|
|
96
|
+
|
|
97
|
+
return {'A':A, 'B':B, 'C':C, 'j':pk['j'] }
|
|
98
|
+
|
|
99
|
+
def decrypt(self, pk, sk, ct):
|
|
100
|
+
prod_result = 1
|
|
101
|
+
for i in range(ct['j']):
|
|
102
|
+
prod_result *= pair(ct['C'][i], sk['dn'][i])
|
|
103
|
+
M = ct['A'] * (prod_result / pair(ct['B'], sk['d0']))
|
|
104
|
+
return M
|
|
105
|
+
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Lewko-Waters Unbounded Hierarchical Identity-Based Encryption (LW11-HIBE)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Allison Lewko, Brent Waters
|
|
5
|
+
|
|
6
|
+
| **Title:** "Unbounded HIBE and Attribute-Based Encryption"
|
|
7
|
+
| **Published in:** Advances in Cryptology - EUROCRYPT 2011, Springer Berlin/Heidelberg
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2011/049
|
|
9
|
+
| **Notes:** Modified for prime order groups using techniques from "Tools for Simulating
|
|
10
|
+
| Features of Composite Order Bilinear Groups in the Prime Order Setting"
|
|
11
|
+
| (EUROCRYPT 2012, http://eprint.iacr.org/2011/490, Section B.3)
|
|
12
|
+
|
|
13
|
+
.. rubric:: Scheme Properties
|
|
14
|
+
|
|
15
|
+
* **Type:** encryption (hierarchical identity-based)
|
|
16
|
+
* **Setting:** bilinear groups (symmetric)
|
|
17
|
+
* **Assumption:** Decisional Linear (DLIN)
|
|
18
|
+
|
|
19
|
+
.. rubric:: Implementation
|
|
20
|
+
|
|
21
|
+
:Authors: N. Fotiou
|
|
22
|
+
:Date: 6/2014
|
|
23
|
+
'''
|
|
24
|
+
from charm.toolbox.pairinggroup import ZR,G1,G2,GT,pair
|
|
25
|
+
from charm.core.math.integer import integer,bitsize
|
|
26
|
+
from charm.toolbox.matrixops import *
|
|
27
|
+
|
|
28
|
+
debug = False
|
|
29
|
+
class HIBE_LW11:
|
|
30
|
+
"""
|
|
31
|
+
>>> from charm.toolbox.pairinggroup import GT,PairingGroup
|
|
32
|
+
>>> group = PairingGroup('SS512', secparam=512)
|
|
33
|
+
>>> msg = group.random(GT)
|
|
34
|
+
>>> #print("Message to encrypt:")
|
|
35
|
+
>>> #print (msg)
|
|
36
|
+
>>> I = [".gr.edu.mmlab"]
|
|
37
|
+
>>> I2 = [".gr.edu.mmlab","mail"]
|
|
38
|
+
>>> I3 = [".gr.edu.mmlab","mail", "fotiou"]
|
|
39
|
+
>>> hibe = HIBE_LW11(group)
|
|
40
|
+
>>> (MSK,PP) = hibe.setup()
|
|
41
|
+
>>> CT = hibe.encrypt(msg,I3,PP)
|
|
42
|
+
>>> SK = hibe.keyGen(I,MSK,PP)
|
|
43
|
+
>>> SK2 = hibe.delegate(PP,SK, I2)
|
|
44
|
+
>>> SK3 = hibe.delegate(PP,SK2, I3)
|
|
45
|
+
>>> M = hibe.decrypt(CT, SK3)
|
|
46
|
+
>>> M == msg
|
|
47
|
+
True
|
|
48
|
+
>>> M = hibe.decrypt(CT, SK2)
|
|
49
|
+
>>> M == msg
|
|
50
|
+
True
|
|
51
|
+
>>> M = hibe.decrypt(CT, SK)
|
|
52
|
+
>>> M == msg
|
|
53
|
+
True
|
|
54
|
+
"""
|
|
55
|
+
def __init__(self, groupObj):
|
|
56
|
+
global group
|
|
57
|
+
group = groupObj
|
|
58
|
+
group._verbose = True
|
|
59
|
+
return
|
|
60
|
+
|
|
61
|
+
def setup(self):
|
|
62
|
+
d = [0 for x in range(10)]
|
|
63
|
+
D = [0 for x in range(10)]
|
|
64
|
+
gauss = [0 for x in range(10)]
|
|
65
|
+
g = [0 for x in range(6)]
|
|
66
|
+
G = [0 for x in range(8)]
|
|
67
|
+
one = group.random(ZR)
|
|
68
|
+
g_r = group.random(G1)
|
|
69
|
+
for x in range(10):
|
|
70
|
+
d[x] = [group.random(ZR) for y in range(10)]
|
|
71
|
+
for x in range(10):
|
|
72
|
+
for y in range(10):
|
|
73
|
+
gauss[y] = d[y]+[group.init(ZR, 0)]
|
|
74
|
+
gauss[x] = d[x] +[one]
|
|
75
|
+
D[x] = GaussEliminationinGroups(gauss)
|
|
76
|
+
a1, a2, theta, sigma, gamma, ksi = group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR),group.random(ZR), group.random(ZR)
|
|
77
|
+
for x in range(6):
|
|
78
|
+
g[x] = [g_r**d[x][y] for y in range(10)]
|
|
79
|
+
G[0] = [g_r**D[0][y] for y in range(10)]
|
|
80
|
+
G[1] = [g_r**D[1][y] for y in range(10)]
|
|
81
|
+
G[2] = [g_r**(D[0][y]*gamma) for y in range(10)]
|
|
82
|
+
G[3] = [g_r**(D[1][y]*ksi) for y in range(10)]
|
|
83
|
+
G[4] = [g_r**(D[2][y]*theta) for y in range(10)]
|
|
84
|
+
G[5] = [g_r**(D[3][y]*theta) for y in range(10)]
|
|
85
|
+
G[6] = [g_r**(D[4][y]*sigma) for y in range(10)]
|
|
86
|
+
G[7] = [g_r**(D[5][y]*sigma) for y in range(10)]
|
|
87
|
+
PP = { 'e1':pair(g_r,g_r)**(a1*one), 'e2':pair(g_r,g_r)**(a2*one), 'g':g}
|
|
88
|
+
MSK = {'a1':a1, 'a2':a2, 'g':G}
|
|
89
|
+
if(debug):
|
|
90
|
+
print("Public parameters:")
|
|
91
|
+
group.debug(PP)
|
|
92
|
+
print("Master Secret Key:")
|
|
93
|
+
group.debug(MSK)
|
|
94
|
+
return (MSK,PP)
|
|
95
|
+
|
|
96
|
+
def keyGen(self, I, MSK, PP):
|
|
97
|
+
r1,r2,y,w = [],[],[],[]
|
|
98
|
+
for i in range(len(I)):
|
|
99
|
+
r1.append(group.random(ZR))
|
|
100
|
+
r2.append(group.random(ZR))
|
|
101
|
+
for i in range(len(I)-1):
|
|
102
|
+
y.append(group.random(ZR))
|
|
103
|
+
w.append(group.random(ZR))
|
|
104
|
+
y.append(MSK['a1'] - sum(y))
|
|
105
|
+
w.append(MSK['a2'] - sum(w))
|
|
106
|
+
K = [0 for x in range(len(I))]
|
|
107
|
+
g = [0 for x in range(6)]
|
|
108
|
+
for i in range(len(I)):
|
|
109
|
+
g[0] = [MSK['g'][0][x]**y[i] for x in range(10)]
|
|
110
|
+
g[1] = [MSK['g'][1][x]**w[i] for x in range(10)]
|
|
111
|
+
g[2] = [MSK['g'][4][x]**(r1[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
112
|
+
g[3] = [MSK['g'][5][x]**(-r1[i]) for x in range(10)]
|
|
113
|
+
g[4] = [MSK['g'][6][x]**(r2[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
114
|
+
g[5] = [MSK['g'][7][x]**(-r2[i]) for x in range(10)]
|
|
115
|
+
K[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
|
|
116
|
+
g = []
|
|
117
|
+
g.append(MSK['g'][2])
|
|
118
|
+
g.append(MSK['g'][3])
|
|
119
|
+
g.append(MSK['g'][4])
|
|
120
|
+
g.append(MSK['g'][5])
|
|
121
|
+
g.append(MSK['g'][6])
|
|
122
|
+
g.append(MSK['g'][7])
|
|
123
|
+
SK = {'g':g,'K':K}
|
|
124
|
+
if(debug):
|
|
125
|
+
print("Secret key:")
|
|
126
|
+
group.debug(SK)
|
|
127
|
+
return SK
|
|
128
|
+
|
|
129
|
+
def delegate (self, PP, SK, I):
|
|
130
|
+
y,w,w1, w2 = [],[],[],[]
|
|
131
|
+
for i in range(len(I) -1):
|
|
132
|
+
w1.append(group.random(ZR))
|
|
133
|
+
w2.append(group.random(ZR))
|
|
134
|
+
y.append(group.random(ZR))
|
|
135
|
+
w.append(group.random(ZR))
|
|
136
|
+
w1.append(group.random(ZR))
|
|
137
|
+
w2.append(group.random(ZR))
|
|
138
|
+
y.append (0 - sum(y))
|
|
139
|
+
w.append (0 - sum(w))
|
|
140
|
+
K = [0 for x in range(len(I))]
|
|
141
|
+
g = [0 for x in range(6)]
|
|
142
|
+
for i in range(len(I)-1):
|
|
143
|
+
g[0] = [SK['g'][0][x]**y[i] for x in range(10)]
|
|
144
|
+
g[1] = [SK['g'][1][x]**w[i] for x in range(10)]
|
|
145
|
+
g[2] = [SK['g'][2][x]**(w1[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
146
|
+
g[3] = [SK['g'][3][x]**(-w1[i]) for x in range(10)]
|
|
147
|
+
g[4] = [SK['g'][4][x]**(w2[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
148
|
+
g[5] = [SK['g'][5][x]**(-w2[i]) for x in range(10)]
|
|
149
|
+
K[i] = [SK['K'][i][x]*g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
|
|
150
|
+
i = len(I)-1
|
|
151
|
+
g[0] = [SK['g'][0][x]**y[i] for x in range(10)]
|
|
152
|
+
g[1] = [SK['g'][1][x]**w[i] for x in range(10)]
|
|
153
|
+
g[2] = [SK['g'][2][x]**(w1[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
154
|
+
g[3] = [SK['g'][3][x]**(-w1[i]) for x in range(10)]
|
|
155
|
+
g[4] = [SK['g'][4][x]**(w2[i]* group.hash(I[i], ZR)) for x in range(10)]
|
|
156
|
+
g[5] = [SK['g'][5][x]**(-w2[i]) for x in range(10)]
|
|
157
|
+
K[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
|
|
158
|
+
SK = {'g':SK['g'],'K':K}
|
|
159
|
+
if(debug):
|
|
160
|
+
print("Secret key:")
|
|
161
|
+
group.debug(SK)
|
|
162
|
+
return SK
|
|
163
|
+
|
|
164
|
+
def encrypt(self, M, I, PP):
|
|
165
|
+
s1, s2 = group.random(ZR), group.random(ZR)
|
|
166
|
+
t1, t2 = [],[]
|
|
167
|
+
for i in range(len(I)):
|
|
168
|
+
t1.append(group.random(ZR))
|
|
169
|
+
t2.append(group.random(ZR))
|
|
170
|
+
C0 = M*(PP['e1']**s1)*(PP['e2']**s2)
|
|
171
|
+
C = [0 for x in range(len(I))]
|
|
172
|
+
g = [0 for x in range(6)]
|
|
173
|
+
g[0] = [PP['g'][0][x]**s1 for x in range(10)]
|
|
174
|
+
g[1] = [PP['g'][1][x]**s2 for x in range(10)]
|
|
175
|
+
for i in range(len(I)):
|
|
176
|
+
g[2] = [PP['g'][2][x]**t1[i] for x in range(10)]
|
|
177
|
+
g[3] = [PP['g'][3][x]**(t1[i]*group.hash(I[i], ZR)) for x in range(10)]
|
|
178
|
+
g[4] = [PP['g'][4][x]**t2[i] for x in range(10)]
|
|
179
|
+
g[5] = [PP['g'][5][x]**(t2[i]*group.hash(I[i], ZR)) for x in range(10)]
|
|
180
|
+
C[i] = [g[0][x]*g[1][x]*g[2][x]*g[3][x]*g[4][x]*g[5][x] for x in range(10)]
|
|
181
|
+
CT = {'C0':C0, 'C':C}
|
|
182
|
+
if(debug):
|
|
183
|
+
print("CipherText:")
|
|
184
|
+
group.debug(CT)
|
|
185
|
+
return CT
|
|
186
|
+
|
|
187
|
+
def decrypt(self, CT, SK):
|
|
188
|
+
B = 1
|
|
189
|
+
for i in range(len(SK['K'])):
|
|
190
|
+
for x in range(10):
|
|
191
|
+
B*= pair(CT['C'][i][x], SK['K'][i][x])
|
|
192
|
+
M = CT['C0']/ B
|
|
193
|
+
return M
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Al-Riyami-Paterson Certificateless Public Key Cryptography (RP03)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Sattam S. Al-Riyami, Kenneth G. Paterson
|
|
5
|
+
|
|
6
|
+
| **Title:** "Certificateless Public Key Cryptography"
|
|
7
|
+
| **Published in:** Asiacrypt 2003
|
|
8
|
+
| **Available from:** https://eprint.iacr.org/2003/126.pdf
|
|
9
|
+
| **Notes:** Section 4.2 - CL-PKE scheme combining identity-based and public key encryption
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** encryption (certificateless, identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric)
|
|
15
|
+
* **Assumption:** BDH (Bilinear Diffie-Hellman)
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: Nikos Fotiou (https://www.fotiou.gr)
|
|
20
|
+
:Date: 7/2022
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup, ZR,G1,G2,pair
|
|
24
|
+
from charm.core.math.integer import randomBits,integer,bitsize
|
|
25
|
+
from charm.toolbox.hash_module import Hash,int2Bytes,integer
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class CLPKC_RP03():
|
|
29
|
+
|
|
30
|
+
def __init__(self, groupObj):
|
|
31
|
+
|
|
32
|
+
global group, h
|
|
33
|
+
group = groupObj
|
|
34
|
+
h = Hash(group)
|
|
35
|
+
|
|
36
|
+
def setup(self, secparam=None):
|
|
37
|
+
P = group.random(G1)
|
|
38
|
+
s = group.random(ZR)
|
|
39
|
+
P0 = s*P
|
|
40
|
+
params={'P':P, 'P0':P0}
|
|
41
|
+
master_key = s
|
|
42
|
+
return (params, master_key)
|
|
43
|
+
|
|
44
|
+
def partial_private_key_extract(self, master_key, ID):
|
|
45
|
+
QA = group.hash(ID, G1)
|
|
46
|
+
DA = master_key * QA
|
|
47
|
+
return DA
|
|
48
|
+
|
|
49
|
+
'''
|
|
50
|
+
DA = partial_private_key
|
|
51
|
+
xA = secret_value
|
|
52
|
+
'''
|
|
53
|
+
def set_private_key(self, DA, xA):
|
|
54
|
+
SA = xA*DA
|
|
55
|
+
return SA
|
|
56
|
+
'''
|
|
57
|
+
xA = secret_value
|
|
58
|
+
'''
|
|
59
|
+
def set_public_key(self, params, xA):
|
|
60
|
+
XA = xA*params['P']
|
|
61
|
+
YA = xA*params['P0']
|
|
62
|
+
PA = {'XA':XA, 'YA': YA}
|
|
63
|
+
return PA
|
|
64
|
+
|
|
65
|
+
def encrypt(self, params, M, ID, P): # check length to make sure it is within n bits
|
|
66
|
+
QA = group.hash(ID, G1)
|
|
67
|
+
g_id = pair(QA, P['YA'])
|
|
68
|
+
#choose σ = {0,1}^n where n is # bits
|
|
69
|
+
sig = integer(randomBits(group.secparam))
|
|
70
|
+
r = h.hashToZr(sig, M)
|
|
71
|
+
enc_M = self.encodeToZn(M)
|
|
72
|
+
if bitsize(enc_M) / 8 <= group.messageSize():
|
|
73
|
+
C = { 'U':r * params['P'], 'V':sig ^ h.hashToZn(g_id ** r) , 'W':enc_M ^ h.hashToZn(sig) }
|
|
74
|
+
else:
|
|
75
|
+
print("Message cannot be encoded.")
|
|
76
|
+
return None
|
|
77
|
+
return C
|
|
78
|
+
|
|
79
|
+
def decrypt(self, params, SA, C):
|
|
80
|
+
U, V, W = C['U'], C['V'], C['W']
|
|
81
|
+
sig = V ^ h.hashToZn(pair(SA, U))
|
|
82
|
+
dec_M = W ^ h.hashToZn(sig)
|
|
83
|
+
M = self.decodeFromZn(dec_M)
|
|
84
|
+
|
|
85
|
+
r = h.hashToZr(sig, M)
|
|
86
|
+
if U == r * params['P']:
|
|
87
|
+
if debug: print("Successful Decryption!!!")
|
|
88
|
+
return M
|
|
89
|
+
if debug: print("Decryption Failed!!!")
|
|
90
|
+
return None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def encodeToZn(self, message):
|
|
94
|
+
assert type(message) == bytes, "Input must be of type bytes"
|
|
95
|
+
return integer(message)
|
|
96
|
+
|
|
97
|
+
def decodeFromZn(self, element):
|
|
98
|
+
if type(element) == integer:
|
|
99
|
+
msg = int2Bytes(element)
|
|
100
|
+
return msg
|
|
101
|
+
return None
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def main():
|
|
105
|
+
group = PairingGroup('SS512', secparam=1024)
|
|
106
|
+
clpkc = CLPKC_RP03(group)
|
|
107
|
+
(params, master_key) = clpkc.setup()
|
|
108
|
+
ID = 'user@email.com'
|
|
109
|
+
partial_private_key = clpkc.partial_private_key_extract(master_key, ID)
|
|
110
|
+
secret_value = group.random(ZR)
|
|
111
|
+
private_key = clpkc.set_private_key(partial_private_key, secret_value)
|
|
112
|
+
public_key = clpkc.set_public_key(params, secret_value)
|
|
113
|
+
msg = b"hello world!!!!!"
|
|
114
|
+
cipher_text = clpkc.encrypt(params, msg, ID, public_key)
|
|
115
|
+
plain_text = clpkc.decrypt(params, private_key, cipher_text)
|
|
116
|
+
print (plain_text)
|
|
117
|
+
|
|
118
|
+
if __name__=='__main__':
|
|
119
|
+
main()
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Chen-Wee Dual System Groups IBE (CW13)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Jie Chen, Hoeteck Wee
|
|
5
|
+
|
|
6
|
+
| **Title:** "Dual System Groups and its Applications - Compact HIBE and More"
|
|
7
|
+
| **Published in:** CRYPTO 2013
|
|
8
|
+
| **Available from:** http://eprint.iacr.org/2013/394.pdf
|
|
9
|
+
| **Notes:** Compact IBE using dual system groups methodology
|
|
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: 5/2013
|
|
21
|
+
:Notes: Implementation optimized to reduce exponentiation and multiplication operations.
|
|
22
|
+
'''
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
24
|
+
from charm.core.crypto.cryptobase import *
|
|
25
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
26
|
+
from charm.toolbox.matrixops import *
|
|
27
|
+
|
|
28
|
+
debug = False
|
|
29
|
+
class IBE_CW13(IBEnc):
|
|
30
|
+
"""
|
|
31
|
+
>>> group = PairingGroup('MNT224', secparam=1024)
|
|
32
|
+
>>> ibe = IBE_CW13(group)
|
|
33
|
+
>>> (master_public_key, master_secret_key) = ibe.setup()
|
|
34
|
+
>>> ID = 'user@email.com'
|
|
35
|
+
>>> private_key = ibe.extract(master_public_key, master_secret_key, ID)
|
|
36
|
+
>>> msg = group.random(GT)
|
|
37
|
+
>>> cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
38
|
+
>>> decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
|
|
39
|
+
>>> print (decryptedMSG==msg)
|
|
40
|
+
True
|
|
41
|
+
"""
|
|
42
|
+
def __init__(self, groupObj):
|
|
43
|
+
IBEnc.__init__(self)
|
|
44
|
+
#IBEnc.setProperty(self, message_space=[GT, 'KEM'], secdef='IND_sID_CPA', assumption='DBDH', secmodel='ROM', other={'id':ZR})
|
|
45
|
+
global group
|
|
46
|
+
group = groupObj
|
|
47
|
+
|
|
48
|
+
def setup(self):
|
|
49
|
+
g1 = group.random(G1) #generator in G1
|
|
50
|
+
g2 = group.random(G2) #generator in G2
|
|
51
|
+
|
|
52
|
+
#generate B and B*
|
|
53
|
+
B = [[group.random(ZR), group.random(ZR)],[group.random(ZR), group.random(ZR)]]
|
|
54
|
+
|
|
55
|
+
Bt = MatrixTransGroups(B)
|
|
56
|
+
Bstar= [GaussEliminationinGroups([[Bt[0][0], Bt[0][1], group.init(ZR, 1)],
|
|
57
|
+
[Bt[1][0], Bt[1][1], group.init(ZR, 0)]]),
|
|
58
|
+
GaussEliminationinGroups([[Bt[0][0], Bt[0][1], group.init(ZR, 0)],
|
|
59
|
+
[Bt[1][0], Bt[1][1], group.init(ZR, 1)]])]
|
|
60
|
+
Bstar = MatrixTransGroups(Bstar)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
## checks Bt * Bstar = identity matrix
|
|
64
|
+
# for i in self.MatrixMulGroups(Bt, Bstar):
|
|
65
|
+
# print("[%s,%s]"%(i[0],i[1]))
|
|
66
|
+
|
|
67
|
+
#generate R
|
|
68
|
+
R = [[group.random(ZR), group.init(ZR, 0)],
|
|
69
|
+
[group.init(ZR, 0), group.init(ZR, 1)]]
|
|
70
|
+
|
|
71
|
+
#generate A1 and A2
|
|
72
|
+
A1 =[[group.random(ZR), group.random(ZR)],
|
|
73
|
+
[group.random(ZR), group.random(ZR)]]
|
|
74
|
+
A2 =[[group.random(ZR), group.random(ZR)],
|
|
75
|
+
[group.random(ZR), group.random(ZR)]]
|
|
76
|
+
k = [group.random(ZR),group.random(ZR)] #k is a 2 dimentional vector
|
|
77
|
+
|
|
78
|
+
#The following code differs from the paper.
|
|
79
|
+
BA1 = MatrixMulGroups(B,A1)
|
|
80
|
+
BA2 = MatrixMulGroups(B,A2)
|
|
81
|
+
BsR = MatrixMulGroups(Bstar,R)
|
|
82
|
+
BsA1R = MatrixMulGroups(MatrixMulGroups(Bstar, MatrixTransGroups(A1)),R)
|
|
83
|
+
BsA2R = MatrixMulGroups(MatrixMulGroups(Bstar, MatrixTransGroups(A2)),R)
|
|
84
|
+
b0 = [B[0][0],B[1][0]]
|
|
85
|
+
b1 = [BA1[0][0],BA1[1][0]]
|
|
86
|
+
b2 = [BA2[0][0],BA2[1][0]]
|
|
87
|
+
b0s = [BsR[0][0],BsR[1][0]]
|
|
88
|
+
b1s = [BsA1R[0][0],BsA1R[1][0]]
|
|
89
|
+
b2s = [BsA2R[0][0],BsA2R[1][0]]
|
|
90
|
+
|
|
91
|
+
#generate the mpk
|
|
92
|
+
g1b0 = [g1**b0[0], g1**b0[1]]
|
|
93
|
+
g1b1 = [g1**b1[0], g1**b1[1]]
|
|
94
|
+
g1b2 = [g1**b2[0], g1**b2[1]]
|
|
95
|
+
egg = (pair(g1, g2)) ** (k[0]*b0[0] + k[1]*b0[1])
|
|
96
|
+
|
|
97
|
+
mpk = {'g1':g1, 'g2':g2, 'g1b0':g1b0, 'g1b1':g1b1, 'g1b2': g1b2, 'egg':egg}
|
|
98
|
+
|
|
99
|
+
#generate private parameters
|
|
100
|
+
msk = { 'k':k, 'b0s':b0s, 'b1s':b1s,'b2s':b2s}
|
|
101
|
+
|
|
102
|
+
if(debug):
|
|
103
|
+
print("Public parameters...")
|
|
104
|
+
group.debug(mpk)
|
|
105
|
+
print("Secret parameters...")
|
|
106
|
+
group.debug(msk)
|
|
107
|
+
return (mpk, msk)
|
|
108
|
+
|
|
109
|
+
def extract(self, mpk, msk, ID):
|
|
110
|
+
#_ID is an element in ZR, r is an random number in ZR
|
|
111
|
+
_ID = group.hash(ID, ZR)
|
|
112
|
+
r = group.random(ZR)
|
|
113
|
+
|
|
114
|
+
sk_id = {'K0': [mpk['g2']**(msk['b0s'][0]*r),
|
|
115
|
+
mpk['g2']**(msk['b0s'][1]*r)],
|
|
116
|
+
'K1': [mpk['g2']**(msk['k'][0] + (msk['b2s'][0]+_ID*msk['b1s'][0])*r),
|
|
117
|
+
mpk['g2']**(msk['k'][1] + (msk['b2s'][1]+_ID*msk['b1s'][1])*r)]}
|
|
118
|
+
|
|
119
|
+
if(debug):
|
|
120
|
+
print("Generate User SK...")
|
|
121
|
+
group.debug(sk_id)
|
|
122
|
+
return sk_id
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def encrypt(self, mpk, ID, M):
|
|
126
|
+
#_ID is an element in ZR, s is an random number in ZR
|
|
127
|
+
s = group.random(ZR)
|
|
128
|
+
_ID = group.hash(ID,ZR)
|
|
129
|
+
#M is an element in GT
|
|
130
|
+
C0 = [mpk['g1b0'][0]**s, mpk['g1b0'][1]**s]
|
|
131
|
+
C1 = [(mpk['g1b2'][0]*(mpk['g1b1'][0]**_ID))**s,
|
|
132
|
+
(mpk['g1b2'][1]*(mpk['g1b1'][1]**_ID))**s]
|
|
133
|
+
C2 = (mpk['egg']**s) * M
|
|
134
|
+
|
|
135
|
+
ct_id = { 'C0':C0, 'C1':C1, 'C2':C2}
|
|
136
|
+
|
|
137
|
+
if(debug):
|
|
138
|
+
print('\nEncrypt...')
|
|
139
|
+
group.debug(ct_id)
|
|
140
|
+
return ct_id
|
|
141
|
+
|
|
142
|
+
def decrypt(self, mpk, sk_id, ct_id):
|
|
143
|
+
|
|
144
|
+
mask = self.vpair(ct_id['C0'], sk_id['K1']) / self.vpair(ct_id['C1'], sk_id['K0'])
|
|
145
|
+
Mprime = ct_id['C2']/mask
|
|
146
|
+
if(debug):
|
|
147
|
+
print('\nDecrypt....')
|
|
148
|
+
return Mprime
|
|
149
|
+
|
|
150
|
+
def vpair(self, g1v, g2v):
|
|
151
|
+
return pair(g1v[0],g2v[0]) * pair(g1v[1],g2v[1])
|
|
152
|
+
|
|
153
|
+
def main():
|
|
154
|
+
|
|
155
|
+
group = PairingGroup('MNT224', secparam=1024)
|
|
156
|
+
ibe = IBE_CW13(group)
|
|
157
|
+
(master_public_key, master_secret_key) = ibe.setup()
|
|
158
|
+
ID = 'user@email.com'
|
|
159
|
+
private_key = ibe.extract(master_public_key, master_secret_key, ID)
|
|
160
|
+
msg = group.random(GT)
|
|
161
|
+
cipher_text = ibe.encrypt(master_public_key, ID, msg)
|
|
162
|
+
decryptedMSG = ibe.decrypt(master_public_key, private_key, cipher_text)
|
|
163
|
+
print (decryptedMSG==msg)
|
|
164
|
+
|
|
165
|
+
if __name__ == '__main__':
|
|
166
|
+
debug = True
|
|
167
|
+
main()
|
|
168
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Boneh-Boyen Identity-Based Encryption (BB-IBE)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Dan Boneh, Xavier Boyen
|
|
5
|
+
|
|
6
|
+
| **Title:** "Efficient Selective-ID Secure Identity-Based Encryption Without Random Oracles"
|
|
7
|
+
| **Published in:** Eurocrypt 2004
|
|
8
|
+
| **Available from:** http://crypto.stanford.edu/~dabo/pubs/papers/bbibe.pdf
|
|
9
|
+
| **Notes:** Section 5.1 - IBE (1-level HIBE) implementation of the BB_2 scheme
|
|
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: J. Ayo Akinyele
|
|
20
|
+
:Date: 11/2010
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
24
|
+
from charm.toolbox.IBEnc import *
|
|
25
|
+
from charm.core.math.pairing import hashPair as sha2
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class IBE_BB04(IBEnc):
|
|
29
|
+
"""
|
|
30
|
+
>>> group = PairingGroup('MNT224')
|
|
31
|
+
>>> ibe = IBE_BB04(group)
|
|
32
|
+
>>> (master_public_key, master_key) = ibe.setup()
|
|
33
|
+
>>> master_public_key_ID = group.random(ZR)
|
|
34
|
+
>>> key = ibe.extract(master_key, master_public_key_ID)
|
|
35
|
+
>>> msg = group.random(GT)
|
|
36
|
+
>>> cipher_text = ibe.encrypt(master_public_key, master_public_key_ID, msg)
|
|
37
|
+
>>> decrypted_msg = ibe.decrypt(master_public_key, key, cipher_text)
|
|
38
|
+
>>> decrypted_msg == msg
|
|
39
|
+
True
|
|
40
|
+
"""
|
|
41
|
+
def __init__(self, groupObj):
|
|
42
|
+
IBEnc.__init__(self)
|
|
43
|
+
IBEnc.setProperty(self, secDef=IND_sID_CPA, assumption=DBDH,
|
|
44
|
+
messageSpace=[GT, 'KEM'], secModel=ROM, id=ZR)
|
|
45
|
+
global group
|
|
46
|
+
group = groupObj
|
|
47
|
+
|
|
48
|
+
def setup(self, secparam=None):
|
|
49
|
+
#StartBenchmark(bID1, [CpuTime, NativeTime])
|
|
50
|
+
g, h = group.random(G1), group.random(G2)
|
|
51
|
+
v = pair(g, h)
|
|
52
|
+
x, y = group.random(), group.random()
|
|
53
|
+
|
|
54
|
+
X = g ** x
|
|
55
|
+
Y = g ** y
|
|
56
|
+
pk = { 'g':g, 'X':X, 'Y':Y, 'v':v } # public params
|
|
57
|
+
mk = { 'x':x, 'y':y, 'h':h } # master secret
|
|
58
|
+
return (pk, mk)
|
|
59
|
+
|
|
60
|
+
# Note: ID is in Zp* and is the public key ID for the user
|
|
61
|
+
def extract(self, mk, ID):
|
|
62
|
+
r = group.random()
|
|
63
|
+
# compute K
|
|
64
|
+
K = mk['h'] ** ~(ID + mk['x'] + r*mk['y'])
|
|
65
|
+
return { 'id':ID, 'r':r, 'K':K }
|
|
66
|
+
|
|
67
|
+
# assume that M is in GT
|
|
68
|
+
def encrypt(self, params, ID, M):
|
|
69
|
+
s = group.random()
|
|
70
|
+
|
|
71
|
+
A = (params['v'] ** s) * M
|
|
72
|
+
B = params['Y'] ** s
|
|
73
|
+
C = (params['X'] ** s) * (params['g'] ** (s * ID))
|
|
74
|
+
return { 'A':A, 'B':B, 'C':C }
|
|
75
|
+
|
|
76
|
+
def keyenc(self, params, ID, msg):
|
|
77
|
+
s = group.random()
|
|
78
|
+
A = sha2(params['v'] ** s) # session key
|
|
79
|
+
B = params['Y'] ** s
|
|
80
|
+
C = (params['X'] ** s) * (params['g'] ** (s * ID))
|
|
81
|
+
# use prf here?
|
|
82
|
+
ciph = { 'B': B, 'C': C }
|
|
83
|
+
return (A, ciph) # user must destroy A since it protects the msg
|
|
84
|
+
|
|
85
|
+
def decrypt(self, pk, dID, CT):
|
|
86
|
+
A, B, C = CT['A'], CT['B'], CT['C']
|
|
87
|
+
v_s = pair(((B ** dID['r']) * C), dID['K'])
|
|
88
|
+
return A / v_s
|
|
89
|
+
|
|
90
|
+
def keydec(self, pk, dID, CT):
|
|
91
|
+
A, B, C = CT['A'], CT['B'], CT['C']
|
|
92
|
+
v_s = pair(((B ** dID['r']) * C), dID['K'])
|
|
93
|
+
return sha2(v_s)
|
|
94
|
+
|