SAP ABAP ENCRIPTACION

From SapWiki

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.