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)
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% ")
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% ")
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))
def __init__(self, p): self.zp = Zp(p)
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)
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()
def __init__(self): self.p = 208351617316091241234326746312124448251235562226470491514186331217050270460481 self.zp = Zp(self.p)