ABAP AES加密实现

43 篇文章 5 订阅

目录

一、标准方法(cl_sec_sxml_writer)实现

AES加密示例

AES解密示例

密钥生成

参考

二、openssl命令行实现

实现示例

参考

三、开源代码实现


一、标准方法(cl_sec_sxml_writer)实现

        标准方法中AES加密模式为CBC,填充为pkcs7padding,支持aes128,aes192,aes256

  • AES加密示例

DATA: lv_base64 TYPE string,
      lv_str    TYPE string.

DATA: lv_data      TYPE string,
      lv_data_xstr TYPE xstring,
      lv_key_xstr  TYPE xstring,
      lv_key_str   TYPE string,
      lv_iv_xstr   TYPE xstring,
      lv_iv_str    TYPE string,
      lv_en_xstr   TYPE xstring,
      lv_de_xstr   TYPE xstring,
      lv_de_str    TYPE string,
      lv_en_str    TYPE string.

lv_data = '待加密字符串'.
lv_data_xstr = cl_bcs_convert=>string_to_xstring( iv_string   = lv_data iv_codepage = '4110' ).

" key aes256 32字节 aes192 24字节 aes128 16字节
lv_key_str = 'ABCDEFGHIJKLMNOP'.
lv_key_xstr = cl_bcs_convert=>string_to_xstring( iv_string   = lv_key_str iv_codepage = '4110' ).

" 偏移量 cbc模式使用
lv_iv_str = '1234567890123456'.
lv_iv_xstr = cl_bcs_convert=>string_to_xstring( iv_string   = lv_iv_str iv_codepage = '4110' ).

TRY.
    cl_sec_sxml_writer=>encrypt_iv(
      EXPORTING
        plaintext =  lv_data_xstr
        key       =  lv_key_xstr
        iv        =  lv_iv_xstr
        algorithm =  cl_sec_sxml_writer=>co_aes128_algorithm
      IMPORTING
        ciphertext = lv_en_xstr ).
  CATCH cx_root.
ENDTRY.

" 移除偏移量
lv_en_str =  lv_en_xstr.
IF strlen( lv_en_str ) > 32.
  SHIFT lv_en_str LEFT BY 32 PLACES.
  lv_en_xstr = lv_en_str.
ENDIF.

CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
  EXPORTING
    input  = lv_en_xstr
  IMPORTING
    output = lv_str.

WRITE:/ lv_str.

        结果验证

  • AES解密示例

DATA: lv_base64 TYPE string,
      lv_str    TYPE string.

DATA: lv_data      TYPE string,
      lv_data_xstr TYPE xstring,
      lv_key_xstr  TYPE xstring,
      lv_key_str   TYPE string,
      lv_iv_xstr   TYPE xstring,
      lv_iv_str    TYPE string,
      lv_en_xstr   TYPE xstring,
      lv_de_xstr   TYPE xstring,
      lv_de_str    TYPE string,
      lv_en_str    TYPE string.

lv_base64 = '7pSa8sj9sCWvzgQIMgr/0AtKolaS/K54V3MUCEE0mXg='.
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
  EXPORTING
    input  = lv_base64
*   UNESCAPE       = 'X'
  IMPORTING
    output = lv_en_xstr
  EXCEPTIONS
    failed = 1
    OTHERS = 2.

" 前置8位补位 偏移量
lv_iv_str = '1234567890123456'.
lv_iv_xstr = cl_bcs_convert=>string_to_xstring( iv_string   = lv_iv_str iv_codepage = '4110' ).
lv_en_xstr = lv_iv_xstr && lv_en_xstr.

" DES key 8字节,如果为TDEA加密(3DES)key为24字节,转化为十六进制使用
lv_key_str = 'ABCDEFGHIJKLMNOP'.
lv_key_xstr = cl_bcs_convert=>string_to_xstring( iv_string   = lv_key_str iv_codepage = '4110' ).

TRY.
    cl_sec_sxml_writer=>decrypt(
      EXPORTING
        ciphertext = lv_en_xstr
        key        = lv_key_xstr
         algorithm  = cl_sec_sxml_writer=>co_aes128_algorithm
       IMPORTING
         plaintext  = lv_de_xstr
           ).
  CATCH cx_root.
ENDTRY.

lv_de_str = cl_bcs_convert=>xstring_to_string( iv_xstr = lv_de_xstr iv_cp = '4110' ).

WRITE: / '解密后字符串:', lv_de_str.

         结果验证

  • 密钥生成

lv_key_xstr = cl_sec_sxml_writer=>generate_key( algorithm = cl_sec_sxml_writer=>co_aes128_algorithm ).

        aes256 32字节密钥,aes192 24字节密钥,aes128 16字节密钥

  • 参考

        AES Encryption in ABAPAES Encryption in ABAP | SAP Blogs

        AES 加密文件 File encryption and decryption using ABAP | SAP Blogs

二、openssl命令行实现

  • 实现示例

DATA: lv_output TYPE xstring,
      lv_input  TYPE string.

DATA: lv_base64   TYPE string,
      lv_key_xstr TYPE xstring,
      lv_key_str  TYPE string,
      lv_iv_xstr  TYPE xstring,
      lv_iv_str   TYPE string.

DATA: lv_inputfile  TYPE string,
      lv_outputfile TYPE string.

DATA:lv_parameters    TYPE sxpgcolist-parameters,
     lv_status        TYPE extcmdexex-status,
     lv_exitcode      TYPE extcmdexex-exitcode,
     lt_exec_protocol  TYPE TABLE OF btcxpm.

DATA: timestamp TYPE timestampl,
      str       TYPE string.

GET TIME STAMP FIELD timestamp.
str = timestamp.
REPLACE ALL OCCURRENCES OF '.' IN str WITH ''.
CONDENSE str NO-GAPS.
lv_inputfile  = '/tmp/temp_input'   && '.txt'.
lv_outputfile = '/tmp/temp_output'  && '.txt'.

lv_input = 'AES128待加密字符串'.

" 写入 明文
OPEN DATASET lv_inputfile FOR OUTPUT IN TEXT MODE ENCODING UTF-8.
TRANSFER lv_input TO lv_inputfile.
CLOSE DATASET lv_inputfile.

"  偏移量
lv_iv_str = '1234567890123456'.
lv_iv_str = cl_bcs_convert=>string_to_xstring( iv_string   = lv_iv_str iv_codepage = '4110' ).
lv_iv_str = to_lower( lv_iv_str ).


" DES key
lv_key_str = 'ABCDEFGHIJKLMNOP'.
lv_key_str = cl_bcs_convert=>string_to_xstring( iv_string   = lv_key_str iv_codepage = '4110' ).
lv_key_str = to_lower( lv_key_str ).

lv_parameters = |enc -e -aes-128-cbc -in { lv_inputfile } -out { lv_outputfile } -K { lv_key_str } -iv { lv_iv_str }|.

CALL FUNCTION 'SXPG_COMMAND_EXECUTE'
  EXPORTING
    commandname                   = 'ZRSA'
    additional_parameters         = lv_parameters
    operatingsystem               = sy-opsys
  IMPORTING
    status                        = lv_status
    exitcode                      = lv_exitcode
  TABLES
    exec_protocol                 = lt_exec_protocol
  EXCEPTIONS
    no_permission                 = 1
    command_not_found             = 2
    parameters_too_long           = 3
    security_risk                 = 4
    wrong_check_call_interface    = 5
    program_start_error           = 6
    program_termination_error     = 7
    x_error                       = 8
    parameter_expected            = 9
    too_many_parameters           = 10
    illegal_command               = 11
    wrong_asynchronous_parameters = 12
    cant_enq_tbtco_entry          = 13
    jobcount_generation_error     = 14
    OTHERS                        = 15.

" 读取加密后文件
IF sy-subrc = 0 AND lv_status <> 'E'.
  OPEN DATASET lv_outputfile FOR INPUT IN BINARY MODE.
  READ DATASET lv_outputfile INTO lv_output.
  CLOSE DATASET lv_outputfile.
ENDIF.

" 删除临时文件
DELETE DATASET lv_inputfile  .
DELETE DATASET lv_outputfile .

CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
  EXPORTING
    input  = lv_output
  IMPORTING
    output = lv_base64.

WRITE: / lv_base64.

        结果验证

  • 参考

     openssl 加密实例介绍实战篇-OpenSSL之AES加密算法-CBC模式_百里杨的博客-CSDN博客_aes加密cbc模式https://blog.csdn.net/zyhse/article/details/112282293

三、开源代码实现

        参考git地址 GitHub - Sumu-Ning/AES: ABAP Utilities for AES/Rijndael encryption, decryption

Fireworks  https://mp.csdn.net/mp_blog/creation/editor/124832051

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值