3DES对称加密算法(ABAP 语言实现版)

时间:2022-06-16 15:11:27

公司人事数据要求在系统间加密传输,而对接系统大部分是Java系统,要在不同的异构系统间能很好的加解密码,想到了标准的对称加密算法DES,因为是标准的算法,网络上存在大量公开用Java的DES算法,JAVA系统无需再写。但SAP里面没有找到DES加密的算法,所以只能在SAP里使用ABAP语言自己实现。在写的过程中要用到Bit位操作,ABAP里也是没有位移的原生操作,所以自己也只能像其他语言那样模拟的位操作,具体实现可以参考这里:ABAP语言实现 左移 <<、无符号右移 >>> 位移操作

本加密算法采用ABAP语言实现,加密出来的内容,能够传输到Java系统进行解密,反之亦然;另外本函数还实现了加密指纹验证,可以用来验证传输过来的内容是否被篡改过。

 

函数输入输出参数:

3DES对称加密算法(ABAP 语言实现版)

3DES对称加密算法(ABAP 语言实现版)

加密:

3DES对称加密算法(ABAP 语言实现版)

解密:

3DES对称加密算法(ABAP 语言实现版)

 

==========================ZHR_3DESENCRYPT==========================

 

FUNCTION zhr_3desencrypt.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  IMPORTING
*"     REFERENCE(INPUT) TYPE  ANY
*"     REFERENCE(DES_KEY) TYPE  ALK_STRING OPTIONAL
*"     REFERENCE(MD5_SIGNATURE) TYPE  ALK_STRING OPTIONAL
*"     REFERENCE(MD5_KEY) TYPE  ALK_STRING OPTIONAL
*"     REFERENCE(MODE) TYPE  I
*"  EXPORTING
*"     REFERENCE(OUTPUT) TYPE  ANY
*"     REFERENCE(TARGET_MD5_SING) TYPE  STRING
*"     REFERENCE(VERIFICATION) TYPE  STRING
*"     REFERENCE(ERR) TYPE  STRING
*"----------------------------------------------------------------------
DATA: src TYPE string.
DATA: target_str TYPE string.
DATA: data TYPE string.
DATA: keyxstr TYPE xstring,keystr TYPE string,datastr TYPE string,dataxstr TYPE xstring.
DATA: l_codepage(4) TYPE n .
DATA: l_encoding(20).
DATA: convout TYPE REF TO cl_abap_conv_out_ce.
DATA: convin TYPE REF TO cl_abap_conv_in_ce.
DATA: encxstr TYPE xstring,encstr TYPE string,decxstr TYPE xstring,decstr TYPE string.
DATA: data_md5_keyx TYPE xstring,data_md5_key TYPE string.
DATA: hash160 TYPE hash160.
DATA oref TYPE REF TO cx_root.
DATA: iv TYPE string VALUE '12345678'.
data = input.
PERFORM init.
CALL FUNCTION 'SCP_CODEPAGE_BY_EXTERNAL_NAME'
EXPORTING
      external_name = 'UTF-8'
IMPORTING
      sap_codepage  = l_codepage.
  l_encoding = l_codepage.
IF des_key IS NOT INITIAL.
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
EXPORTING
input  = des_key
IMPORTING
output = keyxstr.
    keystr = keyxstr.
PERFORM get_keys USING keystr.
ENDIF.
IF mode = 0."加密
    convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
    convout->write( data = data ).
    dataxstr =  convout->get_buffer( ).
    datastr = dataxstr.
IF input IS NOT INITIAL AND des_key IS NOT INITIAL.
"CBC/PKCS5Padding
PERFORM 3des USING datastr 1 1 iv 1 CHANGING encstr.
      encxstr = encstr.
CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
EXPORTING
input  = encxstr
IMPORTING
output = target_str.
output = target_str.
ENDIF.
IF input IS NOT INITIAL AND md5_key IS NOT INITIAL.
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
EXPORTING
input  = md5_key
IMPORTING
output = keyxstr.
      keystr = keyxstr.
CONCATENATE datastr keystr INTO data_md5_key SEPARATED BY `` RESPECTING BLANKS.
      data_md5_keyx = data_md5_key.
CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
EXPORTING
          alg  = 'MD5'
data = data_md5_keyx
IMPORTING
          hash = hash160.
      target_md5_sing = hash160.
ENDIF.
ELSE."解密
IF des_key IS NOT INITIAL.
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
EXPORTING
input  = data
IMPORTING
output = dataxstr.
      datastr = dataxstr.
PERFORM 3des USING datastr 0 1 iv 1 CHANGING decstr.
      decxstr = decstr.
TRY .
          convin = cl_abap_conv_in_ce=>create( encoding = l_encoding input = decxstr ).
CALL METHOD convin->read
IMPORTING
data = target_str.
output = target_str.
CATCH cx_root INTO oref.
CLEAR: target_str,output.
          err = 'UTF-8解码出错!(密钥错误?码流被篡改过?)'.
EXIT.
ENDTRY.
ENDIF.
IF md5_signature IS NOT INITIAL AND md5_key IS NOT INITIAL.
CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
EXPORTING
input  = md5_key
IMPORTING
output = keyxstr.
      keystr = keyxstr.
IF des_key IS NOT INITIAL.
CONCATENATE decstr keystr INTO data_md5_key SEPARATED BY ``.
ELSE.
        convout = cl_abap_conv_out_ce=>create( encoding = l_encoding ).
        convout->write( data = data ).
        dataxstr =  convout->get_buffer( ).
        datastr = dataxstr.
CONCATENATE datastr keystr INTO data_md5_key SEPARATED BY ``.
ENDIF.
      data_md5_keyx = data_md5_key.
CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
EXPORTING
          alg  = 'MD5'
data = data_md5_keyx
IMPORTING
          hash = hash160.
IF hash160 = md5_signature .
        verification = 'T'.
ELSE.
        verification = 'F'.
ENDIF.
ENDIF.
ENDIF.
ENDFUNCTION.

 

==========================ZHR_3DESENCRYPT==========================

 

==========================LZHR3DESTOP==========================

FUNCTION-POOL zhr3des.                      "MESSAGE-ID ..
DATA: keys TYPE TABLE OF i WITH HEADER LINE.
DATA: BEGIN OF index_map OCCURS 0,
  index_inner TYPE i,
index TYPE i,
END OF  index_map .
DATA: BEGIN OF exp_map OCCURS 0,
  power TYPE i,
  multiplier TYPE i,
END OF  exp_map.

==========================LZHR3DESTOP==========================

==========================LZHR3DESF00==========================

*&---------------------------------------------------------------------*
*&  包括                LZHR3DESF00
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*

*&      Form  int2binary
*&---------------------------------------------------------------------*
*       整型转二进制
*----------------------------------------------------------------------*
*      -->I          text
*      -->C32        text
*----------------------------------------------------------------------*
FORM int2binary USING i TYPE i c32 TYPE c.
DATA: i2 TYPE i.
  i2 = i.
FIELD-SYMBOLS <x> TYPE x.
ASSIGN i2 TO <x> CASTING.
PERFORM x4reverse USING <x>.
DATA: hex(8).
  hex = <x>.
DATA: c4(4),index TYPE i VALUE 0.
DO 8 TIMES.
PERFORM hex2binary USING hex+index(1) c4.
CONCATENATE c32 c4 INTO c32 SEPARATED BY ``.
index = index + 1.
ENDDO.
ENDFORM.                                                    "hex2binary
*&---------------------------------------------------------------------*
*&      Form  c2int
*&---------------------------------------------------------------------*
*       字符转整型
*----------------------------------------------------------------------*
*      -->C1         text
*      -->I          text
*----------------------------------------------------------------------*
FORM c2int USING c1 TYPE c i TYPE i.
FIELD-SYMBOLS <c1> TYPE x.
FIELD-SYMBOLS: <i> TYPE x.
ASSIGN c1 TO <c1> CASTING.
ASSIGN i TO <i> CASTING.
  <i> = <c1>.
ENDFORM.                                                    "c2int
*&---------------------------------------------------------------------*
*&      Form  int2c
*&---------------------------------------------------------------------*
*       整型转字符
*----------------------------------------------------------------------*
*      -->I          text
*      -->C1         text
*----------------------------------------------------------------------*
FORM int2c USING i TYPE i c1 TYPE c.
FIELD-SYMBOLS: <c1> TYPE x.
FIELD-SYMBOLS: <i> TYPE x.
ASSIGN c1 TO <c1> CASTING.
ASSIGN i TO <i> CASTING.
  <c1> = <i>.
ENDFORM.                                                    "c2binary
*&---------------------------------------------------------------------*
*&      Form  x4reverse
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->X4         text
*----------------------------------------------------------------------*
FORM x4reverse USING x4 TYPE x.
DATA: x TYPE x.
x = x4+3(1).
  x4+3(1) = x4+0(1).
  x4+0(1) = x.
x = x4+2(1).
  x4+2(1) = x4+1(1).
  x4+1(1) = x.
ENDFORM.                                                    "x4reverse
*&---------------------------------------------------------------------*
*&      Form  hex2binary
*&---------------------------------------------------------------------*
*       十六进转二进制
*----------------------------------------------------------------------*
*      -->C1         text
*      -->C4         text
*----------------------------------------------------------------------*
FORM hex2binary USING c1 TYPE c c4 TYPE c.
CASE c1.
WHEN '0'.
      c4 = '0000'.
WHEN '1'.
      c4 = '0001'.
WHEN '2'.
      c4 = '0010'.
WHEN '3'.
      c4 = '0011'.
WHEN '4'.
      c4 = '0100'.
WHEN '5'.
      c4 = '0101'.
WHEN '6'.
      c4 = '0110'.
WHEN '7'.
      c4 = '0111'.
WHEN '8'.
      c4 = '1000'.
WHEN '9'.
      c4 = '1001'.
WHEN 'A'.
      c4 = '1010'.
WHEN 'B'.
      c4 = '1011'.
WHEN 'C'.
      c4 = '1100'.
WHEN 'D'.
      c4 = '1101'.
WHEN 'E'.
      c4 = '1110'.
WHEN 'F'.
      c4 = '1111'.
ENDCASE.
ENDFORM.                                                    "hex2binary
*&---------------------------------------------------------------------*
*&      Form  lshfit_c
*&---------------------------------------------------------------------*
*       字符左移
*----------------------------------------------------------------------*
*      -->C1         待位移的字符
*      -->PLACES     移几位
*      -->I          位移后的结果
*----------------------------------------------------------------------*
FORM lshfit_c USING c1 TYPE c places TYPE i i TYPE i.
PERFORM c2int USING c1 i.
PERFORM lshfit_i USING i places i.
ENDFORM.                    "lshfit
*&---------------------------------------------------------------------*
*&      Form  rshfit_c
*&---------------------------------------------------------------------*
*       字符右移
*----------------------------------------------------------------------*
*      -->C1         待位移的字符
*      -->PLACES     移几位
*      -->I          位移后的结果
*----------------------------------------------------------------------*
FORM rshfit_c USING c1 TYPE c places TYPE i i TYPE i.
PERFORM c2int USING c1 i.
PERFORM rshfit_i USING i places i.
ENDFORM.                    "rshfit_c

*&---------------------------------------------------------------------*
*&      Form  lshfit_i
*&---------------------------------------------------------------------*
*       整型左移
*----------------------------------------------------------------------*
*      -->I          待位移的数
*      -->PLACES     移几位
*      -->I2         位移后的数
*----------------------------------------------------------------------*
FORM lshfit_i USING i TYPE i places TYPE i i2 TYPE i.
DATA: start1 TYPE i ,start2 TYPE i.
DATA: b TYPE n.
DATA: i3 TYPE i.
FIELD-SYMBOLS: <i3> TYPE x.
FIELD-SYMBOLS: <i> TYPE x.
FIELD-SYMBOLS: <p> TYPE x.
DATA: _31(4) TYPE x,p TYPE i.
  p = places.
IF places < 0.
    _31 = '1F000000'.
ASSIGN p TO <p> CASTING.
    <p> = <p> BIT-AND _31.
ENDIF.
  i2 = i.
ASSIGN i2 TO <i> CASTING.
IF p = 24 OR p = 16 OR p = 8.
    p = p / 8.
SHIFT <i> BY p PLACES RIGHT IN BYTE MODE.
ELSE.
ASSIGN i3 TO <i3> CASTING.
    start1 = 32 - p.
WHILE  start1 >= 1.
READ TABLE index_map INDEX start1.
GET BIT index_map-index OF <i> INTO b.
IF b = 1.
        start2 = start1 + p.
READ TABLE index_map INDEX start2.
SET BIT index_map-index OF <i3> TO b.
ENDIF.
      start1 = start1 - 1.
ENDWHILE.
    <i> = <i3>.
ENDIF.
ENDFORM.                    "lshfit_i
*&---------------------------------------------------------------------*
*&      Form  rshfit_i
*&---------------------------------------------------------------------*
*       整型右移
*----------------------------------------------------------------------*
*      -->I          待位移的数
*      -->PLACES     移几位
*      -->I2         位移后的数
*----------------------------------------------------------------------*
FORM rshfit_i USING i TYPE i places TYPE i i2 TYPE i.
DATA: start1 TYPE i ,start2 TYPE i.
DATA: b TYPE n.
DATA: i3 TYPE i.
FIELD-SYMBOLS: <i3> TYPE x.
FIELD-SYMBOLS: <i> TYPE x.
FIELD-SYMBOLS: <p> TYPE x.
DATA: _31(4) TYPE x,p TYPE i.
DATA multiplier TYPE i.
  p = places.
IF p < 0.
    _31 = '1F000000'.
ASSIGN p TO <p> CASTING.
    <p> = <p> BIT-AND _31.
ENDIF.
  i2 = i.
ASSIGN i2 TO <i> CASTING.
IF p = 24 OR p = 16 OR p = 8.
    p = p / 8.
SHIFT <i> BY p PLACES LEFT IN BYTE MODE.
ELSE.
IF i >= 0 AND p < 31 .
      multiplier = 2 ** p.
      i2 = i DIV multiplier.
ELSE.
ASSIGN i3 TO <i3> CASTING.
      start1 = p + 1.
WHILE  start1 <= 32.
READ TABLE index_map INDEX start1.
GET BIT index_map-index OF <i> INTO b.
IF b = 1.
          start2 = start1 - p.
READ TABLE index_map INDEX start2.
SET BIT index_map-index OF <i3> TO b.
ENDIF.
        start1 = start1 + 1.
ENDWHILE.
      <i> = <i3>.
ENDIF.
ENDIF.
ENDFORM.                    "rshfit_i
*&---------------------------------------------------------------------*
*&      Form  init
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM init .
CLEAR: index_map[].
  index_map-index_inner = 1.
  index_map-INDEX = 8.
APPEND index_map.
  index_map-index_inner = 2.
  index_map-INDEX = 7.
APPEND index_map.
  index_map-index_inner = 3.
  index_map-INDEX = 6.
APPEND index_map.
  index_map-index_inner = 4.
  index_map-INDEX = 5.
APPEND index_map.
  index_map-index_inner = 5.
  index_map-INDEX = 4.
APPEND index_map.
  index_map-index_inner = 6.
  index_map-INDEX = 3.
APPEND index_map.
  index_map-index_inner = 7.
  index_map-INDEX = 2.
APPEND index_map.
  index_map-index_inner = 8.
  index_map-INDEX = 1.
APPEND index_map.
  index_map-index_inner = 9.
  index_map-INDEX = 16.
APPEND index_map.
  index_map-index_inner = 10.
  index_map-INDEX = 15.
APPEND index_map.
  index_map-index_inner = 11.
  index_map-INDEX = 14.
APPEND index_map.
  index_map-index_inner = 12.
  index_map-INDEX = 13.
APPEND index_map.
  index_map-index_inner = 13.
  index_map-INDEX = 12.
APPEND index_map.
  index_map-index_inner = 14.
  index_map-INDEX = 11.
APPEND index_map.
  index_map-index_inner = 15.
  index_map-INDEX = 10.
APPEND index_map.
  index_map-index_inner = 16.
  index_map-INDEX = 9.
APPEND index_map.
  index_map-index_inner = 17.
  index_map-INDEX = 24.
APPEND index_map.
  index_map-index_inner = 18.
  index_map-INDEX = 23.
APPEND index_map.
  index_map-index_inner = 19.
  index_map-INDEX = 22.
APPEND index_map.
  index_map-index_inner = 20.
  index_map-INDEX = 21.
APPEND index_map.
  index_map-index_inner = 21.
  index_map-INDEX = 20.
APPEND index_map.
  index_map-index_inner = 22.
  index_map-INDEX = 19.
APPEND index_map.
  index_map-index_inner = 23.
  index_map-INDEX = 18.
APPEND index_map.
  index_map-index_inner = 24.
  index_map-INDEX = 17.
APPEND index_map.
  index_map-index_inner = 25.
  index_map-INDEX = 32.
APPEND index_map.
  index_map-index_inner = 26.
  index_map-INDEX = 31.
APPEND index_map.
  index_map-index_inner = 27.
  index_map-INDEX = 30.
APPEND index_map.
  index_map-index_inner = 28.
  index_map-INDEX = 29.
APPEND index_map.
  index_map-index_inner = 29.
  index_map-INDEX = 28.
APPEND index_map.
  index_map-index_inner = 30.
  index_map-INDEX = 27.
APPEND index_map.
  index_map-index_inner = 31.
  index_map-INDEX = 26.
APPEND index_map.
  index_map-index_inner = 32.
  index_map-INDEX = 25.
APPEND index_map.
ENDFORM.                    "init
*&---------------------------------------------------------------------*
*&      Form  3des
*&---------------------------------------------------------------------*
*       3DES加解密核心算法
*----------------------------------------------------------------------*
*      -->MESSAGE    输入
*      -->ENCRYPT    1:加密,0:解密
*      -->MODE       1:CBC模式,0:ECB模式
*      -->IV         text
*      -->PADDING    填充模式
*      -->OUTPUT     输出
*----------------------------------------------------------------------*
FORM 3des USING value(message) TYPE string encrypt TYPE n mode TYPE n iv TYPE string padding TYPE n CHANGING output TYPE string.
DATA: c1 TYPE c.
DATA: tmpstr TYPE string VALUE ''.
DATA: index TYPE i VALUE 0.
DATA: msglen TYPE i.
FIELD-SYMBOLS <c1> TYPE x.
ASSIGN c1 TO <c1> CASTING.
  msglen = STRLEN( message ).
"将十六进制字符串转换为普通字符串
WHILE index < msglen.
    <c1> = message+index(2).
CONCATENATE tmpstr c1 INTO tmpstr SEPARATED BY `` RESPECTING BLANKS.
index = index + 2.
ENDWHILE.
message = tmpstr.
DATA: x4(4) TYPE x.
DATA: i TYPE i.
DATA: spfunction1 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '01010400'. i = x4. APPEND i TO spfunction1.
  x4 = '00000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01010404'. i = x4. APPEND i TO spfunction1.
  x4 = '01010004'. i = x4. APPEND i TO spfunction1.
  x4 = '00010404'. i = x4. APPEND i TO spfunction1.
  x4 = '00000004'. i = x4. APPEND i TO spfunction1.
  x4 = '00010000'. i = x4. APPEND i TO spfunction1.
  x4 = '00000400'. i = x4. APPEND i TO spfunction1.
  x4 = '01010400'. i = x4. APPEND i TO spfunction1.
  x4 = '01010404'. i = x4. APPEND i TO spfunction1.
  x4 = '00000400'. i = x4. APPEND i TO spfunction1.
  x4 = '01000404'. i = x4. APPEND i TO spfunction1.
  x4 = '01010004'. i = x4. APPEND i TO spfunction1.
  x4 = '01000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00000004'. i = x4. APPEND i TO spfunction1.
  x4 = '00000404'. i = x4. APPEND i TO spfunction1.
  x4 = '01000400'. i = x4. APPEND i TO spfunction1.
  x4 = '01000400'. i = x4. APPEND i TO spfunction1.
  x4 = '00010400'. i = x4. APPEND i TO spfunction1.
  x4 = '00010400'. i = x4. APPEND i TO spfunction1.
  x4 = '01010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01000404'. i = x4. APPEND i TO spfunction1.
  x4 = '00010004'. i = x4. APPEND i TO spfunction1.
  x4 = '01000004'. i = x4. APPEND i TO spfunction1.
  x4 = '01000004'. i = x4. APPEND i TO spfunction1.
  x4 = '00010004'. i = x4. APPEND i TO spfunction1.
  x4 = '00000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00000404'. i = x4. APPEND i TO spfunction1.
  x4 = '00010404'. i = x4. APPEND i TO spfunction1.
  x4 = '01000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01010404'. i = x4. APPEND i TO spfunction1.
  x4 = '00000004'. i = x4. APPEND i TO spfunction1.
  x4 = '01010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01010400'. i = x4. APPEND i TO spfunction1.
  x4 = '01000000'. i = x4. APPEND i TO spfunction1.
  x4 = '01000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00000400'. i = x4. APPEND i TO spfunction1.
  x4 = '01010004'. i = x4. APPEND i TO spfunction1.
  x4 = '00010000'. i = x4. APPEND i TO spfunction1.
  x4 = '00010400'. i = x4. APPEND i TO spfunction1.
  x4 = '01000004'. i = x4. APPEND i TO spfunction1.
  x4 = '00000400'. i = x4. APPEND i TO spfunction1.
  x4 = '00000004'. i = x4. APPEND i TO spfunction1.
  x4 = '01000404'. i = x4. APPEND i TO spfunction1.
  x4 = '00010404'. i = x4. APPEND i TO spfunction1.
  x4 = '01010404'. i = x4. APPEND i TO spfunction1.
  x4 = '00010004'. i = x4. APPEND i TO spfunction1.
  x4 = '01010000'. i = x4. APPEND i TO spfunction1.
  x4 = '01000404'. i = x4. APPEND i TO spfunction1.
  x4 = '01000004'. i = x4. APPEND i TO spfunction1.
  x4 = '00000404'. i = x4. APPEND i TO spfunction1.
  x4 = '00010404'. i = x4. APPEND i TO spfunction1.
  x4 = '01010400'. i = x4. APPEND i TO spfunction1.
  x4 = '00000404'. i = x4. APPEND i TO spfunction1.
  x4 = '01000400'. i = x4. APPEND i TO spfunction1.
  x4 = '01000400'. i = x4. APPEND i TO spfunction1.
  x4 = '00000000'. i = x4. APPEND i TO spfunction1.
  x4 = '00010004'. i = x4. APPEND i TO spfunction1.
  x4 = '00010400'. i = x4. APPEND i TO spfunction1.
  x4 = '00000000'. i = x4. APPEND i TO spfunction1.
  x4 = '01010004'. i = x4. APPEND i TO spfunction1.
DATA: spfunction2 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '80108020'. i = x4. APPEND i TO spfunction2.
  x4 = '80008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00108020'. i = x4. APPEND i TO spfunction2.
  x4 = '00100000'. i = x4. APPEND i TO spfunction2.
  x4 = '00000020'. i = x4. APPEND i TO spfunction2.
  x4 = '80100020'. i = x4. APPEND i TO spfunction2.
  x4 = '80008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80000020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108000'. i = x4. APPEND i TO spfunction2.
  x4 = '80000000'. i = x4. APPEND i TO spfunction2.
  x4 = '80008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00100000'. i = x4. APPEND i TO spfunction2.
  x4 = '00000020'. i = x4. APPEND i TO spfunction2.
  x4 = '80100020'. i = x4. APPEND i TO spfunction2.
  x4 = '00108000'. i = x4. APPEND i TO spfunction2.
  x4 = '00100020'. i = x4. APPEND i TO spfunction2.
  x4 = '80008020'. i = x4. APPEND i TO spfunction2.
  x4 = '00000000'. i = x4. APPEND i TO spfunction2.
  x4 = '80000000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00108020'. i = x4. APPEND i TO spfunction2.
  x4 = '80100000'. i = x4. APPEND i TO spfunction2.
  x4 = '00100020'. i = x4. APPEND i TO spfunction2.
  x4 = '80000020'. i = x4. APPEND i TO spfunction2.
  x4 = '00000000'. i = x4. APPEND i TO spfunction2.
  x4 = '00108000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108000'. i = x4. APPEND i TO spfunction2.
  x4 = '80100000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008020'. i = x4. APPEND i TO spfunction2.
  x4 = '00000000'. i = x4. APPEND i TO spfunction2.
  x4 = '00108020'. i = x4. APPEND i TO spfunction2.
  x4 = '80100020'. i = x4. APPEND i TO spfunction2.
  x4 = '00100000'. i = x4. APPEND i TO spfunction2.
  x4 = '80008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80100000'. i = x4. APPEND i TO spfunction2.
  x4 = '80108000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008000'. i = x4. APPEND i TO spfunction2.
  x4 = '80100000'. i = x4. APPEND i TO spfunction2.
  x4 = '80008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00000020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108020'. i = x4. APPEND i TO spfunction2.
  x4 = '00108020'. i = x4. APPEND i TO spfunction2.
  x4 = '00000020'. i = x4. APPEND i TO spfunction2.
  x4 = '00008000'. i = x4. APPEND i TO spfunction2.
  x4 = '80000000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108000'. i = x4. APPEND i TO spfunction2.
  x4 = '00100000'. i = x4. APPEND i TO spfunction2.
  x4 = '80000020'. i = x4. APPEND i TO spfunction2.
  x4 = '00100020'. i = x4. APPEND i TO spfunction2.
  x4 = '80008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80000020'. i = x4. APPEND i TO spfunction2.
  x4 = '00100020'. i = x4. APPEND i TO spfunction2.
  x4 = '00108000'. i = x4. APPEND i TO spfunction2.
  x4 = '00000000'. i = x4. APPEND i TO spfunction2.
  x4 = '80008000'. i = x4. APPEND i TO spfunction2.
  x4 = '00008020'. i = x4. APPEND i TO spfunction2.
  x4 = '80000000'. i = x4. APPEND i TO spfunction2.
  x4 = '80100020'. i = x4. APPEND i TO spfunction2.
  x4 = '80108020'. i = x4. APPEND i TO spfunction2.
  x4 = '00108000'. i = x4. APPEND i TO spfunction2.
DATA: spfunction3 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000208'. i = x4. APPEND i TO spfunction3.
  x4 = '08020200'. i = x4. APPEND i TO spfunction3.
  x4 = '00000000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020008'. i = x4. APPEND i TO spfunction3.
  x4 = '08000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00000000'. i = x4. APPEND i TO spfunction3.
  x4 = '00020208'. i = x4. APPEND i TO spfunction3.
  x4 = '08000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00020008'. i = x4. APPEND i TO spfunction3.
  x4 = '08000008'. i = x4. APPEND i TO spfunction3.
  x4 = '08000008'. i = x4. APPEND i TO spfunction3.
  x4 = '00020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020208'. i = x4. APPEND i TO spfunction3.
  x4 = '00020008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020000'. i = x4. APPEND i TO spfunction3.
  x4 = '00000208'. i = x4. APPEND i TO spfunction3.
  x4 = '08000000'. i = x4. APPEND i TO spfunction3.
  x4 = '00000008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020200'. i = x4. APPEND i TO spfunction3.
  x4 = '00000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00020200'. i = x4. APPEND i TO spfunction3.
  x4 = '08020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020008'. i = x4. APPEND i TO spfunction3.
  x4 = '00020208'. i = x4. APPEND i TO spfunction3.
  x4 = '08000208'. i = x4. APPEND i TO spfunction3.
  x4 = '00020200'. i = x4. APPEND i TO spfunction3.
  x4 = '00020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08000208'. i = x4. APPEND i TO spfunction3.
  x4 = '00000008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020208'. i = x4. APPEND i TO spfunction3.
  x4 = '00000200'. i = x4. APPEND i TO spfunction3.
  x4 = '08000000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020200'. i = x4. APPEND i TO spfunction3.
  x4 = '08000000'. i = x4. APPEND i TO spfunction3.
  x4 = '00020008'. i = x4. APPEND i TO spfunction3.
  x4 = '00000208'. i = x4. APPEND i TO spfunction3.
  x4 = '00020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020200'. i = x4. APPEND i TO spfunction3.
  x4 = '08000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00000000'. i = x4. APPEND i TO spfunction3.
  x4 = '00000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00020008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020208'. i = x4. APPEND i TO spfunction3.
  x4 = '08000200'. i = x4. APPEND i TO spfunction3.
  x4 = '08000008'. i = x4. APPEND i TO spfunction3.
  x4 = '00000200'. i = x4. APPEND i TO spfunction3.
  x4 = '00000000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020008'. i = x4. APPEND i TO spfunction3.
  x4 = '08000208'. i = x4. APPEND i TO spfunction3.
  x4 = '00020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08000000'. i = x4. APPEND i TO spfunction3.
  x4 = '08020208'. i = x4. APPEND i TO spfunction3.
  x4 = '00000008'. i = x4. APPEND i TO spfunction3.
  x4 = '00020208'. i = x4. APPEND i TO spfunction3.
  x4 = '00020200'. i = x4. APPEND i TO spfunction3.
  x4 = '08000008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020000'. i = x4. APPEND i TO spfunction3.
  x4 = '08000208'. i = x4. APPEND i TO spfunction3.
  x4 = '00000208'. i = x4. APPEND i TO spfunction3.
  x4 = '08020000'. i = x4. APPEND i TO spfunction3.
  x4 = '00020208'. i = x4. APPEND i TO spfunction3.
  x4 = '00000008'. i = x4. APPEND i TO spfunction3.
  x4 = '08020008'. i = x4. APPEND i TO spfunction3.
  x4 = '00020200'. i = x4. APPEND i TO spfunction3.
DATA: spfunction4 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00802001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002081'. i = x4. APPEND i TO spfunction4.
  x4 = '00002081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000080'. i = x4. APPEND i TO spfunction4.
  x4 = '00802080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800081'. i = x4. APPEND i TO spfunction4.
  x4 = '00800001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002001'. i = x4. APPEND i TO spfunction4.
  x4 = '00000000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000000'. i = x4. APPEND i TO spfunction4.
  x4 = '00800080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800001'. i = x4. APPEND i TO spfunction4.
  x4 = '00000001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002000'. i = x4. APPEND i TO spfunction4.
  x4 = '00800000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802001'. i = x4. APPEND i TO spfunction4.
  x4 = '00000080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800000'. i = x4. APPEND i TO spfunction4.
  x4 = '00002001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800080'. i = x4. APPEND i TO spfunction4.
  x4 = '00002000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802080'. i = x4. APPEND i TO spfunction4.
  x4 = '00802081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000081'. i = x4. APPEND i TO spfunction4.
  x4 = '00800080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800001'. i = x4. APPEND i TO spfunction4.
  x4 = '00802000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000000'. i = x4. APPEND i TO spfunction4.
  x4 = '00000000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802000'. i = x4. APPEND i TO spfunction4.
  x4 = '00002080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000001'. i = x4. APPEND i TO spfunction4.
  x4 = '00802001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002081'. i = x4. APPEND i TO spfunction4.
  x4 = '00002081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000080'. i = x4. APPEND i TO spfunction4.
  x4 = '00802081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000081'. i = x4. APPEND i TO spfunction4.
  x4 = '00000001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002000'. i = x4. APPEND i TO spfunction4.
  x4 = '00800001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002001'. i = x4. APPEND i TO spfunction4.
  x4 = '00802080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800081'. i = x4. APPEND i TO spfunction4.
  x4 = '00002001'. i = x4. APPEND i TO spfunction4.
  x4 = '00002080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802001'. i = x4. APPEND i TO spfunction4.
  x4 = '00000080'. i = x4. APPEND i TO spfunction4.
  x4 = '00800000'. i = x4. APPEND i TO spfunction4.
  x4 = '00002000'. i = x4. APPEND i TO spfunction4.
  x4 = '00802080'. i = x4. APPEND i TO spfunction4.
DATA: spfunction5 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000100'. i = x4. APPEND i TO spfunction5.
  x4 = '02080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02080000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000100'. i = x4. APPEND i TO spfunction5.
  x4 = '00080000'. i = x4. APPEND i TO spfunction5.
  x4 = '00000100'. i = x4. APPEND i TO spfunction5.
  x4 = '40000000'. i = x4. APPEND i TO spfunction5.
  x4 = '02080000'. i = x4. APPEND i TO spfunction5.
  x4 = '40080100'. i = x4. APPEND i TO spfunction5.
  x4 = '00080000'. i = x4. APPEND i TO spfunction5.
  x4 = '02000100'. i = x4. APPEND i TO spfunction5.
  x4 = '40080100'. i = x4. APPEND i TO spfunction5.
  x4 = '42000100'. i = x4. APPEND i TO spfunction5.
  x4 = '42080000'. i = x4. APPEND i TO spfunction5.
  x4 = '00080100'. i = x4. APPEND i TO spfunction5.
  x4 = '40000000'. i = x4. APPEND i TO spfunction5.
  x4 = '02000000'. i = x4. APPEND i TO spfunction5.
  x4 = '40080000'. i = x4. APPEND i TO spfunction5.
  x4 = '40080000'. i = x4. APPEND i TO spfunction5.
  x4 = '00000000'. i = x4. APPEND i TO spfunction5.
  x4 = '40000100'. i = x4. APPEND i TO spfunction5.
  x4 = '42080100'. i = x4. APPEND i TO spfunction5.
  x4 = '42080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000100'. i = x4. APPEND i TO spfunction5.
  x4 = '42080000'. i = x4. APPEND i TO spfunction5.
  x4 = '40000100'. i = x4. APPEND i TO spfunction5.
  x4 = '00000000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000000'. i = x4. APPEND i TO spfunction5.
  x4 = '02080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000000'. i = x4. APPEND i TO spfunction5.
  x4 = '00080100'. i = x4. APPEND i TO spfunction5.
  x4 = '00080000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000100'. i = x4. APPEND i TO spfunction5.
  x4 = '00000100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000000'. i = x4. APPEND i TO spfunction5.
  x4 = '40000000'. i = x4. APPEND i TO spfunction5.
  x4 = '02080000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000100'. i = x4. APPEND i TO spfunction5.
  x4 = '40080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000100'. i = x4. APPEND i TO spfunction5.
  x4 = '40000000'. i = x4. APPEND i TO spfunction5.
  x4 = '42080000'. i = x4. APPEND i TO spfunction5.
  x4 = '02080100'. i = x4. APPEND i TO spfunction5.
  x4 = '40080100'. i = x4. APPEND i TO spfunction5.
  x4 = '00000100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000000'. i = x4. APPEND i TO spfunction5.
  x4 = '42080000'. i = x4. APPEND i TO spfunction5.
  x4 = '42080100'. i = x4. APPEND i TO spfunction5.
  x4 = '00080100'. i = x4. APPEND i TO spfunction5.
  x4 = '42000000'. i = x4. APPEND i TO spfunction5.
  x4 = '42080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02080000'. i = x4. APPEND i TO spfunction5.
  x4 = '00000000'. i = x4. APPEND i TO spfunction5.
  x4 = '40080000'. i = x4. APPEND i TO spfunction5.
  x4 = '42000000'. i = x4. APPEND i TO spfunction5.
  x4 = '00080100'. i = x4. APPEND i TO spfunction5.
  x4 = '02000100'. i = x4. APPEND i TO spfunction5.
  x4 = '40000100'. i = x4. APPEND i TO spfunction5.
  x4 = '00080000'. i = x4. APPEND i TO spfunction5.
  x4 = '00000000'. i = x4. APPEND i TO spfunction5.
  x4 = '40080000'. i = x4. APPEND i TO spfunction5.
  x4 = '02080100'. i = x4. APPEND i TO spfunction5.
  x4 = '40000100'. i = x4. APPEND i TO spfunction5.
DATA: spfunction6 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '20000010'. i = x4. APPEND i TO spfunction6.
  x4 = '20400000'. i = x4. APPEND i TO spfunction6.
  x4 = '00004000'. i = x4. APPEND i TO spfunction6.
  x4 = '20404010'. i = x4. APPEND i TO spfunction6.
  x4 = '20400000'. i = x4. APPEND i TO spfunction6.
  x4 = '00000010'. i = x4. APPEND i TO spfunction6.
  x4 = '20404010'. i = x4. APPEND i TO spfunction6.
  x4 = '00400000'. i = x4. APPEND i TO spfunction6.
  x4 = '20004000'. i = x4. APPEND i TO spfunction6.
  x4 = '00404010'. i = x4. APPEND i TO spfunction6.
  x4 = '00400000'. i = x4. APPEND i TO spfunction6.
  x4 = '20000010'. i = x4. APPEND i TO spfunction6.
  x4 = '00400010'. i = x4. APPEND i TO spfunction6.
  x4 = '20004000'. i = x4. APPEND i TO spfunction6.
  x4 = '20000000'. i = x4. APPEND i TO spfunction6.
  x4 = '00004010'. i = x4. APPEND i TO spfunction6.
  x4 = '00000000'. i = x4. APPEND i TO spfunction6.
  x4 = '00400010'. i = x4. APPEND i TO spfunction6.
  x4 = '20004010'. i = x4. APPEND i TO spfunction6.
  x4 = '00004000'. i = x4. APPEND i TO spfunction6.
  x4 = '00404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20004010'. i = x4. APPEND i TO spfunction6.
  x4 = '00000010'. i = x4. APPEND i TO spfunction6.
  x4 = '20400010'. i = x4. APPEND i TO spfunction6.
  x4 = '20400010'. i = x4. APPEND i TO spfunction6.
  x4 = '00000000'. i = x4. APPEND i TO spfunction6.
  x4 = '00404010'. i = x4. APPEND i TO spfunction6.
  x4 = '20404000'. i = x4. APPEND i TO spfunction6.
  x4 = '00004010'. i = x4. APPEND i TO spfunction6.
  x4 = '00404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20000000'. i = x4. APPEND i TO spfunction6.
  x4 = '20004000'. i = x4. APPEND i TO spfunction6.
  x4 = '00000010'. i = x4. APPEND i TO spfunction6.
  x4 = '20400010'. i = x4. APPEND i TO spfunction6.
  x4 = '00404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20404010'. i = x4. APPEND i TO spfunction6.
  x4 = '00400000'. i = x4. APPEND i TO spfunction6.
  x4 = '00004010'. i = x4. APPEND i TO spfunction6.
  x4 = '20000010'. i = x4. APPEND i TO spfunction6.
  x4 = '00400000'. i = x4. APPEND i TO spfunction6.
  x4 = '20004000'. i = x4. APPEND i TO spfunction6.
  x4 = '20000000'. i = x4. APPEND i TO spfunction6.
  x4 = '00004010'. i = x4. APPEND i TO spfunction6.
  x4 = '20000010'. i = x4. APPEND i TO spfunction6.
  x4 = '20404010'. i = x4. APPEND i TO spfunction6.
  x4 = '00404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20400000'. i = x4. APPEND i TO spfunction6.
  x4 = '00404010'. i = x4. APPEND i TO spfunction6.
  x4 = '20404000'. i = x4. APPEND i TO spfunction6.
  x4 = '00000000'. i = x4. APPEND i TO spfunction6.
  x4 = '20400010'. i = x4. APPEND i TO spfunction6.
  x4 = '00000010'. i = x4. APPEND i TO spfunction6.
  x4 = '00004000'. i = x4. APPEND i TO spfunction6.
  x4 = '20400000'. i = x4. APPEND i TO spfunction6.
  x4 = '00404010'. i = x4. APPEND i TO spfunction6.
  x4 = '00004000'. i = x4. APPEND i TO spfunction6.
  x4 = '00400010'. i = x4. APPEND i TO spfunction6.
  x4 = '20004010'. i = x4. APPEND i TO spfunction6.
  x4 = '00000000'. i = x4. APPEND i TO spfunction6.
  x4 = '20404000'. i = x4. APPEND i TO spfunction6.
  x4 = '20000000'. i = x4. APPEND i TO spfunction6.
  x4 = '00400010'. i = x4. APPEND i TO spfunction6.
  x4 = '20004010'. i = x4. APPEND i TO spfunction6.
DATA: spfunction7 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00200000'. i = x4. APPEND i TO spfunction7.
  x4 = '04200002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000802'. i = x4. APPEND i TO spfunction7.
  x4 = '00000000'. i = x4. APPEND i TO spfunction7.
  x4 = '00000800'. i = x4. APPEND i TO spfunction7.
  x4 = '04000802'. i = x4. APPEND i TO spfunction7.
  x4 = '00200802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200800'. i = x4. APPEND i TO spfunction7.
  x4 = '04200802'. i = x4. APPEND i TO spfunction7.
  x4 = '00200000'. i = x4. APPEND i TO spfunction7.
  x4 = '00000000'. i = x4. APPEND i TO spfunction7.
  x4 = '04000002'. i = x4. APPEND i TO spfunction7.
  x4 = '00000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000000'. i = x4. APPEND i TO spfunction7.
  x4 = '04200002'. i = x4. APPEND i TO spfunction7.
  x4 = '00000802'. i = x4. APPEND i TO spfunction7.
  x4 = '04000800'. i = x4. APPEND i TO spfunction7.
  x4 = '00200802'. i = x4. APPEND i TO spfunction7.
  x4 = '00200002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000800'. i = x4. APPEND i TO spfunction7.
  x4 = '04000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04200000'. i = x4. APPEND i TO spfunction7.
  x4 = '04200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00200002'. i = x4. APPEND i TO spfunction7.
  x4 = '04200000'. i = x4. APPEND i TO spfunction7.
  x4 = '00000800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200802'. i = x4. APPEND i TO spfunction7.
  x4 = '00200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000000'. i = x4. APPEND i TO spfunction7.
  x4 = '00200800'. i = x4. APPEND i TO spfunction7.
  x4 = '04000000'. i = x4. APPEND i TO spfunction7.
  x4 = '00200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00200000'. i = x4. APPEND i TO spfunction7.
  x4 = '04000802'. i = x4. APPEND i TO spfunction7.
  x4 = '04000802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200002'. i = x4. APPEND i TO spfunction7.
  x4 = '04200002'. i = x4. APPEND i TO spfunction7.
  x4 = '00000002'. i = x4. APPEND i TO spfunction7.
  x4 = '00200002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000000'. i = x4. APPEND i TO spfunction7.
  x4 = '04000800'. i = x4. APPEND i TO spfunction7.
  x4 = '00200000'. i = x4. APPEND i TO spfunction7.
  x4 = '04200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000802'. i = x4. APPEND i TO spfunction7.
  x4 = '00200802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000802'. i = x4. APPEND i TO spfunction7.
  x4 = '04000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04200802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200000'. i = x4. APPEND i TO spfunction7.
  x4 = '00200800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000000'. i = x4. APPEND i TO spfunction7.
  x4 = '00000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04200802'. i = x4. APPEND i TO spfunction7.
  x4 = '00000000'. i = x4. APPEND i TO spfunction7.
  x4 = '00200802'. i = x4. APPEND i TO spfunction7.
  x4 = '04200000'. i = x4. APPEND i TO spfunction7.
  x4 = '00000800'. i = x4. APPEND i TO spfunction7.
  x4 = '04000002'. i = x4. APPEND i TO spfunction7.
  x4 = '04000800'. i = x4. APPEND i TO spfunction7.
  x4 = '00000800'. i = x4. APPEND i TO spfunction7.
  x4 = '00200002'. i = x4. APPEND i TO spfunction7.
DATA: spfunction8 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '10001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000000'. i = x4. APPEND i TO spfunction8.
  x4 = '10001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000000'. i = x4. APPEND i TO spfunction8.
  x4 = '00040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00041000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00000000'. i = x4. APPEND i TO spfunction8.
  x4 = '00000000'. i = x4. APPEND i TO spfunction8.
  x4 = '10040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00040000'. i = x4. APPEND i TO spfunction8.
  x4 = '00041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040040'. i = x4. APPEND i TO spfunction8.
  x4 = '00001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00041040'. i = x4. APPEND i TO spfunction8.
  x4 = '10001000'. i = x4. APPEND i TO spfunction8.
  x4 = '00000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000000'. i = x4. APPEND i TO spfunction8.
  x4 = '00040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00000000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000040'. i = x4. APPEND i TO spfunction8.
  x4 = '10040000'. i = x4. APPEND i TO spfunction8.
  x4 = '10001000'. i = x4. APPEND i TO spfunction8.
  x4 = '10001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00000000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041040'. i = x4. APPEND i TO spfunction8.
  x4 = '00041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00041000'. i = x4. APPEND i TO spfunction8.
  x4 = '00001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00001040'. i = x4. APPEND i TO spfunction8.
  x4 = '00040040'. i = x4. APPEND i TO spfunction8.
  x4 = '10000000'. i = x4. APPEND i TO spfunction8.
  x4 = '10041000'. i = x4. APPEND i TO spfunction8.
FIELD-SYMBOLS: <spfunction1> TYPE x,<spfunction2> TYPE x,<spfunction3> TYPE x,<spfunction4> TYPE x,
  <spfunction5> TYPE x,<spfunction6> TYPE x,<spfunction7> TYPE x,<spfunction8> TYPE x.
ASSIGN spfunction1 TO <spfunction1> CASTING.
ASSIGN spfunction2 TO <spfunction2> CASTING.
ASSIGN spfunction3 TO <spfunction3> CASTING.
ASSIGN spfunction4 TO <spfunction4> CASTING.
ASSIGN spfunction5 TO <spfunction5> CASTING.
ASSIGN spfunction6 TO <spfunction6> CASTING.
ASSIGN spfunction7 TO <spfunction7> CASTING.
ASSIGN spfunction8 TO <spfunction8> CASTING.
DATA: m TYPE i VALUE 0, j TYPE i, temp TYPE i, right1 TYPE i, right2 TYPE i, left TYPE i, right TYPE i.
FIELD-SYMBOLS:<left> TYPE x,<right> TYPE x,<temp> TYPE x,<right1> TYPE x,<right2> TYPE x.
ASSIGN temp TO <temp> CASTING.
ASSIGN right1 TO <right1> CASTING.
ASSIGN right2 TO <right2> CASTING.
ASSIGN left TO <left> CASTING.
ASSIGN right TO <right> CASTING.
DATA: cbcleft TYPE i, cbcleft2 TYPE i, cbcright TYPE i, cbcright2 TYPE i.
FIELD-SYMBOLS:<cbcleft> TYPE x,<cbcleft2> TYPE x, <cbcright> TYPE x,<cbcright2> TYPE x.
ASSIGN cbcleft TO <cbcleft> CASTING.
ASSIGN cbcleft2 TO <cbcleft2> CASTING.
ASSIGN cbcright TO <cbcright> CASTING.
ASSIGN cbcright2 TO <cbcright2> CASTING.
DATA: looping TYPE TABLE OF i WITH HEADER LINE.
DATA: endloop TYPE i, loopinc TYPE i.
DATA: len TYPE i.
DATA: chunk TYPE i.
DATA: keylen TYPE i.
DATA: iterations TYPE i.
  len = STRLEN( message ).
DESCRIBE TABLE keys LINES keylen.
IF keylen = 32.
    iterations = 3.
ELSE.
    iterations = 9.
ENDIF.
IF iterations = 3 .
IF encrypt = 1.
APPEND 0 TO looping.
APPEND 32 TO looping.
APPEND 2 TO looping.
ELSE.
APPEND 30 TO looping.
APPEND -2 TO looping.
APPEND -2 TO looping.
ENDIF.
ELSE.
IF encrypt = 1.
APPEND 0 TO looping.
APPEND 32 TO looping.
APPEND 2 TO looping.
APPEND 62 TO looping.
APPEND 30 TO looping.
APPEND -2 TO looping.
APPEND 64 TO looping.
APPEND 96 TO looping.
APPEND 2 TO looping.
ELSE.
APPEND 94 TO looping.
APPEND 62 TO looping.
APPEND -2 TO looping.
APPEND 32 TO looping.
APPEND 64 TO looping.
APPEND 2 TO looping.
APPEND 30 TO looping.
APPEND -2 TO looping.
APPEND -2 TO looping.
ENDIF.
ENDIF.
DATA: x2(2) TYPE x.
DATA: c4(4),c2(2).
IF padding = 2.
CONCATENATE message `        ` INTO message SEPARATED BY ``.
ELSEIF padding = 1."PKCS5 padding
IF encrypt = 1.
      temp = len MOD 8 .
      temp = 8 - temp.
      <c1> = temp.
      c4 = <c1>.
      c2 = c4+0(2).
      c4+0(2) = c4+2(2).
      c4+2(2) = c2.
      x2 = c4.
      <c1> = x2.
DO 8 TIMES.
CONCATENATE message c1 INTO message SEPARATED BY ``.
ENDDO.
IF temp = 8.
        len = len + 8.
ENDIF.
ENDIF.
ELSEIF padding = 0.
    x2 = '00'.
    <c1> = x2.
CONCATENATE message c1 c1 c1 c1 c1 c1 c1 c1  INTO message SEPARATED BY ``.
ENDIF.
DATA: result TYPE string.
DATA: tempresult TYPE string.
DATA: temp1_i TYPE i,temp2_i TYPE i,temp3_i TYPE i,temp4_i TYPE i,temp5_i TYPE i,temp6_i TYPE i,temp7_i TYPE i,temp8_i TYPE i.
FIELD-SYMBOLS: <temp1_i> TYPE x, <temp2_i> TYPE x, <temp3_i> TYPE x, <temp4_i> TYPE x, <temp5_i> TYPE x, <temp6_i> TYPE x, <temp7_i> TYPE x, <temp8_i> TYPE x.
ASSIGN temp1_i TO <temp1_i> CASTING.
ASSIGN temp2_i TO <temp2_i> CASTING.
ASSIGN temp3_i TO <temp3_i> CASTING.
ASSIGN temp4_i TO <temp4_i> CASTING.
ASSIGN temp5_i TO <temp5_i> CASTING.
ASSIGN temp6_i TO <temp6_i> CASTING.
ASSIGN temp7_i TO <temp7_i> CASTING.
ASSIGN temp8_i TO <temp8_i> CASTING.
FIELD-SYMBOLS: <keys> TYPE x.
ASSIGN keys TO <keys> CASTING.
"如果是CBC工作模式时,需初始化IV
IF mode = 1."CBC mode
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 24 temp1_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 16 temp2_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 8 temp3_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM c2int USING c1 temp4_i.
m = m + 1.
    <cbcleft> = <temp1_i> BIT-OR <temp2_i> BIT-OR <temp3_i> BIT-OR <temp4_i>.
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 24 temp1_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 16 temp2_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM lshfit_c USING c1 8 temp3_i.
m = m + 1.
    c1 = iv+m(1).
PERFORM c2int USING c1 temp4_i.
    <cbcright> = <temp1_i> BIT-OR <temp2_i> BIT-OR <temp3_i> BIT-OR <temp4_i>.
m = 0.
ENDIF.
"每8字节(64位)为一个处理单元,共需循环 (message.length + 7)/8 次
WHILE m < len.
"将64位(8字节)message消息块分成左右两部分,每部分32位(4字节)
    c1 = message+m(1).
PERFORM lshfit_c USING c1 24 temp1_i.
m = m + 1.
    c1 = message+m(1).
PERFORM lshfit_c USING c1 16 temp2_i.
m = m + 1.
    c1 = message+m(1).
PERFORM lshfit_c USING c1 8 temp3_i.
m = m + 1.
    c1 = message+m(1).
PERFORM c2int USING c1 temp4_i.
m = m + 1.
    <left> = <temp1_i> BIT-OR <temp2_i> BIT-OR <temp3_i> BIT-OR <temp4_i>.
    c1 = message+m(1).
PERFORM lshfit_c USING c1 24 temp1_i.
m = m + 1.
    c1 = message+m(1).
PERFORM lshfit_c USING c1 16 temp2_i.
m = m + 1.
    c1 = message+m(1).
PERFORM lshfit_c USING c1 8 temp3_i.
m = m + 1.
    c1 = message+m(1).
PERFORM c2int USING c1 temp4_i.
m = m + 1.
    <right> = <temp1_i> BIT-OR <temp2_i> BIT-OR <temp3_i> BIT-OR <temp4_i>.
*==========================
"在CBC模式中,每个明文块先与前一个密文块进行异或后,再进行加密。在这种模式下,每个密文块都依赖于它前面的所有明文块
IF mode = 1.
IF encrypt = 1.
        <left> = <left> BIT-XOR <cbcleft>.
        <right> = <right> BIT-XOR <cbcright>.
ELSE.
        cbcleft2 = cbcleft.
        cbcright2 = cbcright.
        cbcleft = left.
        cbcright = right.
ENDIF.
ENDIF.
*==========================
"每块(64位)根据置换规则表做IP置换(初始置换):目的是将输入的64位数据块按位重新组合
PERFORM rshfit_i USING left 4 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '0F0F0F0F'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 4 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING left 16 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '0000FFFF'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 16 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING right 2 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <left>.
    x4 = '33333333'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 2 temp1_i.
    <right> = <right> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING right 8 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <left>.
    x4 = '00FF00FF'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 8 temp1_i.
    <right> = <right> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING left 1 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '55555555'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 1 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
*==========================
PERFORM lshfit_i USING left 1 temp1_i.
PERFORM rshfit_i USING left 31 temp2_i.
    <left> = <temp1_i> BIT-OR <temp2_i>.
PERFORM lshfit_i USING right 1 temp1_i.
PERFORM rshfit_i USING right 31 temp2_i.
    <right> = <temp1_i> BIT-OR <temp2_i>.
*==========================
    j = 0.
WHILE j < iterations."每块经过3次DES加密
index = j + 2.
*      CLEAR looping.
READ TABLE looping INDEX index.
endloop = looping.
index = j + 3.
*      CLEAR looping.
READ TABLE looping INDEX index.
      loopinc = looping.
index = j + 1.
*      CLEAR looping.
READ TABLE looping INDEX index.
i = looping.
"经过16次循环,每一轮的运算包含扩展置换、S盒置换、P盒置换和两次异或运算,每次使用不同的子密钥
WHILE i <> endloop.
index = i + 1.
*        CLEAR keys.
READ TABLE keys INDEX index.
        <right1> = <right> BIT-XOR <keys>.
PERFORM rshfit_i USING right 4 temp1_i.
PERFORM lshfit_i USING right 28 temp2_i.
        <temp3_i> = <temp1_i> BIT-OR <temp2_i>.
index = i + 2.
*        CLEAR keys.
READ TABLE keys INDEX index.
        <right2> = <temp3_i> BIT-XOR <keys>.
        temp = left.
left = right.
PERFORM rshfit_i USING right1 24 temp1_i.
        x4 = '0000003F'.
        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction2.
READ TABLE spfunction2 INDEX temp3_i.
PERFORM rshfit_i USING right1 16 temp1_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction4.
READ TABLE spfunction4 INDEX temp3_i.
PERFORM rshfit_i USING right1 8 temp1_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction6.
READ TABLE spfunction6 INDEX temp3_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <right1> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction8.
READ TABLE spfunction8 INDEX temp3_i.
PERFORM rshfit_i USING right2 24 temp1_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction1.
READ TABLE spfunction1 INDEX temp3_i.
PERFORM rshfit_i USING right2 16 temp1_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction3.
READ TABLE spfunction3 INDEX temp3_i.
PERFORM rshfit_i USING right2 8 temp1_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction5.
READ TABLE spfunction5 INDEX temp3_i.
*        x4 = '0000003F'.
*        temp2_i = x4.
        <temp3_i> = <right2> BIT-AND <temp2_i>.
        temp3_i = temp3_i + 1.
*        CLEAR spfunction7.
READ TABLE spfunction7 INDEX temp3_i.
        <temp4_i> = <spfunction2> BIT-OR <spfunction4>  BIT-OR <spfunction6>  BIT-OR <spfunction8>
BIT-OR <spfunction1>  BIT-OR <spfunction3>  BIT-OR <spfunction5>  BIT-OR <spfunction7>.
        <right> = <temp> BIT-XOR <temp4_i>.
i = i + loopinc.
ENDWHILE.
"最后一次完成异或后不交换位置
      temp = left.
left = right.
      right = temp.
      j = j + 3.
ENDWHILE.
PERFORM rshfit_i USING left 1 temp1_i.
PERFORM lshfit_i USING left 31 temp2_i.
    <left> = <temp1_i> BIT-OR <temp2_i>.
PERFORM rshfit_i USING right 1 temp1_i.
PERFORM lshfit_i USING right 31 temp2_i.
    <right> = <temp1_i> BIT-OR <temp2_i>.
*==========================
"根据逆置换规则表进行逆置换得到64位密文
PERFORM rshfit_i USING left 1 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '55555555'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 1 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING right 8 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <left>.
    x4 = '00FF00FF'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 8 temp1_i.
    <right> = <right> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING right 2 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <left>.
    x4 = '33333333'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 2 temp1_i.
    <right> = <right> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING left 16 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '0000FFFF'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 16 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
PERFORM rshfit_i USING left 4 temp1_i.
    <temp1_i> = <temp1_i> BIT-XOR <right>.
    x4 = '0F0F0F0F'.
    temp2_i = x4.
    <temp> = <temp1_i> BIT-AND <temp2_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 4 temp1_i.
    <left> = <left> BIT-XOR <temp1_i>.
*==========================
IF mode = 1."CBC密码块链接模式下,将本次加密结果存回cbcleft、cbcright,供下一轮加密解密使用
IF encrypt = 1.
        cbcleft = left.
        cbcright = right.
ELSE.
        <left> = <left> BIT-XOR <cbcleft2>.
        <right> = <right> BIT-XOR <cbcright2>.
ENDIF.
ENDIF.
*==========================
PERFORM rshfit_i USING left 24 temp1_i.
PERFORM int2c USING temp1_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
PERFORM rshfit_i USING left 16 temp1_i.
    x4 = '000000FF'.
    temp2_i = x4.
    <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
PERFORM rshfit_i USING left 8 temp1_i.
*    x4 = '000000FF'.
*    temp2_i = x4.
    <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY ``RESPECTING BLANKS.
*    x4 = '000000FF'.
*    temp2_i = x4.
    <temp3_i> = <left> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
PERFORM rshfit_i USING right 24 temp1_i.
PERFORM int2c USING temp1_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
PERFORM rshfit_i USING right 16 temp1_i.
*    x4 = '000000FF'.
*    temp2_i = x4.
    <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
PERFORM rshfit_i USING right 8 temp1_i.
*    x4 = '000000FF'.
*    temp2_i = x4.
    <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
*    x4 = '000000FF'.
*    temp2_i = x4.
    <temp3_i> = <right> BIT-AND <temp2_i>.
PERFORM int2c USING temp3_i c1.
CONCATENATE tempresult c1 INTO tempresult SEPARATED BY `` RESPECTING BLANKS.
    chunk = chunk + 8.
IF chunk = 512.
*      CONCATENATE result tempresult INTO result SEPARATED BY `` RESPECTING BLANKS.
CONCATENATE result tempresult INTO result SEPARATED BY ``.
      tempresult = ''.
      chunk = 0.
ENDIF.
ENDWHILE.
初次加密解密出来的结果
CONCATENATE result tempresult INTO result SEPARATED BY ``.
DATA: paddingchars TYPE i.
IF encrypt = 0."如果是解密
IF padding = 1."且填充模式是PKCS5padding时,去掉尾部填充
      len = STRLEN( result ).
index = len - 1.
      c1 = result+index.
PERFORM c2int USING c1 paddingchars.
IF paddingchars <= 8.
        len = len - paddingchars.
        result = result+0(len).
ENDIF.
ENDIF.
ENDIF.
"转十六进输出
DATA: x1(1) TYPE x.
  len = STRLEN( result ).
index = 0.
WHILE index < len.
    c1 = result+index(1).
    x1 = <c1>.
    c2 = x1.
CONCATENATE output c2 INTO output SEPARATED BY ``.
index = index + 1.
ENDWHILE.
ENDFORM.                                                    "3des
*&---------------------------------------------------------------------*
*&      Form  get_keys
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->KEY        text
*----------------------------------------------------------------------*
FORM get_keys USING key TYPE string .
DATA: c1 TYPE c.
FIELD-SYMBOLS <c1> TYPE x.
ASSIGN c1 TO <c1> CASTING.
DATA: x1 TYPE x.
DATA: x4(4) TYPE x.
DATA: i TYPE i.
DATA: tmpstr TYPE string VALUE ''.
DATA: index TYPE i VALUE 0.
DATA: keylen TYPE i.
CLEAR:keys,keys[].
DATA: pc2bytes0 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00000004'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20000000'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20000004'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00010000'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00010004'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20010000'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20010004'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00000200'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00000204'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20000200'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20000204'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00010200'. i = x4. APPEND i TO pc2bytes0.
  x4 = '00010204'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20010200'. i = x4. APPEND i TO pc2bytes0.
  x4 = '20010204'. i = x4. APPEND i TO pc2bytes0.
DATA: pc2bytes1 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00000001'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00100000'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00100001'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04000000'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04000001'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04100000'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04100001'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00000100'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00000101'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00100100'. i = x4. APPEND i TO pc2bytes1.
  x4 = '00100101'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04000100'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04000101'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04100100'. i = x4. APPEND i TO pc2bytes1.
  x4 = '04100101'. i = x4. APPEND i TO pc2bytes1.
DATA: pc2bytes2 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000008'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000800'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000808'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000000'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000008'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000800'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000808'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000008'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000800'. i = x4. APPEND i TO pc2bytes2.
  x4 = '00000808'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000000'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000008'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000800'. i = x4. APPEND i TO pc2bytes2.
  x4 = '01000808'. i = x4. APPEND i TO pc2bytes2.
DATA: pc2bytes3 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00200000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08000000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08200000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00002000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00202000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08002000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08202000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00020000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00220000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08020000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08220000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00022000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '00222000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08022000'. i = x4. APPEND i TO pc2bytes3.
  x4 = '08222000'. i = x4. APPEND i TO pc2bytes3.
DATA: pc2bytes4 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00040000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00000010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00040010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00040000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00000010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00040010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00001000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00041000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00001010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00041010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00001000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00041000'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00001010'. i = x4. APPEND i TO pc2bytes4.
  x4 = '00041010'. i = x4. APPEND i TO pc2bytes4.
DATA: pc2bytes5 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000400'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000020'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000420'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000400'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000020'. i = x4. APPEND i TO pc2bytes5.
  x4 = '00000420'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000000'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000400'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000020'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000420'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000000'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000400'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000020'. i = x4. APPEND i TO pc2bytes5.
  x4 = '02000420'. i = x4. APPEND i TO pc2bytes5.
DATA: pc2bytes6 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10000000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00080000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10080000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00000002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10000002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00080002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10080002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10000000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00080000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10080000'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00000002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10000002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '00080002'. i = x4. APPEND i TO pc2bytes6.
  x4 = '10080002'. i = x4. APPEND i TO pc2bytes6.
DATA: pc2bytes7 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00010000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00000800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00010800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20000000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20010000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20000800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20010800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00020000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00030000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00020800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '00030800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20020000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20030000'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20020800'. i = x4. APPEND i TO pc2bytes7.
  x4 = '20030800'. i = x4. APPEND i TO pc2bytes7.
DATA: pc2bytes8 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00040000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00040000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00000002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00040002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00000002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '00040002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02000000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02040000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02000000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02040000'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02000002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02040002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02000002'. i = x4. APPEND i TO pc2bytes8.
  x4 = '02040002'. i = x4. APPEND i TO pc2bytes8.
DATA: pc2bytes9 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000000'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000008'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000008'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000000'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000008'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000008'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000400'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000400'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000408'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000408'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000400'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000400'. i = x4. APPEND i TO pc2bytes9.
  x4 = '00000408'. i = x4. APPEND i TO pc2bytes9.
  x4 = '10000408'. i = x4. APPEND i TO pc2bytes9.
DATA: pc2bytes10 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00000020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00000020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00100000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00100020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00100000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00100020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00002000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00002020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00002000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00002020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00102000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00102020'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00102000'. i = x4. APPEND i TO pc2bytes10.
  x4 = '00102020'. i = x4. APPEND i TO pc2bytes10.
DATA: pc2bytes11 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '01000000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '00000200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '01000200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '00200000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '01200000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '00200200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '01200200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '04000000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '05000000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '04000200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '05000200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '04200000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '05200000'. i = x4. APPEND i TO pc2bytes11.
  x4 = '04200200'. i = x4. APPEND i TO pc2bytes11.
  x4 = '05200200'. i = x4. APPEND i TO pc2bytes11.
DATA: pc2bytes12 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00001000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08000000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08001000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00080000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00081000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08080000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08081000'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00000010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00001010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08000010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08001010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00080010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '00081010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08080010'. i = x4. APPEND i TO pc2bytes12.
  x4 = '08081010'. i = x4. APPEND i TO pc2bytes12.
DATA: pc2bytes13 TYPE TABLE OF i WITH HEADER LINE.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000004'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000100'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000104'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000000'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000004'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000100'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000104'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000001'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000005'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000101'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000105'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000001'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000005'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000101'. i = x4. APPEND i TO pc2bytes13.
  x4 = '00000105'. i = x4. APPEND i TO pc2bytes13.
  keylen = STRLEN( key ).
"将十六进制字符串转换为普通字符串
WHILE index <  keylen.
    <c1> = key+index(2).
CONCATENATE tmpstr c1 INTO tmpstr SEPARATED BY `` RESPECTING BLANKS.
index = index + 2.
ENDWHILE.
key = tmpstr.
  keylen = STRLEN( key ).
DATA: i1 TYPE i.
  i1 = keylen.
"key串不足24个字符时补0字符
WHILE i1 < 24.
*    CONCATENATE key '0' INTO key SEPARATED BY `` RESPECTING BLANKS.
CONCATENATE key '0' INTO key SEPARATED BY ``.
    i1 = i1 + 1.
ENDWHILE.
DATA: iterations TYPE i.
  keylen = STRLEN( key ).
IF keylen >  8 .
    iterations = 3.
ELSE.
    iterations = 1.
ENDIF.
DATA: shifts TYPE TABLE OF i WITH HEADER LINE.
APPEND 0 TO shifts.
APPEND 0 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 0 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 1 TO shifts.
APPEND 0 TO shifts.
DATA: lefttemp TYPE i ,righttemp TYPE i,m TYPE i,n TYPE i,temp TYPE i.
FIELD-SYMBOLS: <lefttemp> TYPE x,<righttemp> TYPE x.
DATA:lefttemp_x4(4) TYPE x,righttemp_x4(4) TYPE x.
DATA: j TYPE i VALUE 0.
DATA: left_c32(32) TYPE c,left_c32_1(32) TYPE c,left_c32_2(32) TYPE c,left_c32_3(32) TYPE c,left_c32_4(32) TYPE c.
DATA: left_i TYPE i,left_i_1 TYPE i,left_i_2 TYPE i,left_i_3 TYPE i,left_i_4 TYPE i.
FIELD-SYMBOLS: <left_i_1> TYPE x,<left_i_2> TYPE x,<left_i_3> TYPE x,<left_i_4> TYPE x.
DATA: left_x(4) TYPE x.
DATA: right_c32(32) TYPE c,right_c32_1(32) TYPE c,right_c32_2(32) TYPE c,right_c32_3(32) TYPE c,right_c32_4(32) TYPE c.
DATA: right_i TYPE i,right_i_1 TYPE i,right_i_2 TYPE i,right_i_3 TYPE i,right_i_4 TYPE i.
FIELD-SYMBOLS: <right_i_1> TYPE x,<right_i_2> TYPE x,<right_i_3> TYPE x,<right_i_4> TYPE x.
DATA: right_x(4) TYPE x.
DATA: left TYPE i,right TYPE i.
FIELD-SYMBOLS:<left> TYPE x,<right> TYPE x.
DATA:i_tmp1 TYPE i,i_tmp2 TYPE i,x_tmp1(4) TYPE x,x_tmp2(4) TYPE x,x_tmp3(4) TYPE x.
FIELD-SYMBOLS:<i_tmp1> TYPE x,<i_tmp2> TYPE x,<temp> TYPE x.
FIELD-SYMBOLS: <pc2bytes0> TYPE x,<pc2bytes2> TYPE x,<pc2bytes3> TYPE x,<pc2bytes4> TYPE x,<pc2bytes5> TYPE x,<pc2bytes6> TYPE x,
  <pc2bytes7> TYPE x,<pc2bytes8> TYPE x,<pc2bytes9> TYPE x,<pc2bytes10> TYPE x,<pc2bytes11> TYPE x,<pc2bytes12> TYPE x,
  <pc2bytes13> TYPE x,<pc2bytes1> TYPE x.
ASSIGN left_i_1 TO <left_i_1> CASTING.
ASSIGN left_i_2 TO <left_i_2> CASTING.
ASSIGN left_i_3 TO <left_i_3> CASTING.
ASSIGN left_i_4 TO <left_i_4> CASTING.
ASSIGN right_i_1 TO <right_i_1> CASTING.
ASSIGN right_i_2 TO <right_i_2> CASTING.
ASSIGN right_i_3 TO <right_i_3> CASTING.
ASSIGN right_i_4 TO <right_i_4> CASTING.
ASSIGN i_tmp1 TO <i_tmp1> CASTING.
ASSIGN i_tmp2 TO <i_tmp2> CASTING.
ASSIGN right TO <right> CASTING.
ASSIGN temp TO <temp> CASTING.
ASSIGN left TO <left> CASTING.
ASSIGN pc2bytes0 TO <pc2bytes0> CASTING.
ASSIGN pc2bytes1 TO <pc2bytes1> CASTING.
ASSIGN pc2bytes2 TO <pc2bytes2> CASTING.
ASSIGN pc2bytes3 TO <pc2bytes3> CASTING.
ASSIGN pc2bytes4 TO <pc2bytes4> CASTING.
ASSIGN pc2bytes5 TO <pc2bytes5> CASTING.
ASSIGN pc2bytes6 TO <pc2bytes6> CASTING.
ASSIGN pc2bytes7 TO <pc2bytes7> CASTING.
ASSIGN pc2bytes8 TO <pc2bytes8> CASTING.
ASSIGN pc2bytes9 TO <pc2bytes9> CASTING.
ASSIGN pc2bytes10 TO <pc2bytes10> CASTING.
ASSIGN pc2bytes11 TO <pc2bytes11> CASTING.
ASSIGN pc2bytes12 TO <pc2bytes12> CASTING.
ASSIGN pc2bytes13 TO <pc2bytes13> CASTING.
ASSIGN lefttemp TO <lefttemp> CASTING.
ASSIGN righttemp TO <righttemp> CASTING.
DATA: temp1_i TYPE i,temp2_i TYPE i,temp3_i TYPE i,temp4_i TYPE i,temp5_i TYPE i,temp6_i TYPE i,temp7_i TYPE i,temp8_i TYPE i.
FIELD-SYMBOLS: <temp1_i> TYPE x, <temp2_i> TYPE x, <temp3_i> TYPE x, <temp4_i> TYPE x, <temp5_i> TYPE x, <temp6_i> TYPE x, <temp7_i> TYPE x, <temp8_i> TYPE x.
ASSIGN temp1_i TO <temp1_i> CASTING.
ASSIGN temp2_i TO <temp2_i> CASTING.
ASSIGN temp3_i TO <temp3_i> CASTING.
ASSIGN temp4_i TO <temp4_i> CASTING.
ASSIGN temp5_i TO <temp5_i> CASTING.
ASSIGN temp6_i TO <temp6_i> CASTING.
ASSIGN temp7_i TO <temp7_i> CASTING.
ASSIGN temp8_i TO <temp8_i> CASTING.
WHILE  j < iterations.
    c1 = key+m(1).
PERFORM lshfit_c USING c1 24 left_i_1.
m = m + 1.
    c1 = key+m(1).
PERFORM lshfit_c USING c1 16 left_i_2.
m = m + 1.
    c1 = key+m(1).
PERFORM lshfit_c USING c1 8 left_i_3.
m = m + 1.
    c1 = key+m(1).
PERFORM c2int USING c1 left_i_4.
m = m + 1.
    left_x = <left_i_1> BIT-OR <left_i_2> BIT-OR <left_i_3> BIT-OR <left_i_4>.
    <left> = left_x.
*==========================
    c1 = key+m(1).
PERFORM lshfit_c USING c1 24 right_i_1.
m = m + 1.
    c1 = key+m(1).
PERFORM lshfit_c USING c1 16 right_i_2.
m = m + 1.
    c1 = key+m(1).
PERFORM lshfit_c USING c1 8 right_i_3.
m = m + 1.
    c1 = key+m(1).
PERFORM c2int USING c1 right_i_4.
m = m + 1.
    right_x = <right_i_1> BIT-OR <right_i_2> BIT-OR <right_i_3> BIT-OR <right_i_4>.
    <right> = right_x.
*==========================
PERFORM rshfit_i USING left 4 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <right>.
    x4 = '0F0F0F0F'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 4 i_tmp2.
    <left> = <left> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING right -16 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <left>.
    x4 = '0000FFFF'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp -16 i_tmp2.
    <right> = <right> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING left 2 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <right>.
    x4 = '33333333'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 2 i_tmp2.
    <left> = <left> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING right -16 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <left>.
    x4 = '0000FFFF'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp -16 i_tmp2.
    <right> = <right> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING left 1 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <right>.
    x4 = '55555555'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 1 i_tmp2.
    <left> = <left> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING right 8 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <left>.
    x4 = '00FF00FF'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <left> = <left> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 8 i_tmp2.
    <right> = <right> BIT-XOR <i_tmp2>.
PERFORM rshfit_i USING left 1 temp1_i.
    <temp2_i> = <temp1_i> BIT-XOR <right>.
    x4 = '55555555'.
    temp3_i = x4.
    <temp> = <temp2_i> BIT-AND <temp3_i>.
    <right> = <right> BIT-XOR <temp>.
PERFORM lshfit_i USING temp 1 i_tmp2.
    <left> = <left> BIT-XOR <i_tmp2>.
*==========================
PERFORM rshfit_i USING right 20 temp1_i.
    x4 = '000000F0'.
    temp2_i = x4.
    <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
PERFORM lshfit_i USING left 8 temp4_i.
    <temp> = <temp4_i> BIT-OR <temp3_i>.
PERFORM lshfit_i USING right 24 temp1_i.
PERFORM lshfit_i USING right 8 temp2_i.
    x4 = '00FF0000'.
    temp3_i = x4.
    <temp4_i> = <temp2_i> BIT-AND <temp3_i>.
    <temp5_i> = <temp1_i> BIT-OR <temp4_i>.
PERFORM rshfit_i USING right 8 temp2_i.
    x4 = '0000FF00'.
    temp3_i = x4.
    <temp4_i> = <temp2_i> BIT-AND <temp3_i>.
    <temp5_i> = <temp5_i> BIT-OR <temp4_i>.
PERFORM rshfit_i USING right 24 temp2_i.
    x4 = '000000F0'.
    temp3_i = x4.
    <temp4_i> = <temp2_i> BIT-AND <temp3_i>.
    <temp5_i> = <temp5_i> BIT-OR <temp4_i>.
left = temp5_i.
    right = temp.
*==========================
index = 1.
WHILE index <= 16.
*      CLEAR:shifts.
READ TABLE shifts INDEX index.
IF shifts = 1.
PERFORM lshfit_i USING left 2 i_tmp1.
PERFORM rshfit_i USING left 26 i_tmp2.
        <left> = <i_tmp1> BIT-OR <i_tmp2>.
PERFORM lshfit_i USING right 2 i_tmp1.
PERFORM rshfit_i USING right 26 i_tmp2.
        <right> = <i_tmp1> BIT-OR <i_tmp2>.
ELSE.
PERFORM lshfit_i USING left 1 i_tmp1.
PERFORM rshfit_i USING left 27 i_tmp2.
        <left> = <i_tmp1> BIT-OR <i_tmp2>.
PERFORM lshfit_i USING right 1 i_tmp1.
PERFORM rshfit_i USING right 27 i_tmp2.
        <right> = <i_tmp1> BIT-OR <i_tmp2>.
ENDIF.
      x4 = 'FFFFFFF1'.
      temp1_i = x4.                                         " -15
      <left> = <left> BIT-AND <temp1_i>.
*      x4 = 'FFFFFFF1'.                                      " -15
*      temp1_i = x4.
      <right> = <right> BIT-AND <temp1_i>.
*==========================
PERFORM rshfit_i USING left 28 i_tmp1.
      i_tmp1 = i_tmp1 + 1.
READ TABLE pc2bytes0 INDEX i_tmp1.
PERFORM rshfit_i USING left 24 temp1_i.
      x4 = '0000000F'.
      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes1 INDEX temp3_i.
PERFORM rshfit_i USING left 20 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes2 INDEX temp3_i.
PERFORM rshfit_i USING left 16 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes3 INDEX temp3_i.
PERFORM rshfit_i USING left 12 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes4 INDEX temp3_i.
PERFORM rshfit_i USING left 8 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes5 INDEX temp3_i.
PERFORM rshfit_i USING left 4 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes6 INDEX temp3_i.
      <lefttemp> = <pc2bytes0> BIT-OR <pc2bytes1> BIT-OR <pc2bytes2> BIT-OR <pc2bytes3>
BIT-OR <pc2bytes4> BIT-OR <pc2bytes5> BIT-OR <pc2bytes6>.
*==========================
PERFORM rshfit_i USING right 28 i_tmp1.
      i_tmp1 = i_tmp1 + 1.
READ TABLE pc2bytes7 INDEX i_tmp1.
PERFORM rshfit_i USING right 24 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes8 INDEX temp3_i.
PERFORM rshfit_i USING right 20 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes9 INDEX temp3_i.
PERFORM rshfit_i USING right 16 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes10 INDEX temp3_i.
PERFORM rshfit_i USING right 12 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes11 INDEX temp3_i.
PERFORM rshfit_i USING right 8 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes12 INDEX temp3_i.
PERFORM rshfit_i USING right 4 temp1_i.
*      x4 = '0000000F'.
*      temp2_i = x4.
      <temp3_i> = <temp1_i> BIT-AND <temp2_i>.
      temp3_i = temp3_i + 1.
READ TABLE pc2bytes13 INDEX temp3_i.
      <righttemp> = <pc2bytes7> BIT-OR <pc2bytes8> BIT-OR <pc2bytes9> BIT-OR <pc2bytes10>
BIT-OR <pc2bytes11> BIT-OR <pc2bytes12> BIT-OR <pc2bytes13>.
*==========================
PERFORM rshfit_i USING righttemp 16 temp1_i.
      <temp2_i> = <temp1_i> BIT-XOR <lefttemp>.
      x4 = '0000FFFF'.
      temp3_i = x4.
      <temp> = <temp3_i> BIT-AND <temp2_i>.
*==========================
      <temp1_i> = <lefttemp> BIT-XOR <temp>.
APPEND temp1_i TO keys..
PERFORM lshfit_i USING temp 16 temp1_i.
      <temp2_i> = <righttemp> BIT-XOR <temp1_i>.
APPEND temp2_i TO keys.
index = index + 1.
ENDWHILE.
    j = j + 1.
ENDWHILE.
ENDFORM.                    "get_keys

==========================LZHR3DESF00==========================