El método Bífido es un cifrado fraccionario. Es decir que cada letra viene representada por una o más letras o símbolos, y donde se trabaja con estos símbolos más que con las letras mismas.
El método comienza con la utilización de un alfabeto ordenado o desordenado (depende del grado de dificulad que se le pretenda dar en su descifrado) en una matriz 5x5.
En este ejemplo utilizaremos la siguiente matriz:
Al ser una matriz de 5x5 nos vemos obligados a cifrar de la misma forma la I y la J. El contexto nos permitirá distinguir cual de las dos letras se pretendía cifrar.
Para cifrar el texto en claro se escriben los equivalentes numéricos de cada letra, utilizando sus "coordenadas".
Por ejemplo: HOLA MUNDO, genera las siguientes coordenadas (f,c) 233431113245331434, y para proceder con la encriptacion la cadena de coordenadas resultantes es dividida en dos:
233431113
245331434
245331434
y se forma una nueva cadena de coordenadas 22 34 35 43 33 11 14 13 34 las cuales formaran el nuevo mensaje encriptado GOPS NADCO.
Este método altera la frecuencia de los caracteres a diferencia de lo que ocurre por ejemplo con los cifrados monoalfabéticos.
La siguiente clase, hecha en vb.net realiza los pasos anteriormente descritos, esta comentada y creo que facilmente entendible
Public Class Bifido ' @web http://www.jc-mouse.net ' @author Mouse Dim matriz(5, 5) As Char Dim mensaje() As Char ' se guarda todo el mensaje Dim abc As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" Public Sub New() 'la matriz esta formada por 25 letras, donde el caracter I=J matriz(1, 1) = "A" : matriz(1, 2) = "B" : matriz(1, 3) = "C" : matriz(1, 4) = "D" : matriz(1, 5) = "E" matriz(2, 1) = "F" : matriz(2, 2) = "G" : matriz(2, 3) = "H" : matriz(2, 4) = "I" : matriz(2, 5) = "K" matriz(3, 1) = "L" : matriz(3, 2) = "M" : matriz(3, 3) = "N" : matriz(3, 4) = "O" : matriz(3, 5) = "P" matriz(4, 1) = "Q" : matriz(4, 2) = "R" : matriz(4, 3) = "S" : matriz(4, 4) = "T" : matriz(4, 5) = "U" matriz(5, 1) = "V" : matriz(5, 2) = "W" : matriz(5, 3) = "X" : matriz(5, 4) = "Y" : matriz(5, 5) = "Z" End Sub Public Function Encriptar(ByVal texto As String) As String texto = Limpiar_Texto(texto) Dim pos_matriz As String = "" Dim encriptado As String = "" Dim fila As Integer Dim col As Integer 'para cada caracter se extrae el par de numeros correspondientes de la matriz Dim c() As Char = texto.ToCharArray() For i = 0 To c.Length - 1 pos_matriz = pos_matriz + getposicion(c(i)) Next 'Ahora se realiza el proceso de encriptacion Dim x() As Char = pos_matriz.ToCharArray For i = 0 To x.Length / 2 - 1 fila = Integer.Parse(x(i)) col = Integer.Parse(x(i + x.Length / 2)) encriptado = encriptado & matriz(fila, col) Next encriptado = Reconstruir_Mensaje(encriptado) Return encriptado End Function Public Function Desencriptar(ByVal t As String) As String t = Limpiar_Texto(t) Dim pos_matriz As String = "" Dim tmp1 As String = "" Dim tmp2 As String = "" Dim band As Boolean = True 'para cada caracter se extrae el par de numeros correspondientes en la matriz For i = 0 To t.Length - 1 pos_matriz = pos_matriz + getposicion(t.Substring(i, 1)) Next 'como la cadena de numeros se encuentra encriptada, se procede 'a su nuevo ordenamiento For i = 0 To pos_matriz.Length - 1 If band Then tmp1 = tmp1 & pos_matriz.Substring(i, 1) band = False Else tmp2 = tmp2 & pos_matriz.Substring(i, 1) band = True End If Next pos_matriz = tmp1 + tmp2 tmp1 = "" Dim fila As Integer Dim col As Integer 'ahora que ya se tiene a la cadena de numeros con el orden original 'se procede a reconstruir el mensaje Dim x() As Char = pos_matriz.ToCharArray For i = 0 To x.Length - 1 Step 2 fila = Integer.Parse(x(i)) col = Integer.Parse(x(i + 1)) tmp1 = tmp1 + matriz(fila, col).ToString Next tmp1 = Reconstruir_Mensaje(tmp1) Return tmp1 End Function 'obtiene la posicion de filas y columnas correspondientes al caracter 'pasado como parametro en la matriz Private Function getposicion(ByVal c As Char) As String Dim posicion As String = "" Dim band As Boolean = False If c = "J" Then ' Caso especial 'se añade automaticamente con la posicion del caracter I posicion = "24" Else For i = 1 To 5 For j = 1 To 5 If (c = matriz(i, j)) Then posicion = i & j band = True If band Then Exit For End If Next If band Then Exit For Next End If Return posicion End Function 'encargado de limpiar el mensaje extrayendo solo las letras y 'guardando los caracteres especiales para rearmar el mensaje despues Private Function Limpiar_Texto(ByVal t As String) As String t = t.ToUpper 'descompone el mensaje en un array de caracteres mensaje = t.ToCharArray Dim tmp1 As String = "" 'extrae solo las letras validas For i = 0 To mensaje.Length - 1 Dim x As Integer = abc.IndexOf(mensaje(i)) If x <> -1 Then 'es una letra valida tmp1 = tmp1 + mensaje(i) End If Next Return tmp1 End Function 'reconstruye el mensaje con las palabras encriptadas/desencriptadas 'añadiendo los caracteres especiales que no son alterados Private Function Reconstruir_Mensaje(ByVal texto As String) As String Dim r_mensaje As String = "" Dim count As Integer = 0 Dim k As Integer = mensaje.Length - 1 Dim t() As Char = texto.ToCharArray For i = 0 To k Dim x As Integer = abc.IndexOf(mensaje(i)) If x <> -1 Then r_mensaje = r_mensaje & t(count) count = count + 1 Else r_mensaje = r_mensaje & mensaje(i) End If Next Return r_mensaje End Function End Class
Su implementacion desde consola para la encriptacion tenemos:
Sub Main() Dim bifido As Bifido = New Bifido Dim s As String = bifido.Encriptar("Copyright 2011 - jc Mouse Bolivia " & vbCrLf & _ "Algoritmo de Encriptación Método Bífido" & vbCrLf & "All rights reserved") Console.WriteLine(s) Console.ReadKey() End Sub
y la salida en pantalla
Para desencriptar, solo utilizar el metodo apropiado ( desencriptar() ) y listo