https://blogs.sap.com/2019/08/26/aes-encryption-in-abap/

https://github.com/Sumu-Ning/AES

https://blog.csdn.net/u012232542/article/details/103184183

 

介绍

最近,我们的组织要求对从 SAP 到外部系统的所有数据传输实施加密,以增加额外的安全层。要求是对系统之间共享的信息进行 AES256 加密和 Base64 编码。加密/解密使用在 SAP 中生成并通过系统自动电子邮件共享的公共密钥完成。

用于流程的 SAP 类/功能模块:

  • CL_SEC_SXML_WRITER 用于实现生成 AES 密钥和信息加解密的逻辑。
  • SCMS_BASE64_<EN/DE>CODE_STR FM 用于 Base64 编码/解码信息。

高级流程

以下是我们用于加密/解密的步骤和示例代码。

生成加密密钥

我们使用以下逻辑生成用于加密的密钥,该密钥存储在表中,然后与外部系统共享。

*Sample Code to generate Key:
data: random          type xstring, wa_bench_config type   zhr_bench_config.
  call method cl_sec_sxml_writer=>generate_key
      exporting
        algorithm = cl_sec_sxml_writer=>co_aes256_algorithm
      receiving
        key       = random.
    data(lr_conv_key) = cl_abap_conv_out_ce=>create( ).

    lr_conv_key->write( data = random ).
    e_key = lr_conv_key->get_buffer( ).

 

解密

外部系统发送 AES 加密和 Base64 编码的数据,在 SAP 中,我们使用以下逻辑来解密文本。

 data:  i_key_xstring type xstring, i_iv type xstring.
i_iv = '00000000000000000000000000000000'.
 if i_text is not initial.
      call function 'SCMS_BASE64_DECODE_STR'
        exporting
          input  = i_text
*         UNESCAPE       = 'X'
        importing
          output = i_xstring
*       EXCEPTIONS
*         FAILED = 1
*         OTHERS = 2
        .
      if sy-subrc <> 0.
* Implement suitable error handling here
      endif.

    endif.
    if i_xstring is not initial.
* For CL_SEC_SXML_WRITER to work with external application we need to add 16 bit 
* extra padding before decryption
      concatenate   i_iv(16) i_xstring into i_xstring  in byte mode.
      try.
          cl_sec_sxml_writer=>decrypt(
            exporting
              ciphertext = i_xstring
              key =        i_key_xstring
              algorithm =  cl_sec_sxml_writer=>co_aes256_algorithm_pem
            importing
              plaintext =  data(lv_message_decrypted) ).
          " convert xstring to string for output
          cl_abap_conv_in_ce=>create( input = lv_message_decrypted )->read( importing data = e_text_dec ).
        catch cx_sec_sxml_encrypt_error into data(oref). .
      endtry.
    endif.

加密:

SAP 处理信息并使用以下逻辑发回加密响应:

 data(lr_conv_sec) = cl_abap_conv_out_ce=>create( ).
      lr_conv_sec->write( data = i_text ).
      " encrypt using AES256
      i_xstring = lr_conv_sec->get_buffer( ).
  i_iv = '00000000000000000000000000000000'.

      cl_sec_sxml_writer=>encrypt_iv(
         exporting
           plaintext  = i_xstring
           key        = i_key_xstring
           iv         = i_iv
           algorithm  = cl_sec_sxml_writer=>co_aes256_algorithm_pem
         importing
           ciphertext = data(lv_message)  ).

      data: lr_conv    type ref to cl_abap_conv_in_ce,
            lr_xstring type xstring,
            lr_string  type string.
*Before sending encrypted information to external system, remove the extra 
*16 bit padding from the xstring
      lr_xstring = lv_message+16.


      data: lt_data type tsfixml, l_len type i.
      call function 'SCMS_BASE64_ENCODE_STR'
        exporting
          input  = lr_xstring
        importing
          output = e_text_enc.

    endif.

示例输出:

EXAMPLE:
Text: Test AES@CBC#PKCS$5
Encrypted Text : B8Q1+w5vH9jG3V/ejYg5igeGNgfX6nvqUGrDnogyDdo=
After Decryption : Test AES@CBC#PKCS$5

结论

该博客文章提供了有关如何在 SAP 中加密和解密信息以及如何规划与外部系统的集成的信息。此处的示例代码适用于 AES256/CBC/PKCS5 Padding 算法,但 CL_SEC_SXML_WRITER 类也有其他 AES 加密算法。

请注意,除了加密密钥外,我们还需要共享 16 位十六进制字符串 ('0000000000000000') 的 IV 密钥。

posted on 2021-09-07 18:22  ricoo  阅读(1409)  评论(0编辑  收藏  举报