ABAP DES加密实现

43 篇文章 5 订阅

目录

一、标准方法(cl_sec_sxml_writer)实现

DES对称加密加密示例

DES对称加密解密示例

3DES加密(Triple DES)

参考

二、openssl命令行实现

实现示例

补充

参考

三、开源代码实现


一、标准方法(cl_sec_sxml_writer)实现

        标准方法中DES加密模式为CBC,填充为pkcs7padding

  • DES对称加密加密示例

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' ).

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

" 偏移量 cbc模式使用
lv_iv_str = '12345678'.
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_tdes_algorithm
      IMPORTING
        ciphertext = lv_en_xstr ).
  CATCH cx_root.
ENDTRY.

" 移除偏移量
lv_en_str =  lv_en_xstr.
IF strlen( lv_en_str ) > 16.
  SHIFT lv_en_str LEFT BY 16 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.

        结果验证

  • DES对称加密解密示例

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 = 'ZEhhKTgGh80ZoQ9stHqNsh4oQeJKTBxy'.
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 = '12345678'.
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字节,如果为Triple DES加密(3DES)key为24字节,转化为十六进制使用
lv_key_str = 'ABCDEFGH'.
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_tdes_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.

        结果验证

  • 3DES加密(Triple DES)

        3DES加密使用三组DES密钥进行DES加密操作;过程中首先使用第一组8字节密钥对明文进行加密操作,然后使用第二组密钥对上一步加密结果进行解密操作,最后使用第三组密钥再对上一步解密结果进行加密操作。如果三组密钥相同或密钥长度仅为8字节,则3DES加密和DES加密一致。上述DES加密示例中调用的方法实际为Triple DES加密,因此只需要将密钥长度改为24位即为3DES加密。

  • 参考

        填充模式

        zeropadding 最后不足8字节部分,填充0

        pkcs5padding 最后不足8字节部分,少n位,填充该n个n值

        pkcs7padding  和pkcs5padding类似,只是字节数为1-255,而不是8

        DES加密模式,填充方式介绍:DES加密原理和作用是什么-电子发烧友网

二、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 = '待加密字符串'.

" 写入 明文
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 = '12345678'.
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 = 'ABCDEFGH'.
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 -des-cbc -in { lv_inputfile } -out { lv_outputfile } -K { lv_key_str } -iv { lv_iv_str }|.
"lv_parameters = |enc -d -des-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 默认zero填充,可以使用cl_sec_sxml_writer=>pkcs7_padding先进行pkcs7填充,在解密的时候根据pkcs规则移除填充即可。

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

cl_sec_sxml_writer=>pkcs7_padding(
  EXPORTING
    blocksize = 8
  CHANGING
    data      = lv_xstr
       ).
 
OPEN DATASET lv_inputfile FOR OUTPUT IN BINARY MODE.
TRANSFER lv_xstr TO lv_inputfile.
CLOSE DATASET lv_inputfile.

        另外使用openssl实现des加密的优点在于不仅限于cbc模式,功能更全面

  • 参考

        openssl TripleDES加密 加密介绍 https://blog.csdn.net/zyhse/article/details/112431921

三、开源代码实现

        参考地址 3DES对称加密算法(ABAP 语言实现版) - 江正军 - 博客园

        加密模式 cbc (源码中好像有ecb模式没有放开)

        偏移量 程序中hardcode '12345678'

        可参考大牛源码开发其它模式的加密

        同理8字节密钥DES,24字节密钥3DES,密钥输入格式为base64字符

https://mp.csdn.net/mp_blog/creation/editor/124831750

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值