SAP ABAP ENCRIPTACION

From SapWiki
Revision as of 21:59, 28 March 2020 by WikiSysop (talk | contribs)

Ejemplo AES 256 mode CBC

 *&---------------------------------------------------------------------*
 *& Report YENCRIPT2_DO
 *&---------------------------------------------------------------------*
 *&
 *&---------------------------------------------------------------------*
 REPORT yencript2_do.
 * equivale a AES 256 mode CBC
 * basado en CL_SEC_SXML_WRITER=>CRYPT_AES_CTR
 * para test https://www.devglan.com/online-tools/aes-encryption-decryption
 
 DATA: blocksize  TYPE i
     , keysize    TYPE i
     , cipher     TYPE xstring
     , block      TYPE xstring
     , rest       TYPE i
     , offset     TYPE i
     , l_iv       TYPE xstring
     , emptyiv    TYPE xstring
     , counter(4) TYPE x
     , ctroffset  TYPE i
     .
 DATA iv TYPE xstring.
 DATA key TYPE xstring.
 DATA input TYPE xstring.
 DATA result TYPE xstring.
 DATA l_plaintext TYPE string.
 DATA l_plaintext_x TYPE xstring.
 DATA l_key TYPE string.
 DATA l_key_x TYPE xstring.
 DATA lv_message TYPE xstring.
 DATA lv_message_decrypted TYPE xstring.
 DATA lr_xstring TYPE xstring.
 DATA l_base64 TYPE string.
 DATA lv_message_string TYPE string.
 DATA i_iv TYPE xstring.
 DATA: lf_bindata TYPE xstring.

 *--------------------------------------------------------------------*
 *
 *--------------------------------------------------------------------* 
 * ejemplo: archivo JSON o XML
 PARAMETERS gf_xfile TYPE string LOWER CASE.
 
 *--------------------------------------------------------------------*
 AT SELECTION-SCREEN ON VALUE-REQUEST FOR gf_xfile.
 *--------------------------------------------------------------------*
   DATA: window_title TYPE string.
 
   window_title = 'Archivo de entrada'.
   cl_secxml_helper=>file_f4(
     EXPORTING window_title = window_title
     IMPORTING filename = gf_xfile ).
 
 *--------------------------------------------------------------------*
 START-OF-SELECTION.
 *--------------------------------------------------------------------*
 
 *--------------------------------------------------------------------*
 * read xml data
 *--------------------------------------------------------------------*
   IF gf_xfile IS NOT INITIAL.
     cl_secxml_helper=>upload_file(
        EXPORTING filename = gf_xfile
        IMPORTING bindata = lf_bindata ).
   ENDIF.
 
   blocksize = 16.
   keysize   = 32.
   ctroffset = 12.
   emptyiv   = '00000000000000000000000000000000'.
 
   i_iv = emptyiv.
   l_key = '12345678901234567890123456789012'.
   l_key_x = cl_abap_hmac=>string_to_xstring( l_key ).
 
   IF lf_bindata IS INITIAL.
     l_plaintext = 'Texto a encriptar'.
     l_plaintext_x = cl_abap_hmac=>string_to_xstring( l_plaintext ).
   ELSE.
     MOVE lf_bindata TO l_plaintext_x.
   ENDIF.
 
   iv = i_iv.
   key = l_key_x.
   input = l_plaintext_x.
 
   IF xstrlen( iv ) NE blocksize OR xstrlen( key ) NE keysize.
     WRITE:/ 'error en llave o IV'.
     RETURN.
   ENDIF.
 
   rest = xstrlen( input ).
   IF rest < 1.
     RETURN. "nothing to encrypt
   ENDIF.
 
 *--------------------------------------------------------------------*
 * encrypt
 *--------------------------------------------------------------------*
   CALL METHOD cl_sec_sxml_writer=>encrypt_iv(
     EXPORTING
       plaintext  = input
       key        = key
       iv         = iv
       algorithm  = cl_sec_sxml_writer=>co_aes256_algorithm_pem
     IMPORTING
       ciphertext = cipher ).
 
 * padding
   lr_xstring = cipher+blocksize.
 
 *--------------------------------------------------------------------*
 * codificar archivo encriptado en BASE64
 *--------------------------------------------------------------------*
   PERFORM encode_base_64x USING lr_xstring CHANGING l_base64.
 
 *--------------------------------------------------------------------*
 * decrypt message
 *--------------------------------------------------------------------*
   cl_sec_sxml_writer=>decrypt(
     EXPORTING
       ciphertext = cipher
       key =        l_key_x
       algorithm =  cl_sec_sxml_writer=>co_aes256_algorithm_pem
     IMPORTING
       plaintext = lv_message_decrypted ).
 
   " convert xstring to string for output
   cl_abap_conv_in_ce=>create( input = lv_message_decrypted )->read( IMPORTING data = lv_message_string ).
 
   " output secret message
   WRITE lv_message_string.
 
 *----------------------------------------------------------------------*
 *       FORM .......
 *----------------------------------------------------------------------*
 *       text
 *----------------------------------------------------------------------*
 *  -->  p1        text
 *  <--  p2        text
 *----------------------------------------------------------------------*
 FORM encode_base_64x USING p_xstring TYPE xstring
                   CHANGING p_string_base64 TYPE string.
   DATA: l_http_utility TYPE REF TO cl_http_utility.
   DATA: l_string TYPE string.
 
   CREATE OBJECT l_http_utility.
 
   CALL METHOD l_http_utility->encode_x_base64
     EXPORTING
       unencoded = p_xstring
     RECEIVING
       encoded   = p_string_base64.
 ENDFORM.