欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

ABAP 3DES 加密算法

最编程 2024-04-11 19:20:03
...
*&---------------------------------------------------------------------*
*&      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

原文地址:https://www.cnblogs.com/jiangzhengjun/p/11028193.html