def verify(self, fname):

        ciphertext = fileOp.read_list("Fciphertext")[0]

        n = fileOp.read_list("FpublicKey")[0]

        public_key = fileOp.read_list("FpublicKey")[1]

        inp = fname

        inp = fileOp.read_binary_file(inp)

        inp = fdh.fdh(inp, (len(bin(n)) - 2))

        signaturec = pow(ciphertext, public_key, n)

        if signaturec - int(inp, 16) == 0:

            print("VERIFIED!")

            return True

        else:

            print("FAILED!")

            return False
示例#2
0
    def verify(self):

        ciphertext = fileOp.read_list("Fciphertext")[0]

        n = fileOp.read_list("FpublicKey")[0]

        public_key = fileOp.read_list("FpublicKey")[1]

        print("File to be checked:", end=" ")

        inp = input()

        inp = fileOp.read_large_data(inp)

        inp = fdh.fdh(inp, (len(bin(n)) - 2))

        signaturec = pow(ciphertext, public_key, n)

        if signaturec - int(inp, 16) == 0:

            print("VERIFIED!")

        else:

            print("FAILED!")
示例#3
0
def reconstruct_shamir(
    shares,
    i,
    t=0
):  #Do we have to mention which additive share these backups belong to? i.e. need for 'i'?
    '''Verify first using VSS and then reconstruct, i is index of the additive share for vss_p, etc'''

    vss_q = fileOp.read_list("FvssQ")[0]
    vss_p = fileOp.read_list("FvssP")[0]
    gen = fileOp.read_list("FvssGen")[0]
    commitment_list = fileOp.read_list("FvssCommitmentList")[0]

    res = True
    for si in shares:
        if RSAFeldmanVSS.verify_share(si, gen[i], vss_p[i],
                                      commitment_list[i]) == False:
            res = False
            break

    if res == False:
        print("Share:", si, "invalid")
        raise Exception("Backup Reconstruction Failed")
        return
    else:
        return (ShamirSS.tncombine(shares, vss_q[i], t))
示例#4
0
    def __init__(self):

        global public_key, private_key, n

        public_key = fileOp.read_list("FpublicKey")[1]

        n, private_key = fileOp.read_list("FprivateKey")

        self.set_message()

        self.sign()
    def __init__(self, fname):

        global public_key, private_key, n

        public_key = fileOp.read_list("FpublicKey")[1]

        n, private_key = fileOp.read_list(
            "FprivateKey")  #FIX: Reconstruct using Shamir and rest

        self.set_message(fname)

        self.sign()
def threshold_additive_shares():
    '''Divides all elements in the shares list into t-n threshold shares using Feldman VSS into n sub-shares with threshold t'''

    shares = fileOp.read_list("FadditiveShares")
    t, n = 3, 5  #Generates a (3,5) threshold scheme FIX: Read from file

    sub_shares, commitment_list = [], []
    vss_p, vss_q, gen = [], [], []

    for i in shares:

        feld = RSAFeldmanVSS.feldmanvss(t, n, i)

        sub_shares.append(feld[0])  #Generate using VSS
        commitment_list.append(feld[1])
        vss_p.append(feld[2])
        vss_q.append(feld[3])
        gen.append(feld[4])

    fileOp.write_list("FvssP", vss_p)
    fileOp.write_list("FvssQ", vss_q)
    fileOp.write_list("FvssGen", gen)
    fileOp.write_list("FvssSubShares", sub_shares)
    fileOp.write_list("FvssCommitmentList", commitment_list)

    return
def refresh_shares():
    '''Refreshes all shares in list old_shares,share field size is f'''

    additive_shares = fileOp.read_list("FadditiveShares")[0]
    n = fileOp.read_list("FpublicKey")[0]


    old_shares = additive_shares
    l = len(old_shares)
    new_shares = [0 for _ in range(l)]
    for i in old_shares:
        share_div = additive_sharing(l,i,0)
        new_shares = [(a+b) for a,b in zip(new_shares,share_div)]
    additive_shares = new_shares

    fileOp.write_list("FadditiveShares",additive_shares)

    thresholdShares.threshold_additive_shares()
示例#8
0
def gen_keys():

    p,q = fileOp.read_list("FprimesPQ")
    n = fileOp.read_list("FmodulusRSA")[0]
    toit_n = (p-1)*(q-1)    #Euler Toitent Function on RSA Modulus

    #Public Key Generation
    public_key = coprime.find_coprime(toit_n)   #Find public key which is coprime to Toitent Value
    fileOp.write_list("FpublicKey",[n,public_key])

    #Private key Generation
    private_key = modInverse.modular_inverse(public_key,toit_n) % toit_n
    fileOp.write_list("FprivateKey",[n,private_key])

    #Generate additive shares for private keys
    additiveShares.generate(private_key)

    #Make additive share's backup threshold shares using Feldman VSS
    thresholdShares.threshold_additive_shares()
示例#9
0
def refresh_shares():
    '''Refreshes all shares in list old_shares,share field size is f'''

    additive_shares = fileOp.read_list("FadditiveShares")
    n = fileOp.read_list("FmodulusRSA")[0]

    old_shares = additive_shares
    l = len(old_shares)
    new_shares = [0 for _ in range(l)]

    #Refresh previous additive shares
    for i in old_shares:
        share_div = additiveShares.additive_sharing(i, l)
        new_shares = [(a + b) for a, b in zip(new_shares, share_div)]

    #Update new refreshed shares
    fileOp.write_list("FadditiveShares", new_shares)

    #Threshold on new shares
    print("Running")
    thresholdShares.threshold_additive_shares()
    print("Done")
示例#10
0
def gen_prime_1(n):

    first_primes_list = fileOp.read_list("FfirstPrimes")

    while True:
        sample = random_n(n)  #Randomly choose n bit number

        for i in first_primes_list:
            if sample % i == 0:
                break
            if sample < 4000000:
                if i > sample**(1 / 2):
                    return sample
        else:
            return sample
def additive_sharing(m, p):
    '''Employs additive sharing to divide a secret 'm' into 'p' shares '''

    n = fileOp.read_list("FpublicKey")[0]  #Fetch RSA Modulus from file

    additive_shares_new = []

    for i in range(p - 1):  #FIX: If m < p: cannot pick values

        additive_shares_new.append(
            random.randrange(0, m // p)
        )  #Picks additive shares randomly between 0 to (total_value)/(no_of_shares) - FIX THIS: Increase field size to allow shares between 0 to m

    s = m - sum(additive_shares_new)

    while s < 0:
        s += n

    additive_shares_new.append(s)

    return additive_shares_new
def gen_prime_1(n):

    try:
        first_primes_list = fileOp.read_list("FfirstPrimes")
    except Exception as e:
        raise Exception("Couldn't read FfirstPrimes from File")

    while True:
        sample = random_n(n)  #Randomly choose n bit number

        for i in first_primes_list:
            if sample % i == 0:  #Divisibility test with pre-generated primes
                break

            if sample < (first_primes_list[-1])**2:
                if i > sample**(
                        1 / 2
                ):  #If all primes less than sqrt(sample) can't divide then sample is prime

                    return sample
        else:
            return sample