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:
- Testing cases of ZCL_AES_UTILITY, including encryption mode ECB, CBC, CFB, OFB, CTR, Testing of PCBC is not included yet.
- Testing Data is from SP 800-38A, Recommendation for Block Cipher Modes of Operation: Methods and Techniques | CSRC
- Testing cases of No padding and PKCS #7 padding, but only in ECB, CBC and CTR mode.
*----------------------------------------------------------------------*
* 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.