Fluid Attacks logo
Contact Us
Young hacker smiling
Zero false positives

Expert intelligence + effective automation

Generar Llaves

Necesidad

Usar la función criptográfica más segura del lenguaje para la generación de llaves aleatorias en COBOL.

Contexto

A continuación se describe las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación en COBOL.

  2. Debe usarse el mecanismo criptográfico más seguro ofrecido por la plataforma de desarrollo para la generación de números aleatorios, de los cuales se deriven riesgos de seguridad en caso de predecirse el número (ej: Generación de ID, mapeo de códigos, llaves), evaluando previamente un posible impacto en la disponibilidad[1].

Solución

  1. La generación de números pseudoaleatorios es realizada aplicando los conceptos del apéndice 3 de FIPS 186-1. El servidor automáticamente genera la semilla usando datos recolectados de la información del sistema o usando un coprocesador criptográfico como el 4764 si está disponible.

  2. El procedimiento Qc3GenPRNs tiene como propósito la generación de números pseudoaleatorios criptográficamente seguros.

  3. Comenzamos la solución definiendo la división IDENTIFICATION DIVISION[2]:

    cobolrnds.cbl
    1
    2
    3
    4
    5
    6
           PROCESS NOMONOPRC.
           IDENTIFICATION DIVISION.
          ******************
          * Identification *
          ******************
           PROGRAM-ID. COBOLRNDS.
    

    En esta división mediante la sentencia PROGRAM-ID, se denomina al programa como COBOLRNDS.

  4. En la división ENVIRONMENT DIVISION[3] y dentro de la sección CONFIGURATION SECTION, enlazamos el procedimiento externo Qc3GenPRNs:

    1
    2
    3
    4
    5
    6
    7
    8
    9
          ***************
          * Environment *
          ***************
           ENVIRONMENT DIVISION.
           CONFIGURATION SECTION.
             SOURCE-COMPUTER. IBM-ISERIES.
             OBJECT-COMPUTER. IBM-ISERIES.
             SPECIAL-NAMES.
             LINKAGE TYPE PROCEDURE FOR "Qc3GenPRNs".
    
  5. En la división DATA DIVISION[4] se copia las estructuras contenidas en QC3CCI (Manejo criptográfico) y QUSEC (Manejo de errores):

    1
    2
    3
    4
    5
    6
    7
    8
          ********
          * Data *
          ********
           DATA DIVISION.
    
           WORKING-STORAGE SECTION.
           COPY QC3CCI OF QSYSINC-QCBLLESRC.
           COPY QUSEC OF QSYSINC-QCBLLESRC.
    
  6. Se declara la variable WS-RAND-BYTES, la cual va a almacenar la llave generada aleatoriamente:

    1
           01 WS-RAND-BYTES PIC X(32).
    
  7. En la división PROCEDURE DIVISION se encuentra la lógica de negocio:

    1
    2
    3
    4
    5
          ********
          * Main *
          ********
           PROCEDURE DIVISION.
           MAIN.
    
  8. Se hace un llamado al procedimiento Qc3GenPRNs. Los argumentos que espera el procedimiento[5] son:

    • Data: La variable donde se va a almacenar el flujo de datos aleatorios.

    • Longitud de datos: La longitud de la variable portadora.

    • Tipo: Indica el tipo de flujo. 0 para la generación de números pseudoaleatorios reales, 1 para la generación de números pseudoaleatorios de prueba.

    • Paridad: Indica la paridad en cada byte del flujo. 0 para no establecer paridad, 1 para establecer paridad par y 2 para establecer paridad impar.

    • Error: Estructura donde se almacena el error en caso de excepción.

    1
    2
    3
    4
    5
    6
           CALL "Qc3GenPRNs" USING
               BY REFERENCE WS-RAND-BYTES,
               BY CONTENT   LENGTH OF WS-RAND-BYTES,
               BY CONTENT   "0",
               BY CONTENT   "0",
               BY REFERENCE QUS-EC.
    
  9. Se despliega en pantalla el flujo aleatorio y se detiene la ejecución del programa:

    1
    2
    3
           DISPLAY "Random: " WS-RAND-BYTES.
    
           STOP RUN.
    
  10. Algunas de las llaves generadas al ejecutar el programa pueden ser observadas a continuación:

    1
    2
    3
    4
    5
    6
    Random:  iÂQW½ &l  º|äF Êú§± zº PïõM#OÝÖ
    Random: Üæ@  & ϬÓ÷2]#` ä« ñÒ´    =5fr4ÿ
    Random: üQ;ý Øi âÒãyè*  ñ ß:¿¯S}  e9$óóâ
    Random: %xërW 8W!îæ @ëÆ?Æ 5(    é"  íõ ä
    Random: Á  ÅûÀ·d,é P~J¾}Ãðø£  ® >  zY"6÷
    Random: F`IG9q£þ#    £ #¯¥6 VæU V¼½m8 OÙ
    

Descargas

Puedes descargar el código fuente pulsando en el siguiente enlace:

  1. cobolrnds.cbl contiene todas las instrucciones COBOL que generan las llaves como se explicó anteriormente.


Service status - Terms of Use