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
|
+
**Waters Dual System Signature (Waters09)**
|
|
3
|
+
|
|
4
|
+
*Authors:* B. 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:** Minor improvements: removed alpha from msk, added g2^-alpha.
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** signature (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (asymmetric)
|
|
15
|
+
* **Assumption:** DLIN
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: J. Ayo Akinyele (original), Fan Zhang (improvements)
|
|
20
|
+
:Date: 2/2012 (original), 3/2013 (improvements)
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.toolbox.IBEnc import IBEnc
|
|
24
|
+
|
|
25
|
+
debug = False
|
|
26
|
+
class IBEWaters09(IBEnc):
|
|
27
|
+
"""
|
|
28
|
+
>>> group = PairingGroup('MNT224')
|
|
29
|
+
>>> ibe = IBEWaters09(group)
|
|
30
|
+
>>> (master_public_key, master_secret_key) = ibe.keygen()
|
|
31
|
+
>>> msg = "plese sign this message!!!!"
|
|
32
|
+
>>> signature = ibe.sign(master_public_key, master_secret_key, msg)
|
|
33
|
+
>>> ibe.verify(master_public_key, signature, msg)
|
|
34
|
+
True
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self, groupObj):
|
|
37
|
+
IBEnc.__init__(self)
|
|
38
|
+
global group, util
|
|
39
|
+
group = groupObj
|
|
40
|
+
|
|
41
|
+
def keygen(self):
|
|
42
|
+
g1 = group.random(G1)
|
|
43
|
+
g2 = group.random(G2)
|
|
44
|
+
a1, a2, b, alpha = group.random(ZR, 4)
|
|
45
|
+
_w, _h, _v, _v1, _v2, _u = group.random(ZR, 6)
|
|
46
|
+
|
|
47
|
+
v = g1 ** _v
|
|
48
|
+
v1 = g1 ** _v1
|
|
49
|
+
v2 = g1 ** _v2
|
|
50
|
+
|
|
51
|
+
v_2 = g2 ** _v
|
|
52
|
+
v1_2 = g2 ** _v1
|
|
53
|
+
v2_2 = g2 ** _v2
|
|
54
|
+
w1, h1 = g1 ** _w, g1 ** _h
|
|
55
|
+
w2, h2 = g2 ** _w, g2 ** _h
|
|
56
|
+
u2 = g2 ** _u
|
|
57
|
+
u1 = g1 ** _u
|
|
58
|
+
|
|
59
|
+
tau1 = v * (v1 ** a1)
|
|
60
|
+
tau2 = v * (v2 ** a2)
|
|
61
|
+
pk = { 'g1':g1, 'g2':g2, 'g1^b':g1 ** b, 'g^a1':g1 ** a1, 'g^a2':g1 ** a2,
|
|
62
|
+
'g^ba1':g1 ** (b * a1), 'g^ba2':g1 ** (b * a2), 'tau1':tau1, 'tau2':tau2,
|
|
63
|
+
'tau1^b':tau1 ** b, 'tau2^b':tau2 ** b, 'u':u1, 'u2':u2,'w1':w1, 'h1':h1, 'w2':w2, 'h2':h2,
|
|
64
|
+
'egg_alpha': pair(g1, g2) ** (alpha * a1 * b) }
|
|
65
|
+
sk = {'g^alph_a1':g2 ** (alpha * a1),
|
|
66
|
+
'g2^b':g2 ** b,'v':v_2, 'v1':v1_2, 'v2':v2_2, 'g2^-alpha':g2 ** -alpha }
|
|
67
|
+
return (pk, sk)
|
|
68
|
+
|
|
69
|
+
def sign(self, mpk, msk, m):
|
|
70
|
+
r1, r2, z1, z2, tagk = group.random(ZR, 5)
|
|
71
|
+
r = r1 + r2
|
|
72
|
+
M = group.hash(m)
|
|
73
|
+
|
|
74
|
+
S = {}
|
|
75
|
+
S[1] = msk['g^alph_a1'] * (msk['v'] ** r)
|
|
76
|
+
S[2] = msk['g2^-alpha'] * (msk['v1'] ** r) * (mpk['g2'] ** z1)
|
|
77
|
+
S[3] = msk['g2^b'] ** -z1
|
|
78
|
+
S[4] = (msk['v2'] ** r) * (mpk['g2'] ** z2)
|
|
79
|
+
S[5] = msk['g2^b'] ** -z2
|
|
80
|
+
S[6] = msk['g2^b'] ** r2
|
|
81
|
+
S[7] = mpk['g2'] ** r1
|
|
82
|
+
SK = ((mpk['u2'] ** M) * (mpk['w2'] ** tagk) * mpk['h2']) ** r1
|
|
83
|
+
|
|
84
|
+
sigma = { 'sig':S, 'K':SK, 'tagk':tagk }
|
|
85
|
+
return sigma
|
|
86
|
+
|
|
87
|
+
def verify(self, mpk, sigma, m):
|
|
88
|
+
s1, s2, t, tagc = group.random(ZR, 4)
|
|
89
|
+
s = s1 + s2
|
|
90
|
+
M = group.hash(m)
|
|
91
|
+
|
|
92
|
+
sig1, sig2, sig3, sig4, sig5, sig6, sig7, sigK, tagk = sigma['sig'][1],sigma['sig'][2],sigma['sig'][3],sigma['sig'][4],sigma['sig'][5],sigma['sig'][6],sigma['sig'][7],sigma['K'],sigma['tagk']
|
|
93
|
+
E1 = ((mpk['u'] ** M) * (mpk['w1'] ** tagc) * mpk['h1']) ** t
|
|
94
|
+
E2 = mpk['g1'] ** t
|
|
95
|
+
A = (mpk['egg_alpha'] ** s2)
|
|
96
|
+
theta = ~(tagc - tagk)
|
|
97
|
+
|
|
98
|
+
lhs_pair = pair(mpk['g1^b'] ** s, sig1) * pair(mpk['g^ba1'] ** s1, sig2) * pair(mpk['g^a1'] ** s1, sig3) * pair(mpk['g^ba2'] ** s2, sig4) * pair(mpk['g^a2'] ** s2, sig5)
|
|
99
|
+
rhs_pair = pair((mpk['tau1'] ** s1) * (mpk['tau2'] ** s2), sig6) * pair((mpk['tau1^b'] ** s1) * (mpk['tau2^b'] ** s2) * (mpk['w1'] ** -t), sig7) * (( pair(E1, sig7) / pair(E2, sigK) ) ** theta) * A
|
|
100
|
+
if lhs_pair == rhs_pair:
|
|
101
|
+
return True
|
|
102
|
+
return False
|
|
103
|
+
|
|
104
|
+
def main():
|
|
105
|
+
# scheme designed for symmetric billinear groups
|
|
106
|
+
grp = PairingGroup('MNT224')
|
|
107
|
+
|
|
108
|
+
ibe = IBEWaters09(grp)
|
|
109
|
+
|
|
110
|
+
(mpk, msk) = ibe.keygen()
|
|
111
|
+
|
|
112
|
+
m = "plese sign this message!!!!"
|
|
113
|
+
sigma = ibe.sign(mpk, msk, m)
|
|
114
|
+
if debug: print("Signature :=", sigma)
|
|
115
|
+
|
|
116
|
+
assert ibe.verify(mpk, sigma, m), "Invalid Verification!!!!"
|
|
117
|
+
if debug: print("Successful Individual Verification!")
|
|
118
|
+
|
|
119
|
+
if __name__ == "__main__":
|
|
120
|
+
debug = True
|
|
121
|
+
main()
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**Identity-Based Proxy Re-Encryption (MG07)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Matthew Green, Giuseppe Ateniese
|
|
5
|
+
|
|
6
|
+
| **Title:** "Identity-Based Proxy Re-Encryption"
|
|
7
|
+
| **Published in:** Applied Cryptography and Network Security, 2007
|
|
8
|
+
| **Available from:** http://link.springer.com/chapter/10.1007%2F978-3-540-72738-5_19
|
|
9
|
+
| **Notes:** Section 4.3
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** proxy re-encryption (identity-based)
|
|
14
|
+
* **Setting:** bilinear groups (symmetric)
|
|
15
|
+
* **Assumption:** DBDH
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: N. Fotiou
|
|
20
|
+
:Date: 11/2012
|
|
21
|
+
'''
|
|
22
|
+
from charm.toolbox.pairinggroup import pc_element,ZR,G1,G2,GT,pair
|
|
23
|
+
from charm.core.math.integer import integer,bitsize, int2Bytes, randomBits
|
|
24
|
+
from charm.toolbox.hash_module import Hash
|
|
25
|
+
from charm.core.engine.util import objectToBytes
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class PreGA:
|
|
29
|
+
"""
|
|
30
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,pc_element
|
|
31
|
+
>>> ID = "nikos fotiou"
|
|
32
|
+
>>> ID2 = "test user"
|
|
33
|
+
>>> msg = "hello world!!!!!"
|
|
34
|
+
>>> group = PairingGroup('SS512', secparam=1024)
|
|
35
|
+
>>> pre = PreGA(group)
|
|
36
|
+
>>> (master_secret_key, params) = pre.setup()
|
|
37
|
+
>>> id_secret_key = pre.keyGen(master_secret_key, ID)
|
|
38
|
+
>>> id2_secret_key = pre.keyGen(master_secret_key, ID2)
|
|
39
|
+
>>> ciphertext = pre.encrypt(params, ID, msg);
|
|
40
|
+
>>> pre.decryptFirstLevel(params,id_secret_key, ciphertext, ID)
|
|
41
|
+
b'hello world!!!!!'
|
|
42
|
+
>>> re_encryption_key = pre.rkGen(params,id_secret_key, ID, ID2)
|
|
43
|
+
>>> ciphertext2 = pre.reEncrypt(params, ID, re_encryption_key, ciphertext)
|
|
44
|
+
>>> pre.decryptSecondLevel(params,id2_secret_key,ID, ID2, ciphertext2)
|
|
45
|
+
b'hello world!!!!!'
|
|
46
|
+
"""
|
|
47
|
+
def __init__(self, groupObj):
|
|
48
|
+
global group,h
|
|
49
|
+
group = groupObj
|
|
50
|
+
h = Hash(group) # use the default
|
|
51
|
+
|
|
52
|
+
def setup(self):
|
|
53
|
+
s = group.random(ZR)
|
|
54
|
+
g = group.random(G1)
|
|
55
|
+
# choose H1-H6 hash functions
|
|
56
|
+
msk = { 's':s }
|
|
57
|
+
params = { 'g':g, 'g_s':g**s}
|
|
58
|
+
if(debug):
|
|
59
|
+
print("Public parameters...")
|
|
60
|
+
group.debug(params)
|
|
61
|
+
print("Master secret key...")
|
|
62
|
+
group.debug(msk)
|
|
63
|
+
return (msk, params)
|
|
64
|
+
|
|
65
|
+
def keyGen(self, msk, ID):
|
|
66
|
+
k = group.hash(ID,G1) ** msk['s']
|
|
67
|
+
skid = { 'skid':k }
|
|
68
|
+
if(debug):
|
|
69
|
+
print("Key for id => '%s'" % ID)
|
|
70
|
+
group.debug(skid)
|
|
71
|
+
return skid
|
|
72
|
+
|
|
73
|
+
def encrypt(self, params, ID, M):
|
|
74
|
+
enc_M = integer(M)
|
|
75
|
+
if bitsize(enc_M)/8 > group.messageSize():
|
|
76
|
+
print("Message cannot be encoded.")
|
|
77
|
+
return None
|
|
78
|
+
sigma = group.random(GT)
|
|
79
|
+
r = h.hashToZr(sigma,enc_M)
|
|
80
|
+
A = params['g'] ** r
|
|
81
|
+
B = sigma * pair(params['g_s'], group.hash(ID, G1) ** r)
|
|
82
|
+
C = enc_M ^ h.hashToZn(sigma)
|
|
83
|
+
C_ = {'A':A, 'B':B, 'C':C}
|
|
84
|
+
S = group.hash((ID, C_),G1) ** r
|
|
85
|
+
ciphertext = {'S':S,'C':C_}
|
|
86
|
+
if(debug):
|
|
87
|
+
print('\nEncrypt...')
|
|
88
|
+
print('r => %s' % r)
|
|
89
|
+
print('sigma => %s' % sigma)
|
|
90
|
+
print('enc_M => %s' % enc_M)
|
|
91
|
+
group.debug(ciphertext)
|
|
92
|
+
return ciphertext
|
|
93
|
+
|
|
94
|
+
def decryptFirstLevel(self, params, skid, cid, ID):
|
|
95
|
+
H = group.hash((ID, cid['C']), G1)
|
|
96
|
+
t = group.random(ZR)
|
|
97
|
+
sigma = cid['C']['B'] / (pair(cid['C']['A'], skid['skid'] * H ** t)/pair(params['g'] ** t, cid['S']))
|
|
98
|
+
m = cid['C']['C'] ^ h.hashToZn(sigma)
|
|
99
|
+
r = h.hashToZr(sigma,m)
|
|
100
|
+
if (cid['S'] != H**r) or (cid['C']['A'] != params['g'] ** r):
|
|
101
|
+
if debug: print("Decryption Failed")
|
|
102
|
+
return None
|
|
103
|
+
if(debug):
|
|
104
|
+
print('\nDecrypting...')
|
|
105
|
+
print('H => %s' % H)
|
|
106
|
+
print('t => %s' % t)
|
|
107
|
+
print('r => %s' % r)
|
|
108
|
+
print('sigma => %s' % sigma)
|
|
109
|
+
print(int2Bytes(m))
|
|
110
|
+
return int2Bytes(m)
|
|
111
|
+
|
|
112
|
+
def rkGen(self, params, skid, IDsrc, IDdest):
|
|
113
|
+
N = integer(randomBits(group.secparam))
|
|
114
|
+
K = pair(skid['skid'], group.hash(IDdest, G1))
|
|
115
|
+
if(debug):
|
|
116
|
+
print("\nRe-encryption key for id1 => '%s' to id2 => '%s'" % (IDsrc,IDdest))
|
|
117
|
+
group.debug(skid)
|
|
118
|
+
print('N => %s' % N)
|
|
119
|
+
print('K => %s' % K)
|
|
120
|
+
return {'N':N, 'R':group.hash((K, IDsrc, IDdest, N), G1) * skid['skid']}
|
|
121
|
+
|
|
122
|
+
def reEncrypt(self, params, IDsrc, rk, cid):
|
|
123
|
+
H = group.hash((IDsrc, cid['C']), G1)
|
|
124
|
+
if pair(params['g'], cid['S']) != pair(H, cid['C']['A']):
|
|
125
|
+
if debug: print("Re-encryption Failed")
|
|
126
|
+
return None
|
|
127
|
+
t = group.random(ZR)
|
|
128
|
+
B_ = cid['C']['B'] / (pair(cid['C']['A'], rk['R'] * H ** t)/pair(params['g'] ** t, cid['S']))
|
|
129
|
+
if(debug):
|
|
130
|
+
print('\nRe-ncrypt...')
|
|
131
|
+
print('H => %s' % H)
|
|
132
|
+
print('t => %s' % t)
|
|
133
|
+
print('B\' => %s' % B_)
|
|
134
|
+
return {'A':cid['C']['A'], 'B':B_, 'C':cid['C']['C'], 'IDsrc':IDsrc, 'N':rk['N']}
|
|
135
|
+
|
|
136
|
+
def decryptSecondLevel(self, params, skid, IDsrc, ID, cid):
|
|
137
|
+
K = pair(group.hash(IDsrc, G1), skid['skid'])
|
|
138
|
+
sigma = cid['B'] * pair(cid['A'], group.hash((K, IDsrc, ID, cid['N']), G1))
|
|
139
|
+
m = cid['C'] ^ h.hashToZn(sigma)
|
|
140
|
+
r = h.hashToZr(sigma,m)
|
|
141
|
+
if (cid['A'] != params['g'] ** r):
|
|
142
|
+
if debug: print("Decryption second level Failed")
|
|
143
|
+
return None
|
|
144
|
+
if(debug):
|
|
145
|
+
print('\nDecrypting Second Level...')
|
|
146
|
+
print('K => %s' % K)
|
|
147
|
+
print('sigma => %s' % sigma)
|
|
148
|
+
print(int2Bytes(m))
|
|
149
|
+
return int2Bytes(m)
|
|
150
|
+
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**AFGH Proxy Re-Encryption (AFGH06)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Ateniese, Fu, Green, Hohenberger
|
|
5
|
+
|
|
6
|
+
| **Title:** "Improved Proxy Re-Encryption Schemes with Applications to Secure Distributed Storage"
|
|
7
|
+
| **Published in:** ACM Transactions on Information and System Security (TISSEC), 2006
|
|
8
|
+
| **Available from:** http://dl.acm.org/citation.cfm?id=1127346
|
|
9
|
+
| **Notes:** First-level encryption & second-level decryption not yet implemented
|
|
10
|
+
|
|
11
|
+
.. rubric:: Scheme Properties
|
|
12
|
+
|
|
13
|
+
* **Type:** proxy re-encryption
|
|
14
|
+
* **Setting:** Pairing groups (Type 1 "symmetric")
|
|
15
|
+
* **Assumption:** eDBDH (Extended Decisional Bilinear DH)
|
|
16
|
+
* **Properties:** CPA-secure, unidirectional, single-hop, non-interactive, collusion-resistant
|
|
17
|
+
|
|
18
|
+
.. rubric:: Implementation
|
|
19
|
+
|
|
20
|
+
:Authors: D. Nuñez
|
|
21
|
+
:Date: 04/2016
|
|
22
|
+
'''
|
|
23
|
+
|
|
24
|
+
from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
25
|
+
from charm.toolbox.PREnc import PREnc
|
|
26
|
+
|
|
27
|
+
debug = False
|
|
28
|
+
class AFGH06(PREnc):
|
|
29
|
+
"""
|
|
30
|
+
Testing AFGH06 implementation
|
|
31
|
+
|
|
32
|
+
>>> from charm.toolbox.pairinggroup import PairingGroup,ZR,G1,G2,GT,pair
|
|
33
|
+
>>> groupObj = PairingGroup('SS512')
|
|
34
|
+
>>> pre = AFGH06(groupObj)
|
|
35
|
+
>>> params = pre.setup()
|
|
36
|
+
>>> (pk_a, sk_a) = pre.keygen(params)
|
|
37
|
+
>>> (pk_b, sk_b) = pre.keygen(params)
|
|
38
|
+
>>> msg = groupObj.random(GT)
|
|
39
|
+
>>> c_a = pre.encrypt(params, pk_a, msg)
|
|
40
|
+
>>> rk = pre.rekeygen(params, pk_a, sk_a, pk_b, sk_b)
|
|
41
|
+
>>> c_b = pre.re_encrypt(params, rk, c_a)
|
|
42
|
+
>>> assert msg == pre.decrypt(params, sk_b, c_b), 'Decryption of re-encrypted ciphertext was incorrect'
|
|
43
|
+
"""
|
|
44
|
+
|
|
45
|
+
def __init__(self, groupObj):
|
|
46
|
+
global group
|
|
47
|
+
group = groupObj
|
|
48
|
+
|
|
49
|
+
def setup(self):
|
|
50
|
+
g = group.random(G1)
|
|
51
|
+
Z = pair(g,g)
|
|
52
|
+
|
|
53
|
+
params = { 'g': g, 'Z' : Z }
|
|
54
|
+
if(debug):
|
|
55
|
+
print("Setup: Public parameters...")
|
|
56
|
+
group.debug(params)
|
|
57
|
+
return params
|
|
58
|
+
|
|
59
|
+
def keygen(self, params):
|
|
60
|
+
x1, x2 = group.random(ZR), group.random(ZR)
|
|
61
|
+
Z_x1 = params['Z'] ** x1
|
|
62
|
+
g_x2 = params['g'] ** x2
|
|
63
|
+
|
|
64
|
+
sk = { 'sk1' : x1, 'sk2' : x2 }
|
|
65
|
+
pk = { 'pk1' : Z_x1, 'pk2' : g_x2 }
|
|
66
|
+
|
|
67
|
+
if(debug):
|
|
68
|
+
print('\nKeygen...')
|
|
69
|
+
print("pk => '%s'" % pk)
|
|
70
|
+
print("sk => '%s'" % sk)
|
|
71
|
+
return (pk, sk)
|
|
72
|
+
|
|
73
|
+
def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
|
|
74
|
+
pk_b2 = pk_b['pk2']
|
|
75
|
+
sk_a1 = sk_a['sk1']
|
|
76
|
+
rk = pk_b2 ** sk_a1
|
|
77
|
+
if(debug):
|
|
78
|
+
print('\nReKeyGen...')
|
|
79
|
+
print("rk => '%s'" % rk)
|
|
80
|
+
return rk
|
|
81
|
+
|
|
82
|
+
def encrypt(self, params, pk, m):
|
|
83
|
+
#m = group.encode(M, GT)
|
|
84
|
+
r = group.random(ZR)
|
|
85
|
+
|
|
86
|
+
Z_a1 = pk['pk1']
|
|
87
|
+
|
|
88
|
+
c1 = params['g'] ** r
|
|
89
|
+
c2 = m * (Z_a1 ** r)
|
|
90
|
+
|
|
91
|
+
c = { 'c1' : c1, 'c2' : c2 }
|
|
92
|
+
|
|
93
|
+
if(debug):
|
|
94
|
+
print('\nEncrypt...')
|
|
95
|
+
print('m => %s' % m)
|
|
96
|
+
print('r => %s' % r)
|
|
97
|
+
group.debug(c)
|
|
98
|
+
return c
|
|
99
|
+
|
|
100
|
+
def decrypt(self, params, sk, c):
|
|
101
|
+
c1 = c['c1']
|
|
102
|
+
c2 = c['c2']
|
|
103
|
+
m = c2 / (c1 ** (~sk['sk2']))
|
|
104
|
+
|
|
105
|
+
if(debug):
|
|
106
|
+
print('\nDecrypt...')
|
|
107
|
+
print('m => %s' % m)
|
|
108
|
+
|
|
109
|
+
#return group.decode(m)
|
|
110
|
+
return m
|
|
111
|
+
|
|
112
|
+
def re_encrypt(self, params, rk, c_a):
|
|
113
|
+
c1 = c_a['c1']
|
|
114
|
+
c2 = c_a['c2']
|
|
115
|
+
|
|
116
|
+
c1_prime = pair(c1, rk)
|
|
117
|
+
|
|
118
|
+
c_b = { 'c1' : c1_prime, 'c2' : c2 }
|
|
119
|
+
if(debug):
|
|
120
|
+
print('\nRe-encrypt...')
|
|
121
|
+
group.debug(c_b)
|
|
122
|
+
return c_b
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
'''
|
|
2
|
+
**BBS Proxy Re-Encryption (BBS98)**
|
|
3
|
+
|
|
4
|
+
*Authors:* Blaze, Bleumer, Strauss
|
|
5
|
+
|
|
6
|
+
| **Title:** "Divertible Protocols and Atomic Proxy Cryptography"
|
|
7
|
+
| **Published in:** Advances in Cryptology - EUROCRYPT'98, 1998
|
|
8
|
+
| **Available from:** http://link.springer.com/chapter/10.1007/BFb0054122
|
|
9
|
+
|
|
10
|
+
.. rubric:: Scheme Properties
|
|
11
|
+
|
|
12
|
+
* **Type:** proxy re-encryption
|
|
13
|
+
* **Setting:** DDH-hard EC groups of prime order (F_p) or Integer Groups
|
|
14
|
+
* **Assumption:** DDH (Decisional Diffie-Hellman)
|
|
15
|
+
* **Properties:** CPA-secure, bidirectional, multihop, interactive, transitive, not collusion-resistant
|
|
16
|
+
|
|
17
|
+
.. rubric:: Implementation
|
|
18
|
+
|
|
19
|
+
:Authors: D. Nuñez (dnunez@lcc.uma.es)
|
|
20
|
+
:Date: 04/2016
|
|
21
|
+
'''
|
|
22
|
+
|
|
23
|
+
from charm.toolbox.ecgroup import G
|
|
24
|
+
from charm.toolbox.PREnc import PREnc
|
|
25
|
+
|
|
26
|
+
debug = False
|
|
27
|
+
class BBS98(PREnc):
|
|
28
|
+
"""
|
|
29
|
+
Testing BBS98 implementation
|
|
30
|
+
|
|
31
|
+
>>> from charm.toolbox.eccurve import prime192v1
|
|
32
|
+
>>> from charm.toolbox.ecgroup import ECGroup
|
|
33
|
+
>>> groupObj = ECGroup(prime192v1)
|
|
34
|
+
>>> bbs = BBS98(groupObj)
|
|
35
|
+
>>> params = bbs.setup()
|
|
36
|
+
>>> (pk_a, sk_a) = bbs.keygen(params)
|
|
37
|
+
>>> (pk_b, sk_b) = bbs.keygen(params)
|
|
38
|
+
>>> msg = b"hello world!!!123456"
|
|
39
|
+
>>> c_a = bbs.encrypt(params, pk_a, msg)
|
|
40
|
+
>>> assert msg == bbs.decrypt(params, sk_a, c_a), 'Decryption of original ciphertext was incorrect'
|
|
41
|
+
>>> rk = bbs.rekeygen(params, pk_a, sk_a, pk_b, sk_b)
|
|
42
|
+
>>> c_b = bbs.re_encrypt(params, rk, c_a)
|
|
43
|
+
>>> assert msg == bbs.decrypt(params, sk_b, c_b), 'Decryption of re-encrypted ciphertext was incorrect'
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
def __init__(self, groupObj, p=0, q=0):
|
|
47
|
+
global group
|
|
48
|
+
group = groupObj
|
|
49
|
+
if group.groupSetting() == 'integer':
|
|
50
|
+
group.p, group.q, group.r = p, q, 2
|
|
51
|
+
|
|
52
|
+
def setup(self, secparam=0):
|
|
53
|
+
global g
|
|
54
|
+
if group.groupSetting() == 'integer':
|
|
55
|
+
if group.p == 0 or group.q == 0:
|
|
56
|
+
group.paramgen(secparam)
|
|
57
|
+
g = group.randomGen()
|
|
58
|
+
elif group.groupSetting() == 'elliptic_curve':
|
|
59
|
+
group.paramgen(secparam)
|
|
60
|
+
g = group.random(G)
|
|
61
|
+
|
|
62
|
+
params = {'g': g}
|
|
63
|
+
if(debug):
|
|
64
|
+
print("Setup: Public parameters...")
|
|
65
|
+
group.debug(params)
|
|
66
|
+
return params
|
|
67
|
+
|
|
68
|
+
def keygen(self, params):
|
|
69
|
+
x = group.random()
|
|
70
|
+
g_x = params['g'] ** x
|
|
71
|
+
|
|
72
|
+
sk = x # { 'sk' : x }
|
|
73
|
+
pk = g_x # { 'pk' : g_x }
|
|
74
|
+
|
|
75
|
+
if(debug):
|
|
76
|
+
print('\nKeygen...')
|
|
77
|
+
print("pk => '%s'" % pk)
|
|
78
|
+
print("sk => '%s'" % sk)
|
|
79
|
+
return (pk, sk)
|
|
80
|
+
|
|
81
|
+
def rekeygen(self, params, pk_a, sk_a, pk_b, sk_b):
|
|
82
|
+
rk = sk_b * (~sk_a)
|
|
83
|
+
if(debug):
|
|
84
|
+
print('\nReKeyGen...')
|
|
85
|
+
print("rk => '%s'" % rk)
|
|
86
|
+
return rk
|
|
87
|
+
|
|
88
|
+
def encrypt(self, params, pk, M):
|
|
89
|
+
m = group.encode(M)
|
|
90
|
+
r = group.random()
|
|
91
|
+
c1 = pk ** r
|
|
92
|
+
c2 = (params['g'] ** r) * m
|
|
93
|
+
|
|
94
|
+
c = {'c1': c1, 'c2': c2}
|
|
95
|
+
|
|
96
|
+
if(debug):
|
|
97
|
+
print('\nEncrypt...')
|
|
98
|
+
print('m => %s' % m)
|
|
99
|
+
print('r => %s' % r)
|
|
100
|
+
group.debug(c)
|
|
101
|
+
return c
|
|
102
|
+
|
|
103
|
+
def decrypt(self, params, sk, c):
|
|
104
|
+
c1 = c['c1']
|
|
105
|
+
c2 = c['c2']
|
|
106
|
+
m = c2 / (c1 ** (~sk))
|
|
107
|
+
|
|
108
|
+
if(debug):
|
|
109
|
+
print('\nDecrypt...')
|
|
110
|
+
print('m => %s' % m)
|
|
111
|
+
|
|
112
|
+
return group.decode(m)
|
|
113
|
+
|
|
114
|
+
def re_encrypt(self, params, rk, c_a):
|
|
115
|
+
c1 = c_a['c1']
|
|
116
|
+
c2 = c_a['c2']
|
|
117
|
+
|
|
118
|
+
c_b = {'c1': (c1 ** rk), 'c2': c2}
|
|
119
|
+
|
|
120
|
+
if(debug):
|
|
121
|
+
print('\nRe-encrypt...')
|
|
122
|
+
group.debug(c_b)
|
|
123
|
+
return c_b
|