Fórmula de Luhn (Digito verificador de Tarjetas)

Todo lo relacionado con JCL, manejo de jobs, etc.
Responder
qwe2
Usuario avanzado
Usuario avanzado
Mensajes: 60
Registrado: 21 Ene 2015, 16:13
País: Argentina
Ciudad: CABA
Ocupación: Analista de desarrollo

Fórmula de Luhn (Digito verificador de Tarjetas)

Mensaje por qwe2 » 26 Dic 2016, 12:06

Buenas, que tal, hace no mucho me enteré de esta formula leyendo un artículo de Ars-Technica (página que recomiendo ampliamente). Y aprendí que la Formula de Luhn para calcular el dígito verificador de las tarjetas de crédito/débito -y en general de casi todas las tarjetas que hay en el mercado- es una fórmula de público conocimiento, no es un codigo secreto, sino que fue inventado para evitar "accidentes" y que fue diseñada por Hans Peter Luhn en el 54'. En mi caso para probar la fórmula hice un SORT y usé solamente tarjetas Visa pero según el artículo de wikipedia todas las tarjetas que hay en el mercado lo usan de una u otra manera (fórmula y tipos de tarjetas).

En fin acá les dejo el SORT. SORTIN: número de tarjeta de 15 posiciones. SORTOUT: entrada de 15 posiciones + dígito verificador (16 posiciones en total).
Por el momento probé solamente con Visa pero segun los articulos comentados la misma fórmula se aplica para todas las tarjetas. En el ejemplo no puse tarjetas existentes por obvias razones, pero les aseguro que lo probe con varias tarjetas Visa y el SORT funciona. Por último, si alguien quiere ver como hacer lo mismo pero en COBOL en este link tienen un ejemplo.
Saludos! :sombrero:

Código: Seleccionar todo

//**********************************************************************
//*** BORRO ARCHIVOS                                                    
//**********************************************************************
//STEP0010 EXEC IDCAMS                                                  
//SYSIN    DD *                                                         
  DEL salida
  SET MAXCC=0                                                           
//**********************************************************************
//*** FORMULA DE LUHN (DIGITO VERIFICADOR)                              
//**********************************************************************
//STEP0020 EXEC PGM=SORT                                                
//SYSOUT   DD SYSOUT=*                                                  
//SORTIN   DD *                                                         
999999999999999                                                         
111111111111111                                                         
//SORTOUT  DD DSN=salida,
//            DISP=(,CATLG,DELETE),                                     
//            UNIT=SYSDA,SPACE=(CYL,(5,5),RLSE),                        
//            DCB=(LRECL=16,BLKSIZE=0,RECFM=FB)                         
  SORT   FIELDS=COPY                                                    
  INREC  IFTHEN=(WHEN=INIT,                                             
        OVERLAY=(20:01,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 01             
                 22:02,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 02 EVEN        
                 24:03,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 03             
                 26:04,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 04 EVEN        
                 28:05,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 05             
                 30:06,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 06 EVEN        
                 32:07,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 07             
                 34:08,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 08 EVEN        
                 36:09,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 09             
                 38:10,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 10 EVEN        
                 40:11,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 11             
                 42:12,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 12 EVEN        
                 44:13,1,ZD,MUL,+2,ZD,LENGTH=2,      POS 13             
                 46:14,1,ZD,MUL,+1,ZD,LENGTH=2,      POS 14 EVEN        
                 48:15,1,ZD,MUL,+2,ZD,LENGTH=2))     POS 15             
  OUTREC IFTHEN=(WHEN=INIT,                                             
        OVERLAY=(55:20,1,ZD,ADD,21,1,ZD,ADD,22,1,ZD,ADD,23,1,ZD,ADD,    
                    24,1,ZD,ADD,25,1,ZD,ADD,26,1,ZD,ADD,27,1,ZD,ADD,    
                    28,1,ZD,ADD,29,1,ZD,ADD,30,1,ZD,ADD,31,1,ZD,ADD,    
                    32,1,ZD,ADD,33,1,ZD,ADD,34,1,ZD,ADD,35,1,ZD,ADD,    
                    36,1,ZD,ADD,37,1,ZD,ADD,38,1,ZD,ADD,39,1,ZD,ADD,    
                    40,1,ZD,ADD,41,1,ZD,ADD,42,1,ZD,ADD,43,1,ZD,ADD,    
                    44,1,ZD,ADD,45,1,ZD,ADD,46,1,ZD,ADD,47,1,ZD,ADD,    
                    48,1,ZD,ADD,49,1,ZD,EDIT=(TTT))),                   
         IFTHEN=(WHEN=(55,3,ZD,GT,0),                                   
        OVERLAY=(60:55,3,ZD,MUL,+9,EDIT=(TTTT)))                        
  OUTFIL FNAMES=SORTOUT,BUILD=(1,15,63,1)

Responder