コード例 #1
0
ファイル: hill.py プロジェクト: AngelaJanin/Criptografia
 def __init__(self, alphabet, n, key=None):
     """
     Constructor de clase, recibiendo un alfabeto completamente necesario pero
     podría no recibir una llave de cifrado, en cuyo caso, hay que generar una,
     para el caso del tamañHo de la llave, hay que asegurarse que tiene raíz entera.
     :param alphabet: una cadena con todos los elementos del alfabeto.
     :param n: el tamaño de la llave, obligatorio siempre.
     :param key: una cadena que corresponde a la llave, en caso de ser una llave inválida
     arrojar una CryptographyException.
     """
     self.alphabet = alphabet
     self.n = n
     # Checamos si la raíz de la longitud de la llave es entera
     raiz = self.encuentraRaiz(self.n)
     if not (isinstance(raiz, int)):
         raise CryptographyException()
     # Checamos si se nos pasa una llave y sino, la generamos
     self.key = key if key else self.construyeLllave(raiz)
     self.key = self.llenaMatriz(self.key, raiz, True)
     #self.key = self.key % len(self.alphabet)
     # Si el determinante es 0, entonces no tiene matriz inversa y se levanta excepción
     if self.key.det() == 0:
         raise CryptographyException()
     # Si la longitud del alfabeto % determinante de la llave es 0 se levanta la excepción
     elif len(self.alphabet) % self.key.det() == 0:
         raise CryptographyException()
コード例 #2
0
 def cipher(self, message):
     new_cipher_msg = ""
     ce = CryptographyException()
     for cha in message:
         i = ce.get_index(cha, self.alphabet)
         c = (self.A * i + self.B) % len(self.alphabet)
         new_cipher_msg += self.alphabet[c]
     print("Mensaje Cifrado: %s" % (new_cipher_msg))
     return (new_cipher_msg)
コード例 #3
0
 def decipher(self, criptotext):
     new_decipher_msg = ""
     ce = CryptographyException()
     for cha in criptotext:
         i = ce.get_index(cha, self.alphabet)
         dec = (ce.modInverso(self.A, len(self.alphabet)) *
                (i - self.B)) % len(self.alphabet)
         new_decipher_msg += self.alphabet[dec]
     print("Mensaje Decifrado: %s" % (new_decipher_msg))
     return (new_decipher_msg)
コード例 #4
0
 def decipher(self, ciphered):
     """
     Implementación del algoritmo de decifrado, según el criptosistema de vigenere.
     :param ciphered: El criptotexto a decifrar.
     :return: El texto plano correspondiente del parámetro recibido.
     """
     new_decipher_msg = ""
     ce = CryptographyException()
     for index, cha in enumerate(ciphered):
         i = ce.get_index(
             cha, self.alphabet
         )  #	Se obtiene el indice de cada caracter de la clave
         cha_clave = self.password[index % len(self.password)]
         j = ce.get_index(
             cha_clave, self.alphabet
         )  #	Se obtiene el indice de cada caracter del mensaje
         dec = (i - j) % len(self.alphabet)
         new_decipher_msg += self.alphabet[dec]
     print("Mensaje Decifrado: %s" % (new_decipher_msg))
     return (new_decipher_msg)
コード例 #5
0
 def cipher(self, message):
     """
     Usando el algoritmo de cifrado de vigenere, cifrar el mensaje recibido como parámetro,
     usando la tabla descrita en el PDF.
     :param message: El mensaje a cifrar.
     :return: Una cadena de texto con el mensaje cifrado.
     """
     new_cipher_msg = ""
     ce = CryptographyException()
     for index, cha in enumerate(message):
         i = ce.get_index(
             cha, self.alphabet
         )  #	Se obtiene el indice de cada caracter de la clave
         cha_clave = self.password[index % len(self.password)]
         j = ce.get_index(
             cha_clave, self.alphabet
         )  #	Se obtiene el indice de cada caracter del mensaje
         c = (i + j) % len(self.alphabet)
         new_cipher_msg += self.alphabet[c]
     print("Mensaje Cifrado: %s" % (new_cipher_msg))
     return (new_cipher_msg)
コード例 #6
0
 def __init__(self, alphabet, password=None):
     #Recomendación, ingeniárselas para no cargar siempre O(n^2) en memoria aunque esto no
     #será evaluado, con n el tamaño del alfabeto.
     """
     Constructor de clase, recibe un parámetro obligatorio correspondiente al alfabeto
     y un parámetro opcional que es la palabra clave, en caso de ser None, entonces
     generar una palabra pseudoaleatoria de al menos tamaño 4.
     :param alphabet: Alfabeto a trabajar con el cifrado.
     :param password: El password que puede ser o no dada por el usuario.
     """
     self.alphabet = alphabet
     self.password = password
     ce = CryptographyException()
コード例 #7
0
 def __init__(self, alphabet, A=None, B=None):
     """
     Constructor de clase que tiene como parámetro todos los atributos
     que necesita el algoritmo de cifrado afín.
     Parámetro:
         alphabet -- el alfabeto sobre quien se cifra el mensaje.
         A -- El coeficiente A que necesita el cifrado.
         B -- El coeficiente B de desplazamiento.
     """
     self.alphabet = alphabet
     A = A if A else 1
     if prime_relative(A, len(self.alphabet)):
         self.A = A
     else:
         raise (CryptographyException())
     self.B = B
コード例 #8
0
 def __init__(self, alphabet, A=None, B=None):
     """
     Constructor de clase que tiene como parámetro todos los atributos
     que necesita el algoritmo de cifrado afín.
     Parámetro:
         alphabet -- el alfabeto sobre quien se cifra el mensaje.
         A -- El coeficiente A que necesita el cifrado.
         B -- El coeficiente B de desplazamiento.
     """
     self.alphabet = alphabet
     # Checamos que se haya pasado un parámetro A
     A = A if A else self.encuentraPrimoRelativo(len(self.alphabet))
     # Checamos si A y la longitud del alfabeto son primos relativos.
     if prime_relative(A, len(self.alphabet)):
         self.A = A
     else:
         raise CryptographyException()
     self.B = B
コード例 #9
0
 def __init__(self, alphabet, n, key=None):
     """
     Constructor de clase, recibiendo un alfabeto completamente necesario pero
     podría no recibir una llave de cifrado, en cuyo caso, hay que generar una,
     para el caso del tamaÑHo de la llave, hay que asegurarse que tiene raíz entera.
     :param alphabet: una cadena con todos los elementos del alfabeto.
     :param n: el tamaÑo de la llave, obligatorio siempre.
     :param key: una cadena que corresponde a la llave, en caso de ser una llave inválida
     arrojar una CryptographyException.
     """
     self.alphabet = alphabet
     self.n = n
     decimal, entera = math.modf(math.sqrt(self.n))
     if key and decimal == 0:
         self.key = self.generate_key(key)
         if (len(self.alphabet) % int(np.linalg.det(self.key)) == 0):
             raise CryptographyException()
     else:
         self.key = self.generate_key()