Esempio n. 1
0
    def __init__(self):

        # Número primo que definirá nuestro campo Zp

        self.campo_zp_primo = 208351617316091241234326746312124448251235562226470491514186331217050270460481

        # Creamos una instancia de un campo Zp para operar el polinomio

        self.zp = Zp(self.campo_zp_primo)
Esempio n. 2
0
    def testRandomNumbers(self):

        zp1 = Zp(17)

        for i in range(0, 100):

            a = zp1.random_zp(100)

            if (a >= 17):

                print("Error en test de números aleatorios en Zp  ... ")

        print("Test de números aleatorios bajo Zp .... 100% ")
Esempio n. 3
0
    def testEquivalencia(self):

        zp1 = Zp(13)

        for i in range(0, 100):

            a = random.randint(0, 100)

            equiv = zp1.equivalencia(a)

            residuo = a % 13

            if (residuo != equiv):

                print("Error en test equivalencia ... ")

        print("Test suma en equivalencia  .... 100% ")
Esempio n. 4
0
class LagrangeCero:
    # Constructor de la clase polonomio cero lagrange en Zp
    # @param: p entero del campo Zp donde se trabajará el polonomio
    def __init__(self, p):

        self.zp = Zp(p)

    '''
    Método para obtener los Li de la ecuación del método de interpolación de Lagrange
    @param: x_i
    @param: array coeficientes en X
    @return: Polinomio Li(x)
    '''
    def li(self, i_i, coeficientes_x):

        denominador = 1

        numerador = 1

        for j in range(0, len(coeficientes_x)):

            if(int(coeficientes_x[j]) != int(i_i)):

                numerador *= int(-coeficientes_x[j])

                denominador *= int(i_i-coeficientes_x[j])

        numerador = self.zp.equivalencia(numerador)

        denominador = self.zp.equivalencia(denominador)

        denominador = self.zp.inverso(denominador)

        return self.zp.producto(numerador, denominador)
    '''
    Método principal para el polinomio de Lagrange
    @param: vector con las x_i
    @param: vector con las y_i
    @return: Polinomio de lagrange generado por la intepolación
    '''
    def lagrangeCero(self, x_i, y_i): # vectores = [(0, 1), (1, 3), (2, 0)]
        suma = 0

        for i in range(0, len(x_i)):

            pol = self.li(x_i[i], x_i)

            producto = self.zp.producto(pol, self.zp.equivalencia(y_i[i])) # f(xi) * Li(x = 0)

            suma += producto

        return int(self.zp.equivalencia(suma))
Esempio n. 5
0
    def __init__(self, p):

        self.zp = Zp(p)
Esempio n. 6
0
class Encriptar_Shamir:

    # Constructor de la clase
    def __init__(self):

        # Número primo que definirá nuestro campo Zp

        self.campo_zp_primo = 208351617316091241234326746312124448251235562226470491514186331217050270460481

        # Creamos una instancia de un campo Zp para operar el polinomio

        self.zp = Zp(self.campo_zp_primo)

    '''
    Método para generar un polonomio aleatoriamente en un campo Zp
    @param: Término independiente del polinomio
    @param: Grado del polinomio
    @return: Polinomio generado
    '''

    def generar_polinomio_zp(self, termino_indep, grado):

        coeficientes = []

        # Agregamos una clave de sha256 como simulacro

        coeficientes.append(termino_indep)

        for i in range(0, grado):

            coeficientes.append(self.zp.random_zp(self.campo_zp_primo))

        # Definimos el polinomio

        pol = Polinomio(grado, True, coeficientes)

        #print(pol.toString())

        # Regresamos el polinomio

        return pol

    '''
    Método para encriptar basado en el esquema Shamir Secret Sharing
    @param: Mensaje a encriptar
    @param: Número de personas en total
    @param: Número mínimo de personas para desencriptar
    @param: Llave del usuario
    @return: El criptograma y las respectivas shares
    '''

    def encriptar(self, mensaje, N, K, llave):

        # Creamos un objeto de tipo AESCipher para poder utilizar los algoritmos de cifrado

        aes = AESCipher()
        # Generamos la contraseña clave_segura

        clave_segura = aes.sha256_numerico(llave)

        # Generamos el polinomio

        polinomio = self.generar_polinomio_zp(clave_segura, K - 1)

        # Evaluamos en los N puntos

        diccionario_evaluaciones = {}

        xs = []

        ys = []

        for i in range(0, N):

            x = self.zp.random_zp(self.campo_zp_primo)

            while (x in diccionario_evaluaciones):

                x = self.zp.random_zp(self.campo_zp_primo)

            y = polinomio.eval(x)

            diccionario_evaluaciones[x] = y

            ys.append(y)

            xs.append(x)

        # Encriptamos el menaje

        criptograma = aes.encriptar(mensaje, str(clave_segura))

        # Regresamos el criptograma y los puntos (evaluacioness)

        return (criptograma, diccionario_evaluaciones)
Esempio n. 7
0
class TestCampoZp:
    # Constructor de la clase
    def __init__(self):
        self.p = 208351617316091241234326746312124448251235562226470491514186331217050270460481

        self.zp = Zp(self.p)

    # Método para testear la suma cerrada bajo el campo
    def testSuma(self):
        for i in range(0, 100):

            a = self.zp.random_zp(self.p)

            b = self.zp.random_zp(self.p)

            suma = a + b

            suma = self.zp.suma(a, b)

            if (suma != (suma % self.p)):

                print("Error en test suma ... ")

        print("Test suma en campoZp  .... 100% ")

    # Método para probar el producto cerrado bajo el campo
    def testProducto(self):
        for i in range(0, 100):

            a = self.zp.random_zp(self.p)

            b = self.zp.random_zp(self.p)

            prodN = a * b

            prod = self.zp.producto(a, b)

            if (prod != (prodN % self.p)):

                print("Error en test producto ... ")

        print("Test producto en campoZp  .... 100% ")

    # Método para probar el inverso bajo el campo
    def testInverso(self):
        for i in range(0, 100):

            a = self.zp.random_zp(self.p)

            b = self.zp.inverso(a)

            if (self.zp.producto(a, b) != 1):

                print("Error en test inverso multiplicativo ... ")

        print("Test inverso multiplicativo en campoZp  .... 100% ")

    # Método para probar la equivalencia (clases de equivalencia)
    def testEquivalencia(self):

        zp1 = Zp(13)

        for i in range(0, 100):

            a = random.randint(0, 100)

            equiv = zp1.equivalencia(a)

            residuo = a % 13

            if (residuo != equiv):

                print("Error en test equivalencia ... ")

        print("Test suma en equivalencia  .... 100% ")

    # Método para probar el generador de números aleatorios
    def testRandomNumbers(self):

        zp1 = Zp(17)

        for i in range(0, 100):

            a = zp1.random_zp(100)

            if (a >= 17):

                print("Error en test de números aleatorios en Zp  ... ")

        print("Test de números aleatorios bajo Zp .... 100% ")

    # Método que agrupa todas las pruebas
    def test(self):

        self.testSuma()

        self.testInverso()

        self.testProducto()

        self.testRandomNumbers()

        self.testEquivalencia()
Esempio n. 8
0
    def __init__(self):
        self.p = 208351617316091241234326746312124448251235562226470491514186331217050270460481

        self.zp = Zp(self.p)