Cifrado por desplazamiento


Programación y programas, programas, programas y más En criptografía, el cifrado César, también conocido como cifrado por desplazamientocó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)

Twitter Wordpress eMail
© 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.

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.