
Programación y programas, programas, programas y más En criptografía, el cifrado César, también conocido como cifrado por desplazamiento, código de César o desplazamiento de César, es una de las técnicas de cifrado más simples y más usadas
Descripción
Una forma sencilla de cifrar una cadena es «rotar» cada carácter de un alfabeto en una cierta cantidad de posiciones. Rotar un carácter significa reemplazarlo con otro carácter que está a una cierta cantidad de posiciones en el orden de sucesión aceptado de dicho alfabeto. Por ejemplo, si la cadena «Zebra-493?» se gira 3 lugares, la cadena resultante es «Cheud-726?». Cada carácter alfabético se reemplaza con el carácter tres letras más alto (pasando de la Z a la A), y cada carácter numérico se reemplaza con el carácter 3 dígitos más alto (pasando del 9 al 0). Para este ejemplo los caracteres no alfanuméricos (signos ortográficos) permanecen sin cambios.
Código
# Python 3
import math
import string
def rotationalCipher(input, rotation_factor):
ciphered=""
for c in input:
rf = rotation_factor
if c.isupper():
alphabet = string.ascii_uppercase
elif c.islower():
alphabet = string.ascii_lowercase
elif c.isdigit():
alphabet = string.digits
else:
alphabet = string.printable
rf = 0
ciphered+=alphabet[(alphabet.find(c)+rf)%len(alphabet)]
return ciphered
# These are the tests we use to determine if the solution is correct.
def printString(string):
print('[\"', string, '\"]', sep='', end='')
test_case_number = 1
def check(expected, output):
global test_case_number
result = False
if expected == output:
result = True
rightTick = '\u2713'
wrongTick = '\u2717'
if result:
print(rightTick, 'Test #', test_case_number, sep='')
else:
print(wrongTick, 'Test #', test_case_number, ': Expected ', sep='', end='')
printString(expected)
print(' Your output: ', end='')
printString(output)
print()
test_case_number += 1
if __name__ == "__main__":
input_1 = "All-convoYs-9-be:Alert1."
rotation_factor_1 = 4
expected_1 = "Epp-gsrzsCw-3-fi:Epivx5."
output_1 = rotationalCipher(input_1, rotation_factor_1)
check(expected_1, output_1)
input_2 = "abcdZXYzxy-999.@"
rotation_factor_2 = 200
expected_2 = "stuvRPQrpq-999.@"
output_2 = rotationalCipher(input_2, rotation_factor_2)
check(expected_2, output_2)
input_3 = "Zebra-493?"
rotation_factor_3 = 3
expected_3 = "Cheud-726?"
output_3 = rotationalCipher(input_3, rotation_factor_3)
check(expected_3, output_3)
input_4 = "abcdefghijklmNOPQRSTUVWXYZ0123456789"
rotation_factor_4 = 39
expected_4 = "nopqrstuvwxyzABCDEFGHIJKLM9012345678"
output_4 = rotationalCipher(input_4, rotation_factor_4)
check(expected_4, output_4)
# And a negative test
print("\n... and, a negative test\n")
input_5 = "abcdefghijklmNOPQRSTUVWXYZ0123456789"
rotation_factor_5 = 9
expected_5 = "nopqrstuvwxyzABCDEFGHIJKLM9012345678"
output_5 = rotationalCipher(input_5, rotation_factor_5)
check(expected_5, output_5)
|
© Todos los derechos reservados. Dr. Eduardo René Rodríguez Avila |
Creación: 2021.11.16 Última actualización: 2021.11.16 |
|||
El contenido de este sitio puede ser copiado y reproducido libremente mientras no sea alterado y se cite su origen. Marcas y productos registrados son citados por referencia y sin fines de lucro o dolo. Todas las opiniones son a título personal del o los autores de éstas y, salvo sea expresado de otro modo, deben considerarse como registro y expresión de la experiencia de uso de aquello que es tratado. Para conocer más sobre la posición de privacidad y responsabilidad de lo que se presenta en este sitio web y como ha sido obtenido, consulte la declaración al respecto. |