En este post incluyo y comento un script en python para el cálculo del Índice de Coincidencia (IC).
Antes de poner el script, recordar que en este post expliqué qué es y cómo se utiliza el IC para atacar cifrados de sustitución polialfabética con claves periódicas.
El IC es la probabilidad de que dos letras tomadas al azar de un texto sean iguales y, por tanto, para su cálculo utilizaremos la siguiente fórmula (número de casos favorables / número de casos posibles):
Donde:fi: frecuencia o número de ocurrencias del carácter i-ésimo del alfabeto (de la "A" a la "Z") en el texto.
N: número de caracteres o tamaño del texto.
En el script este cálculo se implementa de la siguiente manera:
- alfabeto.index(caracter): el método index() devuelve la posición de la primera ocurrencia del valor especificado.
En el script, devuelve la posición de cada carácter del alfabeto.
- texto.count(caracter): el método count() devuelve el número de veces que aparece el valor especificado.
En el script, devuelve el número de veces que aparece cada carácter del alfabeto en el texto.
- frecuencia_relativa[alfabeto.index(caracter)]=texto.count(caracter): en el script, calcula la frecuencia relativa de cada carácter del alfabeto en el texto y deja el resultado en la posición que corresponde a cada uno de ellos en la lista frecuencia_relativa.
- append(): este método añade un elemento al final de una lista.
- pares_caracteres_iguales.append(frecuencia_relativa[alfabeto.index(caracter)]*(frecuencia_relativa[alfabeto.index(caracter)]-1)/2): mediante el método append() se van añadiendo a la lista 'pares_caracteres_iguales', para cada letra del alfabeto, el número de pares de caracteres iguales de cada una de ellas que es posible obtener del texto tomando dos de ellos al azar.
- Y finalmente, el sumatorio de los elementos de la lista 'pares_caracteres_iguales', uno por cada letra del alfabeto, dividido entre el número de pares de caracteres que es posible obtener del texto da como resultado el IC.
- Script python para el cálculo del IC:
El script es el siguiente:
#!/usr/bin/env python # -*- coding: utf-8 -*- # ÍNDICE DE COINCIDENCIA (IC): # # Cálculo del IC de un texto. # # http://mikelgarcialarragan.blogspot.com/ import re from unicodedata import normalize def main(): # ALFABETO: alfabeto = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ" print ("") print ("[+] Alfabeto:", alfabeto) # Se introduce el texto del que se desea calcular el Índice de Coincidencia (IC). # Se convierten los caracteres a mayúsculas y se eliminan los espacios, # las tildes, diéresis, etc. texto = "*" while not texto.isalpha(): print ("") texto = input('Texto del que se desea hallar el IC: ').upper() texto = texto.replace(' ','') texto = re.sub(r"([^n\u0300-\u036f]|n(?!\u0303(?![\u0300-\u036f])))[\u0300-\u036f]+", r"\1", normalize("NFD", texto), 0, re.I) texto = normalize("NFC", texto) if not texto.isalpha(): print ("*** ERROR: El texto sólo debe contener caracteres alfabéticos.") # CÁLCULO DEL IC: # Cálculo de la frecuencia relativa de cada uno de los caracteres del alfabeto en el texto. frecuencia_relativa=[0 for caracter in alfabeto] for caracter in alfabeto: frecuencia_relativa[alfabeto.index(caracter)]=texto.count(caracter) # Cálculo del número de pares de caracteres iguales que es posible obtener del texto tomando dos de ellos al azar. pares_caracteres_iguales=[] for caracter in alfabeto: pares_caracteres_iguales.append(frecuencia_relativa[alfabeto.index(caracter)]*(frecuencia_relativa[alfabeto.index(caracter)]-1)/2) # Cálculo del número de pares de caracteres que es posible obtener del texto. pares_caracteres_posibles = len(texto) *(len(texto)-1)/2 # Cálculo del IC. ic = 0 for caracter in alfabeto: ic = ic + (pares_caracteres_iguales[alfabeto.index(caracter)]/pares_caracteres_posibles) print ("") print("[+] El Índice de Coincidencia es:", ic) if __name__ == '__main__': main()
Lo ejecuto:
Comentarios
Publicar un comentario