Ya puse una entrada con un script en python para cifrar y descifrar utilizando la escítala espartana.
Y ahora, en este post incluyo el cifrado y descifrado utilizando este mismo criptosistema en Excel.
Antes de poner el correspondiente código Visual Basic para aplicaciones (VBA), recordar que este cifrado se basa en sendas varas de grosor igual o similar que debían estar en posesión del emisor y del receptor del mensaje secreto, que se escribía en una cinta de cuero enrollada en una de las varas, y después se enviaba la cinta al receptor del mensaje.
El código es el siguiente:
' LA ESCÍTALA ESPARTANA:
'
' Cifra y descifra textos en claro y criptogramas, respectivamente,
' utilizando la escítala espartana.
'
' http://mikelgarcialarragan.blogspot.com/
Option Explicit
Public TEXTO_CLARO As Range
Public GROSOR As Range
Public CRIPTOGRAMA As Range
Public Sub Cifrar()
Dim Longitud As Integer
Dim i As Integer
Dim j As Integer
Range("TEXTO_CLARO").Value = A_Z(UCase(Replace(Range("TEXTO_CLARO").Value, " ", "")))
If Len(Range("TEXTO_CLARO").Value) = 0 Then
MsgBox "Introduzca el texto en claro a cifrar. Sólo caracteres alfabéticos [A-Z], 'Ñ' excluida.", vbOKOnly + vbCritical, "¡Error!"
Else
If Range("GROSOR").Value < 1 Or Range("GROSOR").Value > 26 Then
MsgBox "El grosor (número de filas) debe seer un número comprendido entre 1 y 26.", vbOKOnly + vbCritical, "¡Error!"
Range("GROSOR").Value = 3
Else
Range("CRIPTOGRAMA").Value = ""
If Len(Range("TEXTO_CLARO").Value) Mod Range("GROSOR").Value = 0 Then
Longitud = Len(Range("TEXTO_CLARO").Value) \ Range("GROSOR").Value
Else
Longitud = Len(Range("TEXTO_CLARO").Value) \ Range("GROSOR").Value + 1
End If
Range("TEXTO_CLARO").Value = Range("TEXTO_CLARO").Value & Space(Range("GROSOR").Value * Longitud - Len(Range("TEXTO_CLARO").Value))
j = 1
For i = 1 To Longitud
For j = j To Len(Range("TEXTO_CLARO").Value) Step Longitud
Range("CRIPTOGRAMA").Value = Range("CRIPTOGRAMA").Value & Mid(Range("TEXTO_CLARO").Value, j, 1)
Next j
j = i + 1
Next i
End If
End If
End Sub
Public Sub Descifrar()
Dim i As Integer
Dim j As Integer
Range("CRIPTOGRAMA").Value = A_Z(UCase(Range("CRIPTOGRAMA").Value))
If Len(Range("CRIPTOGRAMA").Value) = 0 Then
MsgBox "Introduzca el criptograma a descifrar. Sólo caracteres alfabéticos [A-Z], 'Ñ' excluida.", vbOKOnly + vbCritical, "¡Error!"
Else
If Range("GROSOR").Value < 1 Or Range("GROSOR").Value > 26 Then
MsgBox "El grosor (número de filas) debe seer un número comprendido entre 1 y 26.", vbOKOnly + vbCritical, "¡Error!"
Range("GROSOR").Value = 3
Else
Range("TEXTO_CLARO").Value = ""
j = 1
For i = 1 To Range("GROSOR").Value
For j = j To Len(Range("CRIPTOGRAMA").Value) Step Range("GROSOR").Value
Range("TEXTO_CLARO").Value = Range("TEXTO_CLARO").Value & Mid(Range("CRIPTOGRAMA").Value, j, 1)
Next j
j = i + 1
Next i
End If
End If
End Sub
Function A_Z(Cadena As String) As String
Dim Caracter As Integer
For Caracter = 1 To Len(Cadena)
Select Case Asc(Mid(Cadena, Caracter, 1))
Case 32, 65 To 90:
A_Z = A_Z & Mid(Cadena, Caracter, 1)
End Select
Next
End Function
Ejemplo de funcionamiento:
- Cifrar:
- Descifrar:
Quizás también te interese:
Comentarios
Publicar un comentario