Este blog está escrito principalmente para ayudar si está buscando lógica de cifrado en SAP.
Hay 2 formas de encriptación:
i) PGP: esto necesitaría el paquete PGP instalado en SAP (Esto no está cubierto en este blog.)
ii) AES: código abierto y se puede realizar mediante la ejecución de comandos a nivel de servidor.
Este blog está tratando de abordar el escenario del archivo de pago (F110). Los archivos de pago generados deben cifrarse y CPI o un tercero deben haberlos descifrado (según el escenario).
Puede haber varios escenarios, por ejemplo, si estamos haciendo AES desde SAP y un tercero no acepta AES, entonces CPI tiene que descifrar y cifrar nuevamente en PGP y enviarlo a un tercero.
En cualquier caso, tenemos que asegurarnos de que la clave que estamos utilizando sea accesible a terceros y sean capaces de descifrar el archivo.
DATA: lt_result TYPE TABLE OF char1024
.
DATA(lv_str) = 'openssl enc -aes-256-cbc -k secret -P -md sha1' .
CALL 'SYSTEM' ID 'COMMAND' FIELD lv_str
ID 'TAB' FIELD lt_result[]
DATA: lv_fieldname TYPE regut-fsnam VALUE '(SAPLFPAYM10)GC_DME_FNAME',
lv_flag_out TYPE regut-fsnam VALUE '(SAPFPAYM)PAR_XFIL',
lv_path_org TYPE regut-fsnam,
lv_path_encrypted TYPE regut-fsnam,
lv_cmd TYPE char1024,
lt_result2 TYPE TABLE OF char1024,
gc_cr(1) TYPE c, "Carriage return code
gc_lf(1) TYPE c, "Line feed code
gc_eof(1) TYPE c, "End of line code..
i_no_end_of_line VALUE 'X',
lv_key TYPE zaes_key,
lv_iv TYPE zaes_iv,
lv_keystr(200) TYPE c,
ls_string TYPE string.
FIELD-SYMBOLS: <fs_fieldname> TYPE any,
<fs_flag_out> TYPE any.
ASSIGN (lv_flag_out) TO <fs_flag_out>.
IF <fs_flag_out> EQ abap_true.
*Assign Standard file Name to Field Symbol
ASSIGN (lv_fieldname) TO <fs_fieldname>.
IF sy-subrc = 0.
lv_path_org = <fs_fieldname> .
CONCATENATE lv_path_org
TEXT-004
INTO lv_path_encrypted.
ENDIF.
CLEAR ls_string.
*Append structure data to the existing file
* OPEN DATASET lv_path_org FOR APPENDING IN LEGACY BINARY MODE.
* IF sy-subrc = 0.
CALL FUNCTION 'FI_DME_CHARACTERS'
IMPORTING
e_cr = gc_cr
e_lf = gc_lf
e_eof = gc_eof.
LOOP AT t_file_output INTO DATA(ls_lines).
IF ls_lines-length > 0.
CLEAR ls_string.
CONCATENATE ls_string ls_lines-line(ls_lines-length) INTO ls_string
RESPECTING BLANKS.
IF i_no_end_of_line IS INITIAL.
TRANSFER ls_string TO lv_path_org.
ELSE.
TRANSFER ls_string TO lv_path_org NO END OF LINE.
ENDIF.
IF sy-subrc NE 0.
MESSAGE a229(bfibl02).
ENDIF.
ENDIF.
IF NOT ls_lines-x_cr IS INITIAL.
IF i_no_end_of_line IS INITIAL.
TRANSFER gc_cr TO lv_path_org.
ELSE.
TRANSFER gc_cr TO lv_path_org NO END OF LINE.
ENDIF.
IF sy-subrc NE 0.
MESSAGE a229(bfibl02).
ENDIF.
ENDIF.
IF NOT ls_lines-x_lf IS INITIAL.
IF i_no_end_of_line IS INITIAL.
TRANSFER gc_lf TO lv_path_org.
ELSE.
TRANSFER gc_lf TO lv_path_org NO END OF LINE.
ENDIF.
IF sy-subrc NE 0.
MESSAGE a229(bfibl02).
ENDIF.
ENDIF.
IF NOT ls_lines-x_eof IS INITIAL.
IF i_no_end_of_line IS INITIAL.
TRANSFER gc_eof TO lv_path_org.
ELSE.
TRANSFER gc_eof TO lv_path_org NO END OF LINE.
ENDIF.
IF sy-subrc NE 0.
MESSAGE a229(bfibl02).
ENDIF.
ENDIF.
* ENdif
CLEAR ls_lines.
ENDLOOP.
* ENDIF.
CLOSE DATASET lv_path_org.
* Give 777 permission to the original file
CONCATENATE TEXT-001
lv_path_org
INTO lv_cmd SEPARATED BY space.
* Command is executed
CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
ID 'TAB' FIELD lt_result2[].
CLEAR: lv_cmd, lt_result2.
SELECT SINGLE aes_key iv_key INTO (lv_key,lv_iv ) FROM zr2r_t_encrypt
WHERE prog_name="ZR2R_I_002_PAYMEDIUM_41"
.
IF sy-subrc <> 0.
* Implement suitable error handling here
ELSE.
CONCATENATE '-K' lv_key
'-iv' lv_iv
INTO lv_keystr SEPARATED BY space.
* Aes 256 encryption
CONCATENATE TEXT-002
lv_path_org
'-out'
lv_path_encrypted
lv_keystr
INTO lv_cmd SEPARATED BY space.
* Command is executed
CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
ID 'TAB' FIELD lt_result2[].
* 777 Permission given to the encrypted file
CLEAR: lv_cmd, lt_result2.
CONCATENATE TEXT-001
lv_path_encrypted
INTO lv_cmd SEPARATED BY space.
* Command is executed
CALL 'SYSTEM' ID 'COMMAND' FIELD lv_cmd
ID 'TAB' FIELD lt_result2[].
ENDIF.
CLEAR: t_file_output.
REFRESH: t_file_output.
FREE: t_file_output.
* Delete the Original file
DELETE DATASET lv_path_org.
ENDIF.
Hágame saber si tiene alguna pregunta o duda en el blog anterior y podemos corregirlo en consecuencia.
Gracias,
Vimal
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073