用于SAP ABAP AES Rijndael 加密、解密的 ABAP 实用程序

发布于:2024-10-12 ⋅ 阅读:(4) ⋅ 点赞:(0)

AES algorithm implementation by ABAP

ABAP Utilities for AES encryption, decryption under MIT License.

Actual Implementation is done by the more generic Rijndael way, and AES is treated as a special case.

Supporting:

  • Encryption mode: ECB, CBC, PCBC, CFB, OFB, CTR.
  • Padding standard: None, PKCS #5, PKCS #7. (Please use PKCS #7, No Padding and PKCS #5 do not work well with AES, unless you know clearly what they are doing.)

Please just copy the source code file into ABAP editor (Source Code-Based mode), and activate it. Or install via abapGit.

Classes:

  • ZIF_AES_MODE: Interface for different encryption mode.
  • ZCL_AES_MODE_CBC: CBC mode.
  • ZCL_AES_MODE_CFB: CFB mode.
  • ZCL_AES_MODE_CTR: CTR mode.
  • ZCL_AES_MODE_ECB: ECB mode.
  • ZCL_AES_MODE_OFB: OFB mode.
  • ZCL_AES_MODE_PCBC: PCBC mode.
  • ZCL_BYTE_PADDING_UTILITY: Abstract class for Byte padding utilities, including factory method to get concrete class instances.
  • ZCL_PADDING_UTILITY_NONE: No padding.
  • ZCL_PADDING_UTILITY_PKCS_5: Padding using PKCS #5.
  • ZCL_PADDING_UTILITY_PKCS_7: Padding using PKCS #7.
  • ZCL_RIJNDAEL_UTILITY: implementation of Rijndael, encrypt and decrypt using xstring.
  • ZCL_AES_UTILITY: AES wrapper on ZCL_RIJNDAEL_UTILITY, just need to provide key and data.
  • ZCL_AES_UTILITY_TEST:
*----------------------------------------------------------------------*
*       CLASS ZCL_AES_MODE_CBC DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS zcl_aes_mode_cbc DEFINITION
  PUBLIC
  CREATE PUBLIC .

  PUBLIC SECTION.

    INTERFACES zif_aes_mode .
  PROTECTED SECTION.
  PRIVATE SECTION.
ENDCLASS.

CLASS ZCL_AES_MODE_CBC IMPLEMENTATION.


  METHOD zif_aes_mode~decrypt_raw16_table.
    DATA: converter_block      TYPE xstring,
          origin_plain_block   TYPE xstring,
          working_plain_block  TYPE xstring,
          working_cipher_block TYPE xstring.

    FIELD-SYMBOLS:  <raw16>       TYPE zif_aes_mode=>ty_raw16.


    CLEAR et_data.

    converter_block = i_initialization_vector.

    LOOP AT it_data INTO working_cipher_block.
      working_plain_block = origin_plain_block BIT-XOR converter_block.

      io_rijndael->decrypt_xstring(
        EXPORTING
          i_data  = working_cipher_block
          i_key   = i_key
        IMPORTING
          e_data  = working_plain_block ).

      origin_plain_block = working_plain_block BIT-XOR converter_block.

      APPEND INITIAL LINE TO et_data ASSIGNING <raw16>.
      <raw16> = origin_plain_block.

      converter_block = working_cipher_block.
    ENDLOOP.

  ENDMETHOD.                    "zif_aes_mode~decrypt_raw16_table


  METHOD zif_aes_mode~encrypt_raw16_table.
    DATA: converter_block      TYPE xstring,
          origin_plain_block   TYPE xstring,
          working_plain_block  TYPE xstring,
          working_cipher_block TYPE xstring.

    FIELD-SYMBOLS:  <raw16>       TYPE zif_aes_mode=>ty_raw16.


    CLEAR et_data.

    converter_block = i_initialization_vector.

    LOOP AT it_data INTO origin_plain_block.
      working_plain_block = origin_plain_block BIT-XOR converter_block.

      io_rijndael->encrypt_xstring(
        EXPORTING
          i_data  = working_plain_block
          i_key   = i_key
        IMPORTING
          e_data  = working_cipher_block ).

      APPEND INITIAL LINE TO et_data ASSIGNING <raw16>.
      <raw16> = working_cipher_block.

      converter_block = working_cipher_block.
    ENDLOOP.

  ENDMETHOD.                    "zif_aes_mode~encrypt_raw16_table
ENDCLASS.