secure_comparison.keyholder module

Party that holds the secret keys. Bob; B in the paper.

class secure_comparison.keyholder.KeyHolder(l_maximum_bit_length, communicator=None, other_party='', scheme_paillier=None, scheme_dgk=None, session_id=0)[source]

Bases: object

Player Bob in the secure comparison protocol, holds the keys.

__init__(l_maximum_bit_length, communicator=None, other_party='', scheme_paillier=None, scheme_dgk=None, session_id=0)[source]
Parameters:
  • l_maximum_bit_length (int) – maximum bit length used to constrain variables ($l$).

  • communicator (Communicator | None) – object for handling communication with the Initiator during the protocol.

  • other_party (str) – identifier of the other party

  • scheme_paillier (Paillier | None) – Paillier encryption scheme (including secret key) used to produce $[[x]]$ and $[[y]]$, Alice’s input.

  • scheme_dgk (DGK | None) – DGK encryption scheme (including secret key).

  • session_id (int) – keeps track of the session.

async make_and_send_encryption_schemes(session_id=1, key_length_paillier=2048, v_bits_dgk=160, n_bits_dgk=2048)[source]

Initialize Paillier and DGK encryption schemes if they don’t already exist and sends public keys to Alice.

Parameters:
  • session_id (int) – integer to distinguish between session

  • key_length_paillier (int) – key length paillier

  • v_bits_dgk (int) – number of bits DGK private keys $v_p$ and $v_q$

  • n_bits_dgk (int) – number of bits DGK public key $n$

Raises:

ValueError – raised when communicator is not propertly configured.

Return type:

None

async perform_secure_comparison()[source]

Performs the secure comparison secure comparison for Bob. Including required communication with Alice.

Raises:

ValueError – raised when communicator is not properly configured.

Return type:

None

property scheme_dgk: DGK

DGK scheme of the keyholder.

Raises:

ValueError – No scheme available.

Returns:

DGK scheme.

property scheme_paillier: Paillier

Paillier scheme of the keyholder.

Raises:

ValueError – No scheme available.

Returns:

Paillier scheme.

static step_2(z_enc, l, scheme_paillier)[source]

$B$ decrypts $[[z]]$, and computes $beta = z mod 2^l$.

Parameters:
  • z_enc (PaillierCiphertext) – Encrypted value of $z$: $[[z]]$.

  • l (int) – Fixed value, such that $0 leq x,y < 2^l$, for any $x, y$ that will be given as input to this method.

  • scheme_paillier (Paillier) – Paillier encryption scheme.

Return type:

tuple[int, int]

Returns:

Tuple containing as first entry the plaintext value of $z$. The second entry is the value $beta = z mod 2^l$.

static step_4a(z, scheme_dgk, scheme_paillier, l)[source]

$B$ computes the encrypted bit $[d]$ where $d = (z < (N - 1)/2)$ is the bit informing $A$ whether a carryover has occurred.

Parameters:
  • z (int) – Plaintext value of $z$.

  • scheme_dgk (DGK) – DGK encryption scheme.

  • scheme_paillier (Paillier) – Paillier encryption scheme.

  • l (int) – maximum bit length used to constrain variables.

Return type:

DGKCiphertext

Returns:

Encrypted value of the bit $d = (z < (N - 1)/2)$: $[d]$.

static step_4b(beta, l, scheme_dgk)[source]

$B$ computes the encrypted bits $[beta_i], 0 leq i < l$ to $A$.

Parameters:
  • beta (int) – The value $beta$ from step 2.

  • l (int) – Fixed value, such that $0 leq x,y < 2^l$, for any $x, y$ that will be given as input to this method.

  • scheme_dgk (DGK) – DGK encryption scheme.

Return type:

list[DGKCiphertext]

Returns:

List containing the encrypted values of the bits $beta_i$: $[beta_i], 0 leq i < l$ to $A$.

static step_4j(c_is_enc, scheme_dgk)[source]

$B$ checks whether one of the numbers $c_i$ is decrypted to zero. If he finds one, $delta_B leftarrow 1$, else $delta_B leftarrow 0$.

Parameters:
  • c_is_enc (list[DGKCiphertext]) – List containing the encrypted values of the bits $c_i$: $[c_i], 0 leq i < l$.

  • scheme_dgk (DGK) – DGK encryption scheme.

Return type:

int

Returns:

Value $delta_B$.

static step_5(z, l, delta_b, scheme_paillier)[source]

$B$ computes $zeta_1 = z div 2^l$ and encrypts it to $[[zeta_1]]$ and computes $zeta_2 = (z + N) div 2^l$ and encrypts it to $[[zeta_2]]$. $B$ also encrypts $delta_B$ to $[[delta_B]]$.

Parameters:
  • z (int) – Plaintext value of $z$.

  • l (int) – Fixed value, such that $0 leq x,y < 2^l$, for any $x, y$ that will be given as input to this method.

  • delta_b (int) – The value $delta_B$ from step 4j.

  • scheme_paillier (Paillier) – Paillier encryption scheme.

Return type:

tuple[PaillierCiphertext, PaillierCiphertext, PaillierCiphertext]

Returns:

A tuple with the first entry being the encrypted value of $zeta_1$: $[[zeta_1]]$. The second entry is the encrypted value of $zeta_2$: $[[zeta_2]]$. The third entry is the encrypted value of $delta_B$: $[[delta_B]]$.