IDENTIFICATION DIVISION.
******************
* Identification *
******************
PROGRAM-ID. COBOLRANDF.
Generar cadenas aleatorias en COBOL.
A continuación se describe las circunstancias bajo las cuales la siguiente solución tiene sentido:
Se está desarrollando una aplicación en COBOL.
La aplicación debe generar cadenas aleatorias para diferentes usos.
Los archivos generados en directorios públicos deben tener nombre aleatorio[1].
En la siguiente solución se muestra la forma de generar números aleatorios que siguen una distribución rectangular usando la función nativa RANDOM de COBOL. Para dicho propósito, se debe calcular una semilla la cual, sirve para inicializar el generador de números aleatorios. No generar una semilla y obtener el valor directamente podría generar problemas de seguridad ya que los números aleatorios podrían ser fácilmente predecibles.
Se da inicio a la solución definiendo la división IDENTIFICATION DIVISION[2],[3]:
IDENTIFICATION DIVISION.
******************
* Identification *
******************
PROGRAM-ID. COBOLRANDF.
Se definen nueve variables:
W01-RANDOM en la que finalmente se va a almacenar el número aleatorio.
W02-CURRENT-DATE-DATA que va a contener la fecha actual de ejecución del programa.
W03-IDAY y W04-SVAL, variables de uso temporal cuyo fin es facilitar el cálculo de los segundos transcurridos desde el primero de enero de 1970.
W05-CHARSET el conjunto de caracteres definidos para la cadena aleatoria.
W06-RANDOMNAME contiene la cadena aleatoria de 40 caracteres.
W07-COUNT contador usado para formar la cadena aleatoria.
W08-POS posición obtenida del generador de números aleatorios, según esta posición se extrae un caracter del conjunto de caracteres definido.
W09-RANDOMINT variable temporal usada para representar el número aleatorio de forma entera.
********
* Data *
********
DATA DIVISION.
WORKING-STORAGE SECTION.
01 W01-RANDOM PIC S9V9(10).
01 W02-CURRENT-DATE-DATA.
05 W02-CURRENT-DATE.
10 W02-CURRENT-YEAR PIC 9(04).
10 W02-CURRENT-MONTH PIC 9(02).
10 W02-CURRENT-DAY PIC 9(02).
05 W02-CURRENT-TIME.
10 W02-CURRENT-HOURS PIC 9(02).
10 W02-CURRENT-MINUTE PIC 9(02).
10 W02-CURRENT-SECOND PIC 9(02).
10 W02-CURRENT-MILLIS PIC 9(02).
05 W02-DIFF-FROM-GMT PIC X(05).
01 W03-IDAY PIC 9(12).
01 W04-SVAL PIC 9(12).
01 W05-CHARSET PIC X(62).
01 W06-RANDOMNAME PIC X(40).
01 W07-COUNT PIC 9(02).
01 W08-POS PIC 9(03).
01 W09-RANDOMINT PIC 9(18).
Se inicia el proceso obteniendo la fecha actual de ejecución del programa:
********
* Main *
********
PROCEDURE DIVISION.
MAIN.
MOVE FUNCTION CURRENT-DATE TO W02-CURRENT-DATE-DATA.
Se calcula el número de días transcurridos desde 1970 (sin contar los años bisiestos):
COMPUTE W03-IDAY = 365 * (W02-CURRENT-YEAR - 1970).
Según el valor del mes, se va acumulando esos días con los días transcurridos en el actual año:
EVALUATE W02-CURRENT-MONTH
WHEN 1 COMPUTE W03-IDAY = W03-IDAY + 0
WHEN 2 COMPUTE W03-IDAY = W03-IDAY + 31
WHEN 3 COMPUTE W03-IDAY = W03-IDAY + 59
WHEN 4 COMPUTE W03-IDAY = W03-IDAY + 90
WHEN 5 COMPUTE W03-IDAY = W03-IDAY + 120
WHEN 6 COMPUTE W03-IDAY = W03-IDAY + 151
WHEN 7 COMPUTE W03-IDAY = W03-IDAY + 181
WHEN 8 COMPUTE W03-IDAY = W03-IDAY + 212
WHEN 9 COMPUTE W03-IDAY = W03-IDAY + 243
WHEN 10 COMPUTE W03-IDAY = W03-IDAY + 273
WHEN 11 COMPUTE W03-IDAY = W03-IDAY + 304
WHEN 12 COMPUTE W03-IDAY = W03-IDAY + 365
WHEN OTHER COMPUTE W03-IDAY = W03-IDAY + 0
END-EVALUATE.
Se acumula el número de días transcurridos:
COMPUTE W03-IDAY = W03-IDAY + (W02-CURRENT-DAY - 1).
Luego se obtiene el número de segundos transcurridos desde el 1 de enero de 1970, esto ayudará a generar una semilla de forma segura:
COMPUTE W04-SVAL = W02-CURRENT-SECOND +
(60 * W02-CURRENT-MINUTE) +
(3600 * (W02-CURRENT-HOURS + (24 * W03-IDAY))).
Se establece el conjunto de caracteres que contendrá la cadena aleatoria:
STRING "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
DELIMITED BY SIZE
INTO W05-CHARSET.
Se realiza una iteración desde uno hasta cuarenta:
PERFORM VARYING W07-COUNT FROM 1 BY 1 UNTIL W07-COUNT > 40
Modificamos el valor de la semilla por cada iteración:
COMPUTE W04-SVAL = W04-SVAL + W07-COUNT
Generamos el número aleatorio de acuerdo a la semilla:
COMPUTE W01-RANDOM = FUNCTION RANDOM(W04-SVAL)
Obtenemos la parte entera del número aleatorio:
COMPUTE W09-RANDOMINT = W01-RANDOM * 65535
A través de la función MOD,[4] se obtiene un número aleatorio entre 1 y 62:
COMPUTE W08-POS = FUNCTION MOD(W09-RANDOMINT, 62)
COMPUTE W08-POS = W08-POS + 1
Este número permite escoger aleatoriamente un carácter del conjunto de caracteres. Lo concatenamos al final de la cadena aleatoria y terminamos el ciclo:
STRING W06-RANDOMNAME W05-CHARSET(W08-POS:1)
DELIMITED BY SPACE
INTO W06-RANDOMNAME
END-PERFORM.
Mediante la instrucción DISPLAY se despliega en pantalla la cadena aleatoria:
DISPLAY "Cadena aleatoria: " W06-RANDOMNAME.
STOP RUN.
Las siguientes son algunas de las cadenas generadas al momento de llevar a cabo la prueba:
fYN8rU5c5VrAOahlmibQCuZ9hBbyGVhpttqjZL4i
VNCyfKvRuLgyEOWaaXQG2kOzW0Qm5KVdijfZPBtY
QJ8ucGqOrGcvALSWXUMCxgKwTwMj1HSaefcVK6pU
NG4rYCnKnDZs6IPTTPJ8ucHrPtJfxDOWbbYRH3mQ
G8yjR5gCg6SkzAIMLIC1nVAkHmBXr5HPTUQKAweJ
C4ufN1c9c2Pgv6EIIF8yjS6hEh7Un2DLPQNH7taG
Puedes descargar el código fuente pulsando en el siguiente enlace:
contiene todas las instrucciones COBOL del programa explicado anteriormente.
Copyright © 2021 Fluid Attacks, We hack your software. All rights reserved.