Curso de Programación – CLASE 18

(Creado por el analista de sistemas y docente Leonel Iván Saafigueroa)


GENERADOR DE CONTRASEÑAS

Una contraseña segura es aquella que no puede ser adivinada por otra persona o programas automáticos. Vamos a crear varios programas que ayuden a generarlas automáticamente.


Una contraseña es tan importante como la información que protege. La contraseña es como un candado o como una cerradura, con ellas cuidamos de nuestra información privada, no es que ocultemos cosas prohibidas, todos tenemos información que proteger, pero no siempre sabemos hacerlo bien.
Generar una contraseña segura no es tarea fácil, en esta sección veremos cómo poder crear contraseñas al azar, siendo estas las más difíciles de recordar y adivinar.

Vamos a crear un programa que permita generar una contraseña numérica de 8 dígitos:

Estas contraseñas no son las más seguras, aunque muchas veces son necesarias, crearemos el programa utilizando un arreglo llamado code de 8 dimensiones, en cada una de ellas gracias a una estructura para, asignaremos un número aleatorio del 0 al 9 utilizando la función aleatorio, para luego mostrar en pantalla las 8 dimensiones del arreglo formando así un número con una combinación numérica de 8 dígitos.

Analizamos el código

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Algoritmo generador
Escribir "Generando contraseña numérica..."
// Declaramos un arreglo de 8 dimensiones llamado code.
Dimension code[8]
Para i <- 1 hasta 8 Con Paso 1 Hacer
code[i] <- aleatorio(0,9)
FinPara
// Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos.
Escribir code[1],code[2],code[3],code[4],code[5],code[6],code[7],code[8]
FinAlgoritmo
Algoritmo generador Escribir "Generando contraseña numérica..." // Declaramos un arreglo de 8 dimensiones llamado code. Dimension code[8] Para i <- 1 hasta 8 Con Paso 1 Hacer code[i] <- aleatorio(0,9) FinPara // Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos. Escribir code[1],code[2],code[3],code[4],code[5],code[6],code[7],code[8] FinAlgoritmo
Algoritmo generador
	Escribir "Generando contraseña numérica..."
	// Declaramos un arreglo de 8 dimensiones llamado code.
	Dimension code[8]
	Para i <- 1 hasta 8 Con Paso 1 Hacer
		code[i] <- aleatorio(0,9)
	FinPara
	// Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos.
	Escribir code[1],code[2],code[3],code[4],code[5],code[6],code[7],code[8]
FinAlgoritmo

Ejecutamos el programa


Veamos el código en C++:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// GENERADOR.
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int code[8];
int i;
int main()
{
cout << "Generando contraseña numérica..." << endl;
srand(time(NULL)); // Iniciamos la semilla random con la hora.
for(i=0;i<8;i++)
{
code[i] = rand() % 10; // Genera un valor entre 0 y 9.
}
// Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos.
cout << endl << code[0] << code[1] << code[2] << code[3] << code[4] << code[5] << code[6] << code[7] << endl;
return 0;
}
// GENERADOR. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int code[8]; int i; int main() { cout << "Generando contraseña numérica..." << endl; srand(time(NULL)); // Iniciamos la semilla random con la hora. for(i=0;i<8;i++) { code[i] = rand() % 10; // Genera un valor entre 0 y 9. } // Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos. cout << endl << code[0] << code[1] << code[2] << code[3] << code[4] << code[5] << code[6] << code[7] << endl; return 0; }
// GENERADOR.

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int code[8];
int i;

int main()
{
    cout << "Generando contraseña numérica..." << endl;

    srand(time(NULL)); // Iniciamos la semilla random con la hora.

    for(i=0;i<8;i++)
    {
        code[i] = rand() % 10; // Genera un valor entre 0 y 9.
        }

    // Mostramos las 8 dimensiones del arreglo formando un número de 8 dígitos.
    cout << endl << code[0] << code[1] << code[2] << code[3] << code[4] << code[5] << code[6] << code[7] << endl;
    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // GENERADOR.

  • La comilla de múltiples líneas (//) es utilizada para indicar un comentario en C++, lo que significa que se ignora por la ejecución del programa.
  • El texto “GENERADOR.” es una descripción o título del programa.

Línea 3: #include <iostream>

  • La palabra clave #include es utilizada para incluir cabecera de biblioteca en el programa, y en este caso, estamos incluyendo la biblioteca iostream (entrada/salida estándar).
  • La biblioteca iostream proporciona funciones como cout y cin para leer y escribir datos.

Línea 4: #include <cstdlib>

  • Se está incluyendo la biblioteca cstdlib, que contiene funciones de generación de números aleatorios (como rand()).
  • La biblioteca cstdlib es necesaria para utilizar las funciones de generación de números aleatorios.

Línea 5: #include <ctime>

  • Se está incluyendo la biblioteca time, que proporciona funciones relacionadas con el tiempo y la fecha.
  • En este caso, estamos utilizando la función time() para obtener la hora actual como semilla para la generación de números aleatorios.

Línea 7: using namespace std;

  • Se está indicando que se utilizará el espacio de nombres std (estándar) para acceder a las funciones y variables declaradas en esa biblioteca.
  • Esto permite evitar escribir explícitamente el nombre del espacio de nombres cada vez que se utilice una función o variable.

Línea 9: int code[8];

  • Se está declarando un arreglo de enteros de tamaño 8, llamado “code“.
  • El arreglo será utilizado para almacenar los dígitos de la contraseña numérica generada.

Línea 10: int i;

  • Se está declarando una variable entera, llamada “i“, que se utilizará como índice del arreglo “code“.

Línea 12: int main() { ... }

  • Se está declarando la función principal del programa, llamada “main“.
  • La función main es el punto de entrada del programa y siempre debe ser definida.

Línea 14: cout << "Generando contraseña numérica..." << endl;

  • Se está utilizando la función cout para imprimir un mensaje en la pantalla.
  • El texto entre comillas es el mensaje que se mostrará.
  • El carácter “\n” (new line) es utilizado para saltar a la siguiente línea.

Línea 16: srand(time(NULL));

  • Se está utilizando la función srand() para establecer la semilla para la generación de números aleatorios.
  • La función time() devuelve la hora actual en segundos como valor entero, y se pasa directamente a la función srand().
  • Esto significa que cada vez que el programa se ejecuta, obtendrá una nueva semilla aleatoria.

Línea 18-21: for(i=0;i<8;i++) { ... }

  • Se está utilizando un bucle for para iterar sobre los elementos del arreglo “code“.
  • El bucle iniciará desde el elemento con índice 0 (cero) y terminará en el elemento con índice 7.
  • Dentro del bucle, se generará un valor aleatorio entre 0 y 9 (inclusive) para cada elemento del arreglo.

Línea 16: code[i] = rand() % 10;

  • Se está utilizando la función rand() para generar un número aleatorio entre 0 y RAND_MAX (un valor máximo determinado por la biblioteca).
  • El operador “%” es utilizado para obtener el resto de la división del resultado de rand() por 10.
  • Esto significa que se obtendrá un valor aleatorio entre 0 y 9.

Línea 24: cout << endl << code[0] << code[1] << code[2] << code[3] << code[4] << code[5] << code[6] << code[7] << endl;

  • Se está utilizando la función cout para imprimir los elementos del arreglo “code” en forma de número de 8 dígitos.
  • El carácter “\n” (new line) es utilizado para saltar a la siguiente línea.

Línea 25: return 0;

Se está indicando que el programa ha terminado correctamente y devuelve un valor entero igual a cero.


Ahora el código en PYTHON:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# GENERADOR1.
import random
code = ""
print("Generando contraseña numérica...\n")
for i in range(0, 8):
code += str(random.randint(0, 9))
print(code)
# GENERADOR1. import random code = "" print("Generando contraseña numérica...\n") for i in range(0, 8): code += str(random.randint(0, 9)) print(code)
# GENERADOR1.

import random

code = ""

print("Generando contraseña numérica...\n")

for i in range(0, 8):
    code += str(random.randint(0, 9))

print(code)

Vamos a analizar línea por línea este código en PYTHON:

Línea 1: # GENERADOR1.

  • Esta es una comilla de múltiples líneas (#) seguida del texto “GENERADOR1.“. Es un comentario en Python, lo que significa que se ignora por la ejecución del programa. En este caso, se está utilizando como título o descripción del programa.

Línea 3: import random

  • La palabra clave import es utilizada para traer una biblioteca o módulo de Python dentro del script actual. En este caso, estamos importando la biblioteca random, que permite generar números aleatorios.
  • La sintaxis import nombre_biblioteca es la forma correcta de importar una biblioteca en Python.

Línea 5: code = ""

  • Se está creando una variable llamada code y se le asigna un valor vacío (""). Esto significa que code es una cadena de texto vacía, lista para ser modificada.
  • En Python, las cadenas se delimitan con comillas dobles o simples.

Línea 7: print("Generando contraseña numérica...\n")

  • La función print() se utiliza para imprimir mensajes en la consola. En este caso, se está imprimiendo el mensaje “Generando contraseña numérica…” seguido de un salto de línea (\n).
  • El \n es un escape caracter que representa un salto de línea.

Línea 9: for i in range(0, 8):

  • La estructura de control for se utiliza para iterar sobre una secuencia de valores. En este caso, estamos iterando desde el valor 0 hasta el valor 8 (inclusive).
  • El range() función devuelve una secuencia de números enteros que comienzan en el primer argumento y terminan en el segundo argumento.
  • La variable i es un índice que se utiliza para acceder a cada elemento de la secuencia.

Línea 10: code += str(random.randint(0, 9))

  • Dentro del bucle for, estamos utilizando la expresión random.randint(0, 9) para generar un número aleatorio entre 0 y 9 (inclusive).
  • La función str() se utiliza para convertir el valor numérico en una cadena de texto.
  • La sintaxis code += ... es equivalente a code = code + .... En este caso, estamos concatenando la nueva cadena generada con la cadena existente en code.

Línea 12: print(code)

  • Después de generar la contraseña numérica mediante el bucle for, se imprime la cadena completa en la consola.

En resumen, este programa utiliza la biblioteca random para generar una contraseña numérica aleatoria de longitud 8 y la imprime en la consola.

Ahora creamos una segunda versión del programa que nos permita elegir la cantidad de dígitos:

Esta segunda versión del generador nos permite ingresar la longitud de la contraseña, ese valor se guardará en la variable L, luego dejamos de lado el arreglo para utilizar una cadena vacía asignada a la variable code, una estructura para, que irá desde 1 hasta el valor de la variable L, concatenando a la variable code los distintos números elegidos al azar del 0 a 9, haciendo uso de las funciones concatenar y convertiratexto, esta última evitará tener problemas con los tipos de datos. Por último, se muestra como resultado el contenido de la variable code.

Analizamos el código

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Algoritmo generador2
Escribir 'Ingresar la longitud de la contraseña:'
Leer L
// Iniciamos una variable con una cadena vacía.
code <- ''
Escribir 'Generando contraseña numérica...'
Para i<-1 Hasta L Con Paso 1 Hacer
// Concatenamos números aleatorios del 0 al 9 con la longitud requerida.
code <- concatenar(code,(convertiratexto(aleatorio(0,9))))
FinPara
// Mostramos el código resultante de la concatenación guardada en la variable code.
Escribir code
FinAlgoritmo
Algoritmo generador2 Escribir 'Ingresar la longitud de la contraseña:' Leer L // Iniciamos una variable con una cadena vacía. code <- '' Escribir 'Generando contraseña numérica...' Para i<-1 Hasta L Con Paso 1 Hacer // Concatenamos números aleatorios del 0 al 9 con la longitud requerida. code <- concatenar(code,(convertiratexto(aleatorio(0,9)))) FinPara // Mostramos el código resultante de la concatenación guardada en la variable code. Escribir code FinAlgoritmo
Algoritmo generador2
	Escribir 'Ingresar la longitud de la contraseña:'
	Leer L
	// Iniciamos una variable con una cadena vacía.
	code <- ''
	Escribir 'Generando contraseña numérica...' 
	Para i<-1 Hasta L Con Paso 1 Hacer
		// Concatenamos números aleatorios del 0 al 9 con la longitud requerida.
		code <- concatenar(code,(convertiratexto(aleatorio(0,9))))
	FinPara
	// Mostramos el código resultante de la concatenación guardada en la variable code.
	Escribir code
FinAlgoritmo

Ejecutamos el programa


Veamos el código en C++:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// GENERADOR2.
#include <iostream>
#include <string>
#include <cstdlib> // para utilizar rand() y srand()
#include <ctime> // Para plantar la semilla aleatoria.
using namespace std;
int main() {
int longitud; // longitud de la contraseña
string code = ""; // cadena vacía donde se almacenará el código numérico
cout << "Ingresar la longitud de la contraseña: ";
cin >> longitud;
cout << "Generando contraseña numérica..." << endl;
srand(time(NULL)); // Iniciamos la semilla random con la hora.
for (int i = 0; i < longitud; i++) {
int numeroAleatorio = rand() % 10; // generar un número aleatorio del 0 al 9
string numeroString = to_string(numeroAleatorio); // convertir a string el número aleatorio
code += numeroString; // concatenar el número aleatorio a la cadena code
}
cout << endl << code << endl;
return 0;
}
// GENERADOR2. #include <iostream> #include <string> #include <cstdlib> // para utilizar rand() y srand() #include <ctime> // Para plantar la semilla aleatoria. using namespace std; int main() { int longitud; // longitud de la contraseña string code = ""; // cadena vacía donde se almacenará el código numérico cout << "Ingresar la longitud de la contraseña: "; cin >> longitud; cout << "Generando contraseña numérica..." << endl; srand(time(NULL)); // Iniciamos la semilla random con la hora. for (int i = 0; i < longitud; i++) { int numeroAleatorio = rand() % 10; // generar un número aleatorio del 0 al 9 string numeroString = to_string(numeroAleatorio); // convertir a string el número aleatorio code += numeroString; // concatenar el número aleatorio a la cadena code } cout << endl << code << endl; return 0; }
// GENERADOR2.

#include <iostream>
#include <string>
#include <cstdlib> // para utilizar rand() y srand()
#include <ctime> // Para plantar la semilla aleatoria.

using namespace std;

int main() {
    int longitud; // longitud de la contraseña
    string code = ""; // cadena vacía donde se almacenará el código numérico

    cout << "Ingresar la longitud de la contraseña: ";
    cin >> longitud;

    cout << "Generando contraseña numérica..." << endl;

    srand(time(NULL)); // Iniciamos la semilla random con la hora.

    for (int i = 0; i < longitud; i++) {
        int numeroAleatorio = rand() % 10; // generar un número aleatorio del 0 al 9
        string numeroString = to_string(numeroAleatorio); // convertir a string el número aleatorio

        code += numeroString; // concatenar el número aleatorio a la cadena code
    }

    cout << endl << code << endl;

    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // GENERADOR2.

  • Esta es una línea de comentario, indicando que se trata del segundo generador de contraseñas.

Líneas 3-6: #include <iostream>, #include <string> y #include <cstdlib> (y después) #include <ctime>

  • Estas son instrucciones para incluirlas bibliotecas estandar de C++:
  • <iostream>: Permite la entrada y salida de datos desde el teclado y pantalla.
  • <string>: Proporciona una clase llamada std::string para manejar cadenas de texto.
  • <cstdlib> (y después) <ctime>: Estas bibliotecas permiten utilizar funciones de randomización (rand() y srand()) y obtener la hora actual para plantar la semilla aleatoria.

Línea 8: using namespace std;

  • Esta línea declara que se utilizará el espacio de nombres std por defecto. Esto significa que no es necesario especificar std:: antes de usar funciones o clases como cout, cin, string, etc.

Líneas 11-12: int longitud; y string code = "";

  • Estas dos líneas declaran variables:
  • longitud: una variable entera para almacenar la longitud de la contraseña.
  • code: una cadena vacía (una variable de tipo std::string) donde se almacenará el código numérico generado.

Línea 14: cout << "Ingresar la longitud de la contraseña: ";

  • Esta línea imprime un mensaje en la pantalla solicitando al usuario que ingrese la longitud de la contraseña.
  • La función cout es una forma de salida de datos en el teclado y pantalla.

Línea 15: cin >> longitud;

  • Esta línea lee un valor entero desde el teclado y lo asigna a la variable longitud.
  • La función cin es una forma de entrada de datos desde el teclado.

Línea 17: cout << "Generando contraseña numérica..." << endl;

  • Estas dos líneas imprimen un mensaje en la pantalla indicando que se está generando una contraseña numérica.
  • La función endl es una forma de saltar a la siguiente línea en el flujo de salida.

Línea 19: srand(time(NULL));

  • Esta línea inicia la semilla aleatoria con la hora actual obtenida mediante la función time(NULL). Esto garantiza que se generen números aleatorios diferentes cada vez que se ejecuta el programa.
  • La función rand() es una forma de generar un número entero pseudoaleatorio.

Línea 21: for (int i = 0; i < longitud; i++)

  • Esta línea inicia un bucle for que se repetirá mientras i sea menor que la longitud ingresada por el usuario.
  • La variable i es una cuenta de iteración para controlar cuántas veces se repite el bucle.

Línea 22: int numeroAleatorio = rand() % 10;

  • Esta línea genera un número aleatorio entre 0 y 9 (inclusive) mediante la función rand() y lo almacena en la variable numeroAleatorio.
  • La expresión % 10 es una forma de obtener el resto de la división por 10.

Línea 23: string numeroString = to_string(numeroAleatorio);

  • Esta línea convierte el número entero aleatorio a un string utilizando la función to_string().
  • El resultado se almacena en la variable numeroString.

Línea 25: code += numeroString; y cout << endl << code << endl;

  • Estas dos líneas concatenan el número aleatorio convertido a string a la cadena vacía code.
  • La función cout imprime el resultado en la pantalla.

Linea 30: return 0;

Esta línea indica que el programa ha terminado ejecutarse correctamente. El valor de retorno es cero, lo cual significa que no hubo errores durante la ejecución.


Ahora el código en PYTHON:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# GENERADOR2.
import random
longitud = int(input("Ingresar la longitud de la contraseña: "))
print("Generando contraseña numérica...")
code = ""
for i in range(longitud):
numero_aleatorio = str(random.randint(0, 9))
code += numero_aleatorio
print(code)
# GENERADOR2. import random longitud = int(input("Ingresar la longitud de la contraseña: ")) print("Generando contraseña numérica...") code = "" for i in range(longitud): numero_aleatorio = str(random.randint(0, 9)) code += numero_aleatorio print(code)
# GENERADOR2.
import random

longitud = int(input("Ingresar la longitud de la contraseña: "))

print("Generando contraseña numérica...")

code = ""

for i in range(longitud):
	numero_aleatorio = str(random.randint(0, 9))
	code += numero_aleatorio

print(code)

Vamos a analizar línea por línea este código en PYTHON:

Línea 1: # GENERADOR2.

  • La comilla de múltiples líneas (#) es utilizada para indicar un comentario en Python, lo que significa que se
    ignora por la ejecución del programa.
  • El texto “GENERADOR2.” es una descripción o título del programa.

Línea 2: import random

  • La palabra clave import es utilizada para importar módulos de Python dentro del archivo actual.
  • En este caso, estamos importando el módulo random, que proporciona funciones para generar números aleatorios.
  • El módulo random se utiliza para generar contraseñas numéricas aleatorias.

Línea 4: longitud = int(input("Ingresar la longitud de la contraseña: "))

  • Se está declarando una variable llamada longitud y asignándole un valor.
  • La función input() es utilizada para solicitar al usuario que ingrese un valor.
  • El valor ingresado por el usuario se convierte a entero mediante la función int(), ya que la longitud de la contraseña debe ser un número entero.
  • La variable longitud almacenará el tamaño de la contraseña numérica generada.

Línea 6: print("Generando contraseña numérica...")

  • Se está utilizando la función print() para imprimir un mensaje en la pantalla, indicando que se está generando la contraseña numérica.
  • El mensaje es una cadena de texto que se imprime sin modificar.

Línea 8: code = ""

  • Se está declarando una variable llamada code y asignándole un valor inicializado a vacío ("").
  • La variable code almacenará la contraseña numérica generada.
  • El valor inicializado a vacío indica que la contraseña es aún vacía.

Línea 10: for i in range(longitud):

  • Se está utilizando la estructura de control for para iterar sobre el rango de valores desde 0 hasta el tamaño de la contraseña numérica (longitud) inclusive.
  • La variable i es un índice que se utiliza para acceder a cada elemento del rango.

Línea 11: numero_aleatorio = str(random.randint(0, 9))

  • Se está generando un número aleatorio entre 0 y 9 (inclusive) utilizando la función random.randint().
  • El valor generado se convierte a cadena de texto mediante la función str() para que pueda ser concatenado con la contraseña.
  • La variable numero_aleatorio almacenará el valor generado.

Línea 12: code += numero_aleatorio

  • Se está concatenando el valor generado (numero_aleatorio) a la cadena de texto almacenada en la variable code.
  • El operador += es utilizado para concatenar valores a una cadena de texto.

Línea 14: print(code)

  • Se está utilizando la función print() para imprimir la contraseña numérica generada.
  • La contraseña se imprime sin modificar, ya que no hay ninguna transformación aplicada.

En resumen, el programa utiliza la función random.randint() para generar números aleatorios y los concatena con una cadena de texto para crear una contraseña numérica aleatoria. El tamaño de la contraseña es solicitado al usuario mediante la función input(), y luego se imprime la contraseña generada en pantalla.

Creamos una nueva versión para que el programa pueda generar contraseñas alfanuméricas.

Recordar una contraseña de 100000 dígitos puede que sea algo complicado, es por ello que el uso de letras y números es una buena solución para generar contraseñas más seguras.
Para esta nueva versión utilizamos una variable llamada simbolos que contendrá todos los posibles caracteres que podrán aparecer en nuestra contraseña, otra variable llamada longsimbolos guardará la longitud de la variable simbolos, la variable recorte será asignada con un número al azar entre 1 y el valor de la variable longsimbolos, la misma se utilizará dentro de la función subcadena para extraer y concatenar en la variable code el símbolo elegido hasta completar la cantidad L solicitada por el usuario. Por último, se muestra como resultado el contenido de la variable code.

Analizamos el código

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Algoritmo generador3
Escribir "Ingresar la longitud de la contraseña:"
Leer L
// Iniciamos una variable con una cadena vacía.
code <- ""
// Ingresamos los simbolos para crear contraseñas.
simbolos <- "abcdefghijklmñopqrstuvwxyz0123456789"
// Guardamos la longitud de la cadena simbolos.
longsimbolos <- longitud(simbolos)
Escribir "Generando contraseña alfanumérica..."
Para i <- 1 Hasta L Con Paso 1 Hacer
// Concatenamos de la variable simbolos subcadenas de 1 simbolo al azar.
// Elige un n{umero entre 1 y el valor de la variable longsimbolos.
recorte <- aleatorio(1,longsimbolos)
// Extrae y concatena un simbolo en la ubicación que indica la variable recorte.
code <- concatenar(code,(subcadena(simbolos, recorte, recorte)))
FinPara
// Mostramos el código resultante de la concatenación guardada en la variable code.
Escribir code
FinAlgoritmo
Algoritmo generador3 Escribir "Ingresar la longitud de la contraseña:" Leer L // Iniciamos una variable con una cadena vacía. code <- "" // Ingresamos los simbolos para crear contraseñas. simbolos <- "abcdefghijklmñopqrstuvwxyz0123456789" // Guardamos la longitud de la cadena simbolos. longsimbolos <- longitud(simbolos) Escribir "Generando contraseña alfanumérica..." Para i <- 1 Hasta L Con Paso 1 Hacer // Concatenamos de la variable simbolos subcadenas de 1 simbolo al azar. // Elige un n{umero entre 1 y el valor de la variable longsimbolos. recorte <- aleatorio(1,longsimbolos) // Extrae y concatena un simbolo en la ubicación que indica la variable recorte. code <- concatenar(code,(subcadena(simbolos, recorte, recorte))) FinPara // Mostramos el código resultante de la concatenación guardada en la variable code. Escribir code FinAlgoritmo
Algoritmo generador3
	Escribir "Ingresar la longitud de la contraseña:"
	Leer L
	// Iniciamos una variable con una cadena vacía.
	code <- ""
	// Ingresamos los simbolos para crear contraseñas.
	simbolos <- "abcdefghijklmñopqrstuvwxyz0123456789" 
	// Guardamos la longitud de la cadena simbolos.
	longsimbolos <- longitud(simbolos)
	Escribir "Generando contraseña alfanumérica..."
	Para i <- 1 Hasta L Con Paso 1 Hacer
		// Concatenamos de la variable simbolos subcadenas de 1 simbolo al azar.
		// Elige un n{umero entre 1 y el valor de la variable longsimbolos.
		recorte <- aleatorio(1,longsimbolos)
		// Extrae y concatena un simbolo en la ubicación que indica la variable recorte.
		code <- concatenar(code,(subcadena(simbolos, recorte, recorte)))
	FinPara
	// Mostramos el código resultante de la concatenación guardada en la variable code.
	Escribir code
FinAlgoritmo

Ejecutamos el programa


Veamos el código en C++:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
// GENERADOR3.
#include <iostream>
#include <string>
#include <cstdlib> // para utilizar rand() y srand()
#include <ctime> // Para plantar la semilla aleatoria.
using namespace std;
int main() {
int L; // longitud de la contraseña
cout << "Ingresar la longitud de la contraseña: ";
cin >> L;
string code = ""; // variable para almacenar la contraseña
string simbolos = "abcdefghijklmñopqrstuvwxyz0123456789"; // cadena con los símbolos
int longsimbolos = simbolos.length(); // longitud de la cadena de símbolos
cout << "Generando contraseña alfanumérica..." << endl;
for (int i = 1; i <= L; i++) {
// elige un número al azar entre 0 y longsimbolos - 1
int recorte = rand() % longsimbolos;
// extrae y concatena un símbolo en la ubicación que indica la variable recorte
code += simbolos.substr(recorte, 1);
}
// muestra el código resultante de la concatenación guardado en la variable code
cout << endl << code << endl;
return 0;
}
// GENERADOR3. #include <iostream> #include <string> #include <cstdlib> // para utilizar rand() y srand() #include <ctime> // Para plantar la semilla aleatoria. using namespace std; int main() { int L; // longitud de la contraseña cout << "Ingresar la longitud de la contraseña: "; cin >> L; string code = ""; // variable para almacenar la contraseña string simbolos = "abcdefghijklmñopqrstuvwxyz0123456789"; // cadena con los símbolos int longsimbolos = simbolos.length(); // longitud de la cadena de símbolos cout << "Generando contraseña alfanumérica..." << endl; for (int i = 1; i <= L; i++) { // elige un número al azar entre 0 y longsimbolos - 1 int recorte = rand() % longsimbolos; // extrae y concatena un símbolo en la ubicación que indica la variable recorte code += simbolos.substr(recorte, 1); } // muestra el código resultante de la concatenación guardado en la variable code cout << endl << code << endl; return 0; }
// GENERADOR3.

#include <iostream>
#include <string>
#include <cstdlib> // para utilizar rand() y srand()
#include <ctime> // Para plantar la semilla aleatoria.

using namespace std;

int main() {
    int L; // longitud de la contraseña

    cout << "Ingresar la longitud de la contraseña: ";
    cin >> L;

    string code = "";  // variable para almacenar la contraseña
    string simbolos = "abcdefghijklmñopqrstuvwxyz0123456789";  // cadena con los símbolos

    int longsimbolos = simbolos.length();  // longitud de la cadena de símbolos

    cout << "Generando contraseña alfanumérica..." << endl;

    for (int i = 1; i <= L; i++) {
        // elige un número al azar entre 0 y longsimbolos - 1
        int recorte = rand() % longsimbolos;

        // extrae y concatena un símbolo en la ubicación que indica la variable recorte
        code += simbolos.substr(recorte, 1);
    }

    // muestra el código resultante de la concatenación guardado en la variable code
    cout << endl << code << endl;

    return 0;
}

Vamos a analizar línea por línea este código en C++:

Línea 1: // GENERADOR3.

  • La comilla de múltiples líneas (//) es utilizada para indicar un comentario en C++, lo que significa que se ignora por la compilación del programa.
  • El texto “GENERADOR3.” es una descripción o título del programa.

Línea 3: #include <iostream>

  • La directiva de inclusión #include es utilizada para incluir archivos de cabecera en el programa actual.
  • En este caso, estamos incluyendo el archivo de cabecera <iostream>, que proporciona funciones de entrada y salida.
  • Las funciones de entrada y salida (cin, cout) se utilizarán más adelante.

Línea 4: #include <string>

  • Se está incluyendo la biblioteca <string>, que proporciona funciones y operadores para manipular cadenas de caracteres.

Línea 5: #include <cstdlib>

  • Se está incluyendo la biblioteca <cstdlib>, que proporciona funciones de conversión y funciones de cálculo aleatorio (rand() y srand()).

Línea 6: #include <ctime>

  • Se está incluyendo la biblioteca <ctime>, que proporciona funciones para manipular la fecha y hora del sistema (time()).

Línea 8: using namespace std;

  • La palabra clave using es utilizada para especificar un espacio de nombres a utilizar en el programa actual.
  • En este caso, estamos utilizando el espacio de nombres std, que contiene las funciones de la biblioteca estándar de C++.

Línea 10: int main() {

  • La función main() es la entrada principal del programa, y se utiliza para iniciar la ejecución del programa.
  • El parámetro int indica que la función devuelve un valor entero.

Línea 11: int L; // longitud de la contraseña

  • Se está declarando una variable de tipo entero llamada L, que almacenará el tamaño de la contraseña.
  • La comentario // longitud de la contraseña es utilizado para proporcionar información sobre la variable.

Línea 13: cout << "Ingresar la longitud de la contraseña: ";

  • Se está utilizando la función cout para imprimir un mensaje en la pantalla, solicitando al usuario que ingrese el tamaño de la contraseña.
  • El operador de concatenación (<<) es utilizado para conectar el mensaje con el flujo de salida.

Línea 14: cin >> L;

  • Se está utilizando la función cin para leer un valor entero desde el teclado y almacenarlo en la variable L.
  • La palabra clave >> es utilizada para desplazar los bits del valor leído hacia la izquierda.

Línea 16: string code = "";

  • Se está declarando una variable de tipo cadena llamada code, que almacenará la contraseña generada.
  • La inicialización a vacío ("") indica que la contraseña es aún vacía.

Línea 17: string simbolos = "abcdefghijklmñopqrstuvwxyz0123456789";

  • Se está declarando una variable de tipo cadena llamada simbolos, que almacena una lista de símbolos (letras y números).
  • La inicialización a la cadena literal indica que la lista de símbolos es fija.

Línea 19: int longsimbolos = simbolos.length();

  • Se está declarando una variable de tipo entero llamada longsimbolos, que almacenará la longitud de la cadena de símbolos.
  • La función length() devuelve el número de elementos en la cadena.

Línea 21: cout << "Generando contraseña alfanumérica..." << endl;

  • Se está utilizando la función cout para imprimir un mensaje en la pantalla, indicando que se está generando una contraseña alfanumérica.
  • El operador de concatenación (<<) es utilizado para conectar el mensaje con el flujo de salida.

Línea 23: for (int i = 1; i <= L; i++) {

  • Se está utilizando un bucle for para iterar sobre los símbolos y generar la contraseña.
  • La condición de parada es que el valor entero i sea menor o igual a la longitud de la contraseña (L).

Línea 25: int recorte = rand() % longsimbolos;

  • Se está generando un número aleatorio entre 0 y la longitud de la cadena de símbolos menos uno.
  • La función rand() devuelve un valor entero aleatorio, y el operador % es utilizado para restar el resto del
    resultado.

Línea 28: code += simbolos.substr(recorte, 1);

  • Se está extrayendo un símbolo de la cadena a partir del índice generado en la línea anterior.
  • La función substr() devuelve una cadena que comienza desde el índice indicado y tiene longitud igual a la cantidad especificada.

Línea 32: cout << endl << code << endl;

  • Se está utilizando la función cout para imprimir un mensaje en la pantalla, mostrando la contraseña generada.
  • El operador de concatenación (<<) es utilizado para conectar el mensaje con el flujo de salida.

Línea 34: return 0;

El valor 0 indica que la ejecución del programa fue exitosa.

La función main() devuelve un valor entero indicando que se ha finalizado correctamente.


Ahora el código en PYTHON:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# GENERADOR3.
import random
L = int(input("Ingresar la longitud de la contraseña: "))
code = ""
simbolos = "abcdefghijklmñopqrstuvwxyz0123456789"
longsimbolos = len(simbolos)
print("Generando contraseña alfanumérica...")
for i in range(1, L + 1):
# elige un número al azar entre 0 y longsimbolos - 1
recorte = random.randint(0, longsimbolos - 1)
# extrae y concatena un símbolo en la ubicación que indica la variable recorte
code += simbolos[recorte]
# muestra el código resultante de la concatenación guardado en la variable code
print(code)
# GENERADOR3. import random L = int(input("Ingresar la longitud de la contraseña: ")) code = "" simbolos = "abcdefghijklmñopqrstuvwxyz0123456789" longsimbolos = len(simbolos) print("Generando contraseña alfanumérica...") for i in range(1, L + 1): # elige un número al azar entre 0 y longsimbolos - 1 recorte = random.randint(0, longsimbolos - 1) # extrae y concatena un símbolo en la ubicación que indica la variable recorte code += simbolos[recorte] # muestra el código resultante de la concatenación guardado en la variable code print(code)
# GENERADOR3.

import random

L = int(input("Ingresar la longitud de la contraseña: "))

code = ""
simbolos = "abcdefghijklmñopqrstuvwxyz0123456789"

longsimbolos = len(simbolos)

print("Generando contraseña alfanumérica...")

for i in range(1, L + 1):
    # elige un número al azar entre 0 y longsimbolos - 1
    recorte = random.randint(0, longsimbolos - 1)

    # extrae y concatena un símbolo en la ubicación que indica la variable recorte
    code += simbolos[recorte]

# muestra el código resultante de la concatenación guardado en la variable code
print(code)

Vamos a analizar línea por línea este código en PYTHON:

Línea 1: # GENERADOR3.

  • La comilla de múltiples líneas (#) es utilizada para indicar un comentario en Python, lo que significa que se
    ignora por la ejecución del programa.
  • El texto “GENERADOR3.” es una descripción o título del programa.

Línea 3: import random

  • La palabra clave import es utilizada para importar módulos de Python, y en este caso, estamos importando el módulo random.
  • El módulo random proporciona funciones para generar números aleatorios.

Línea 5: L = int(input("Ingresar la longitud de la contraseña: "))

  • Se está declarando una variable llamada L y se le asigna el valor obtenido de la entrada del usuario.
  • La función input() devuelve una cadena que representa la entrada del usuario, y la función int() convierte esa cadena a un número entero.
  • El texto entre comillas es el mensaje que se mostrará al usuario para pedirle que ingrese la longitud de la
    contraseña.

Línea 7: code = ""

  • Se está declarando una variable llamada code y se le asigna un valor vacío ("").
  • La variable code almacenará la contraseña generada.

Línea 8: simbolos = "abcdefghijklmñopqrstuvwxyz0123456789"

  • Se está declarando una cadena literal llamada simbolos, que contiene todos los símbolos (letras y números) del alfabeto.
  • La variable simbolos será utilizada para generar la contraseña.

Línea 10: longsimbolos = len(simbolos)

  • Se está declarando una variable llamada longsimbolos y se le asigna el valor obtenido de la longitud de la cadena simbolos.
  • La función len() devuelve el número de elementos en la cadena.

Línea 12: print("Generando contraseña alfanumérica...")

  • Se está utilizando la función print() para imprimir un mensaje en la pantalla, indicando que se está generando una contraseña alfanumérica.
  • El texto entre comillas es el mensaje que se mostrará.

Línea 14: for i in range(1, L + 1):

  • Se está utilizando un bucle for para iterar sobre los símbolos y generar la contraseña.
  • La función range() devuelve una secuencia de números enteros que comienza desde el valor inicial (en este caso, 1) y termina en el valor final (que es la longitud de la contraseña (L) más uno).

Línea 16: recorte = random.randint(0, longsimbolos - 1)

  • Se está generando un número aleatorio entre 0 y la longitud de la cadena de símbolos menos uno.
  • La función randint() devuelve un valor entero aleatorio dentro del rango especificado.

Línea 19: code += simbolos[recorte]

  • Se está extrayendo un símbolo de la cadena a partir del índice generado en la línea anterior.
  • El texto entre corchetes es el índice que se utiliza para acceder al símbolo correspondiente en la cadena.

Línea 22: print(code)

  • Se está utilizando la función print() para imprimir un mensaje en la pantalla, mostrando la contraseña generada.
  • La variable code contiene la contraseña, y se imprime su valor.


TAREA PARA EL HOGAR

  1. Agregar mayúsculas y más símbolos a la variable simbolos para generar contraseñas mucho más “pulentas”.
  2. Crear una nueva versión del generador para que genere una clave de longitud aleatoria.