Exemplo n.º 1
0
 def deserialize(b):
     seckey_dict = json.loads(b)
     sk_record = seckey_dict['secret_key']
     sk = paillier.PaillierPrivateKey(
         public_key=paillier.PaillierPublicKey(n=int(sk_record['n'])),
         p=sk_record['p'],
         q=sk_record['q'])
     return SecretKey(sk)
Exemplo n.º 2
0
def computeData():
    data = getData()
    mycoef = LinModel().getCoef()
    pk = data['public_key']
    pubkey = paillier.PaillierPublicKey(n=int(pk['n']))
    enc_nums_rec = [paillier.EncryptedNumber(pubkey, int(x[0], int(x[1]))) for x in data['values']]
    results = sum([mycoef[i] * enc_nums_rec[i] for i in range(len(mycoef))])
    return results, pubkey
Exemplo n.º 3
0
def getKeys():
    with open('custkeys.json', 'r') as file:
        keys = json.load(file)
        pub_key = paillier.PaillierPublicKey(n=int(keys['public_key']['n']))
        priv_key = paillier.PaillierPrivateKey(pub_key,
                                               keys['private_key']['p'],
                                               keys['private_key']['q'])
        return pub_key, priv_key
Exemplo n.º 4
0
def load_public_key(public_key_data):
    error_msg = "Invalid public key"
    assert 'alg' in public_key_data, error_msg
    assert public_key_data['alg'] == 'PAI-GN1', error_msg
    assert public_key_data['kty'] == 'DAJ', error_msg

    n = phe.util.base64_to_int(public_key_data['n'])
    pub = phe.PaillierPublicKey(n)
    return pub
Exemplo n.º 5
0
def loadAnswer():
    with open('answer.json', 'r') as file: 
    ans=json.load(file)
    answer=json.loads(ans)
    return answer

pub_key, priv_key = getKeys()
data = age, he, al, gen = [24,4,6,1]
serializeData(pub_key, data)
datafile=serializeData(pub_key, data)
with open('data.json', 'w') as file: 
    json.dump(datafile, file)

answer_file=loadAnswer()
answer_key=paillier.PaillierPublicKey(n=int(answer_file['pubkey']['n']))
answer = paillier.EncryptedNumber(answer_key, int(answer_file['values'][0]), int(answer_file['values'][1]))
if (answer_key==pub_key):
    print(priv_key.decrypt(answer))
	
Exemplo n.º 6
0
    def __init__(self):
        if not config.use_he:
            # pubkey mock
            self.pubkey = phe.PaillierPublicKey(1)
            return

        Key, _, _, _, PublicKey, _, _, SecretKeyShares, theta = generate_shared_paillier_key(
            keyLength=config.key_length,
            n=config.n_parties,
            t=config.threshold,
        )

        self.prikey = Key
        self.pubkey = PublicKey

        # decrypt takes one argument -- ciphertext to decode
        self.decrypt = partial(Key.decrypt,
                               n=config.n_parties,
                               t=config.threshold,
                               PublicKey=PublicKey,
                               SecretKeyShares=SecretKeyShares,
                               theta=theta)
Exemplo n.º 7
0
 def deserialize(b):
     pubkey_dict = json.loads(b)
     pk_record = pubkey_dict['public_key']
     pk = paillier.PaillierPublicKey(n=int(pk_record['n']))
     return PublicKey(pk)
Exemplo n.º 8
0
def main():

    linmodel.mainLinModel()
    servercalc.mainServerCalc()

    print(
        "Saisissez les donnees sous la forme a,b,c,d avec a,b,c et d 4 entiers"
    )
    input1 = input()

    pub_key, priv_key = cust.getKeys()
    data = []
    for i in range(4):
        print(
            input1.split(',')[i], " est chiffré par ",
            servercalc.getData().get('values')[i][0][0:12], '...')
        data.append(int(input1.split(',')[i]))
    cust.serializeData(pub_key, data)
    datafile = cust.serializeData(pub_key, data)
    with open('data.json', 'w') as file:
        json.dump(datafile, file)

    answer_file = cust.loadAnswer()
    answer_key = paillier.PaillierPublicKey(n=int(answer_file['pubkey']['n']))
    answer = paillier.EncryptedNumber(answer_key,
                                      int(answer_file['values'][0]),
                                      int(answer_file['values'][1]))
    print(priv_key.decrypt(answer))

    # Affichage

    window = Tk()
    window.title("Simulation")
    window.geometry("1920x1060")
    window.iconbitmap("hash.ico")
    window.config(background='grey')

    # premier texte

    label_title = Label(window,
                        text="Simulation",
                        font=("Courrier, 30"),
                        bg='Grey',
                        fg='white')
    label_title.grid(row=0, column=2)

    label_title = Label(window,
                        text="Chiffrement homomorphe",
                        font=("Courrier, 30"),
                        bg='Grey',
                        fg='white')
    label_title.grid(row=1, column=2)
    # second texte

    label_subtitle1 = Label(window,
                            text="① Utilisateur",
                            font=("Courrier, 25"),
                            bg='white',
                            fg='grey')
    label_subtitle1.grid(row=2, column=1)

    #troisieme texte

    label_subtitle3 = Label(
        window,
        text="Les données entrées par l'utilisateur sont :",
        font=("Courrier,25"),
        bg='grey',
        fg='white')
    label_subtitle3.grid(row=3, column=1)

    label_subtitle4 = Label(window,
                            text=data,
                            font=("Courrier,500"),
                            bg='grey',
                            fg='white')
    label_subtitle4.grid(row=4, column=1)

    label_subtitle3 = Label(window,
                            text="et sont chiffrées respectivement par :",
                            font=("Courrier,25"),
                            bg='grey',
                            fg='white')
    label_subtitle3.grid(row=5, column=1)

    label_subtitle5 = Label(
        window,
        text=servercalc.getData().get('values')[0][0][0:12] + "...",
        font=("Courrier, 25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=6, column=1)

    label_subtitle5 = Label(
        window,
        text=servercalc.getData().get('values')[1][0][0:12] + "...",
        font=("Courrier, 25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=7, column=1)

    label_subtitle5 = Label(
        window,
        text=servercalc.getData().get('values')[2][0][0:12] + "...",
        font=("Courrier, 25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=8, column=1)

    label_subtitle5 = Label(
        window,
        text=servercalc.getData().get('values')[3][0][0:12] + "...",
        font=("Courrier, 25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=9, column=1)

    label_subtitle2 = Label(window,
                            text="② Serveur externe (cloud)",
                            font=("Courrier, 25"),
                            bg='white',
                            fg='grey')
    label_subtitle2.grid(row=10, column=3)

    label_subtitle5 = Label(
        window,
        text=
        "Les coefficients donnés par l'algorithme de Machine Learning à appliqués aux données sont :",
        font=("Courrier,25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=11, column=3)

    label_subtitle5 = Label(window,
                            text=linmodel.LinModel().getCoef(),
                            font=("Courrier,25"),
                            bg='grey',
                            fg='white')
    label_subtitle5.grid(row=12, column=3)

    label_subtitle5 = Label(
        window,
        text=
        "L'opération \"coefficient i\" multiplié par  l'élément i des données chiffrées donne :",
        font=("Courrier,25"),
        bg='grey',
        fg='white')
    label_subtitle5.grid(row=13, column=3)

    label_subtitle6 = Label(window,
                            text=answer_file['values'][0][0:12] + "...",
                            font=("Courrier, 25"),
                            bg='grey',
                            fg='white')
    label_subtitle6.grid(row=14, column=3)
    #computeData()[0].ciphertext()

    label_subtitle1 = Label(window,
                            text="③ Utilisateur",
                            font=("Courrier, 25"),
                            bg='white',
                            fg='grey')
    label_subtitle1.grid(row=15, column=1)

    label_subtitle1 = Label(window,
                            text="Récupération du résultat chiffré",
                            font=("Courrier, 25"),
                            bg='grey',
                            fg='white')
    label_subtitle1.grid(row=16, column=1)

    label_subtitle1 = Label(window,
                            text="Après déchiffrement, on obtient :",
                            font=("Courrier, 25"),
                            bg='grey',
                            fg='white')
    label_subtitle1.grid(row=17, column=1)

    label_subtitle7 = Label(window,
                            text=priv_key.decrypt(answer),
                            font=("Courrier,35"),
                            bg='grey',
                            fg='white')
    label_subtitle7.grid(row=18, column=1)

    #    window.grid_rowconfigure(0, minsize=150)
    #    window.grid_rowconfigure(8, minsize=150)
    #    window.grid_rowconfigure(5, minsize=150)

    # afficher

    window.mainloop()
 def get_deserialized_public_key(self, public_key):
     return paillier.PaillierPublicKey(n=int(public_key))
Exemplo n.º 10
0
    encrypted_data['values'] = [(str(x.ciphertext()), x.exponent)
                                for x in encrypted_data_list]
    serialized = json.dumps(encrypted_data)
    return serialized


def loadAnswer():
    '''This function is intended to load the encrypted data coming from the server.'''

    with open('answer.json', 'r') as file:
        ans = json.load(file)
        answer = json.loads(ans)
        return answer


pub_key, priv_key = getKeys()
data = age, he, al, gen = [24, 4, 6, 1]
serializeData(pub_key, data)
datafile = serializeData(pub_key, data)
with open('data.json', 'w') as file:
    json.dump(datafile, file)

answer_file = loadAnswer()
answer_key = paillier.PaillierPublicKey(n=int(answer_file['pubkey']['n']))
answer = paillier.EncryptedNumber(answer_key, int(answer_file['values'][0]),
                                  int(answer_file['values'][1]))

# Decrypted Result
if (answer_key == pub_key):
    print(priv_key.decrypt(answer))
def generate_shared_paillier_key(
        keyLength=DEFAULT_KEYSIZE,
        n=NUMBER_PLAYERS,
        t=CORRUPTION_THRESHOLD,
        threshold=PRIME_THRESHOLD,
        it=MAX_ITERATIONS,
        correctParamPrime=CORRECTNESS_PARAMETER_BIPRIMALITY,
        statSecShamir=STATISTICAL_SECURITY_SECRET_SHARING):
    """
    Main code to obtain a Paillier public key N
    and shares of the private key.
    """
    primeLength = keyLength // 2
    length = 2 * (primeLength + math.ceil((math.log2(n))))
    shamirP = sympy.nextprime(2**length)

    smallPrimeTest = True

    if primeLength < math.log(threshold, 2):
        threshold = 1

    print('Bit-length of primes: ', primeLength)

    Key = PaillierSharedKey(primeLength, n, t, threshold, it)

    print('Starting generation of p, q and N...')
    success = 0
    counter_smallPrime = 0
    counter_biprime = 0
    startTime = time.time()

    # Here we define the small primes considered in small prime test.
    # The generated p and q are both 3 mod 4, hence we do not have to check for divisibility by 2.
    primeList = [p for p in sympy.primerange(3, threshold + 1)]

    while success == 0:
        # Generate the factors p and q
        pShares = Key.generate_prime_vector(n, primeLength)
        qShares = Key.generate_prime_vector(n, primeLength)

        # Then obtain N
        N = compute_product(pShares, qShares, n, t, shamirP)

        # Test bi-primality of N
        [success, smallPrimeTestFail] = is_biprime(n, N, pShares, qShares,
                                                   correctParamPrime,
                                                   smallPrimeTest, primeList)

        if smallPrimeTestFail:
            counter_smallPrime += 1
        elif not (success):
            counter_biprime += 1

    print('Generation successful.')
    print('Number of insuccesfull trials small prime test: ',
          counter_smallPrime)
    print('Number of insuccesfull trials biprime test: ', counter_biprime)
    print('Elapsed time: ', math.floor(time.time() - startTime), 'seconds.')

    PublicKey = phe.PaillierPublicKey(N)

    # So long for the public key. Let's look at the secret key(s):

    # Instatiate secret-sharing scheme for lambda and beta.
    Int_SS_Scheme = IntegerShamir(statSecShamir, N, n, t)

    LambdaShares = obtain_lambda_shares(Int_SS_Scheme, pShares, qShares, N)

    success = 0
    while success == 0:
        # Generate shares of random mask
        BetaShares = share_random_element(N, Int_SS_Scheme)

        # Obtain shares of secret key.
        # Notice that here we mask lambda over the integers:
        # since we will only reveal this product modulo N, this product perfectly masks lambda mod N.
        SecretKeyShares = LambdaShares * BetaShares

        success, theta = compute_theta(SecretKeyShares, N)

    # Hack
    Key.public_key = PublicKey
    Key.SecretKeyShares = SecretKeyShares
    Key.theta = theta

    return Key, pShares, qShares, N, PublicKey, LambdaShares, BetaShares, SecretKeyShares, theta