加密/解密算法(Unicode版本和None-Unicode版本)

本文介绍了一种ABAP语言中的加密与解密方法,包括Unicode与非Unicode版本的实现细节。通过定义特定的数据结构并利用ABAP内置类进行字符串操作,实现了数据的安全转换。此外,还展示了如何将加密后的数据导出为文件,并读取文件进行解密的过程。

 

Unicode版本:

data: key(8) value '12345678'.
DATA: I 
TYPE I, J TYPE I.
DATA: BEGIN OF A
,
   
1(2) TYPE X, 2(2) TYPE X, 3(2) TYPE X, 4(2) TYPE X,
   
5(2) TYPE X, 6(2) TYPE X, 7(2) TYPE X, 8(2) TYPE X,
END OF A.
DATA: BEGIN OF B
,
   
1(2) TYPE X, 2(2) TYPE X, 3(2) TYPE X, 4(2) TYPE X,
   
5(2) TYPE X, 6(2) TYPE X, 7(2) TYPE X, 8(2) TYPE X,
END OF B.
DATA: BEGIN OF C
,
   
1(2) TYPE X, 2(2) TYPE X, 3(2) TYPE X, 4(2) TYPE X,
   
5(2) TYPE X, 6(2) TYPE X, 7(2) TYPE X, 8(2) TYPE X,
END OF C.
DATA: BEGIN OF D
,
   
1(2) TYPE X, 2(2) TYPE X, 3(2) TYPE X, 4(2) TYPE X,
   
5(2) TYPE X, 6(2) TYPE X, 7(2) TYPE X, 8(2) TYPE X,
END OF D.
DATA: BEGIN OF E
,
   
1(2) TYPE X, 2(2) TYPE X, 3(2) TYPE X, 4(2) TYPE X,
   
5(2) TYPE X, 6(2) TYPE X, 7(2) TYPE X, 8(2) TYPE X,
END OF E.


 

FORM Encrypt using value
(line) changing line2.
= STRLEN( line ). I = 0.
CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C
              EXPORTING im_container 
= key
              IMPORTING EX_VALUE     
= A
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.

DO.
  
CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C
              EXPORTING im_container 
= line+I
              IMPORTING EX_VALUE     
= B
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.
  E 
= B.
  
IF SY-INDEX = 1.
    B-
1 = A-1 + B-1.B-2 = A-2 + B-2.B-3 = A-3 + B-3.B-4 = A-4 + B-4.
    B-
5 = A-5 + B-5.B-6 = A-6 + B-6.B-7 = A-7 + B-7.B-8 = A-8 + B-8.
  
ELSE.
    B-
1 = C-1 + D-1 + B-1.B-2 = C-2 + D-2 + B-2.
    B-
3 = C-3 + D-3 + B-3.B-4 = C-4 + D-4 + B-4.
    B-
5 = C-5 + D-5 + B-5.B-6 = C-6 + D-6 + B-6.
    B-
7 = C-7 + D-7 + B-7.B-8 = C-8 + D-8 + B-8.
  ENDIF
.
  D 
= B. C = E.
  
CALL METHOD cl_abap_container_utilities=>FILL_CONTAINER_C
              EXPORTING IM_VALUE 
= B
              IMPORTING EX_CONTAINER     
= line2+I(8)
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.
  I 
= I + 8.
  
IF I >= J.
    
EXIT.
  ENDIF
.
ENDDO
.

ENDFORM
.

 

FORM Decrypt using value
(line) changing line2.

= STRLEN( line ).
= 0.
CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C
              EXPORTING im_container 
= key
              IMPORTING EX_VALUE     
= A
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.

DO.
  
CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C
              EXPORTING im_container 
= line+I
              IMPORTING EX_VALUE     
= B
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.
  E 
= B.
  
IF SY-INDEX = 1.
    B-
1 = B-1 - A-1.B-2 = B-2 - A-2.B-3 = B-3 - A-3.B-4 = B-4 - A-4.
    B-
5 = B-5 - A-5.B-6 = B-6 - A-6.B-7 = B-7 - A-7.B-8 = B-8 - A-8.
  
ELSE.
    B-
1 = B-1 - C-1 - D-1.B-2 = B-2 - C-2 - D-2.
    B-
3 = B-3 - C-3 - D-3.B-4 = B-4 - C-4 - D-4.
    B-
5 = B-5 - C-5 - D-5.B-6 = B-6 - C-6 - D-6.
    B-
7 = B-7 - C-7 - D-7.B-8 = B-8 - C-8 - D-8.
  ENDIF
.
  D 
= B. C = E.
  
CALL METHOD cl_abap_container_utilities=>FILL_CONTAINER_C
              EXPORTING IM_VALUE 
= B
              IMPORTING EX_CONTAINER     
= line2+I(8)
              EXCEPTIONS illegal_parameter_type 
= 1
                                         OTHERS 
= 2.
  I 
= I + 8.
  
IF I >= J.
    
EXIT.
  ENDIF
.
ENDDO
.

ENDFORM
. 

 

None-Unicode版本:

 

PARAMETERS: STRING(96), KEY(8).
PARAMETER ENCRYPT RADIOBUTTON GROUP RB
.
PARAMETER DECRYPT RADIOBUTTON GROUP RB
.
DATA: I 
TYPE I, J TYPE I.
DATA: BEGIN OF A
,
   
1 TYPE X, 2 TYPE X, 3 TYPE X, 4 TYPE X,
   
5 TYPE X, 6 TYPE X, 7 TYPE X, 8 TYPE X,
END OF A.
DATA: BEGIN OF B
,
   
1 TYPE X, 2 TYPE X, 3 TYPE X, 4 TYPE X,
   
5 TYPE X, 6 TYPE X, 7 TYPE X, 8 TYPE X,
END OF B.
DATA: BEGIN OF C
,
   
1 TYPE X, 2 TYPE X, 3 TYPE X, 4 TYPE X,
   
5 TYPE X, 6 TYPE X, 7 TYPE X, 8 TYPE X,
END OF C.
DATA: BEGIN OF D
,
   
1 TYPE X, 2 TYPE X, 3 TYPE X, 4 TYPE X,
   
5 TYPE X, 6 TYPE X, 7 TYPE X, 8 TYPE X,
END OF D.
DATA: BEGIN OF E
,
   
1 TYPE X, 2 TYPE X, 3 TYPE X, 4 TYPE X,
   
5 TYPE X, 6 TYPE X, 7 TYPE X, 8 TYPE X,
END OF E.

WRITE: 
/ STRING.
*                          encrypting
= STRLEN( STRING ).
= KEY.
DO.
  B 
= STRING+I.
  E 
= B.
  
IF SY-INDEX = 1.
    B-
1 = A-1 + B-1.B-2 = A-2 + B-2.B-3 = A-3 + B-3.B-4 = A-4 + B-4.
    B-
5 = A-5 + B-5.B-6 = A-6 + B-6.B-7 = A-7 + B-7.B-8 = A-8 + B-8.
  
ELSE.
    B-
1 = C-1 + D-1 + B-1.B-2 = C-2 + D-2 + B-2.
    B-
3 = C-3 + D-3 + B-3.B-4 = C-4 + D-4 + B-4.
    B-
5 = C-5 + D-5 + B-5.B-6 = C-6 + D-6 + B-6.
    B-
7 = C-7 + D-7 + B-7.B-8 = C-8 + D-8 + B-8.
  ENDIF
.
  D 
= B. C = E.
  STRING
+I(8) = B.
  I 
= I + 8.
  
IF I >= J.
    
EXIT.
  ENDIF
.
ENDDO
.

WRITE: 
/ STRING.
*                            decrypting
= STRLEN( STRING ). I = 0.
= KEY.
DO.
  B 
= STRING+I.
  E 
= B.
  
IF SY-INDEX = 1.
    B-
1 = B-1 - A-1.B-2 = B-2 - A-2.B-3 = B-3 - A-3.B-4 = B-4 - A-4.
    B-
5 = B-5 - A-5.B-6 = B-6 - A-6.B-7 = B-7 - A-7.B-8 = B-8 - A-8.
  
ELSE.
    B-
1 = B-1 - C-1 - D-1.B-2 = B-2 - C-2 - D-2.
    B-
3 = B-3 - C-3 - D-3.B-4 = B-4 - C-4 - D-4.
    B-
5 = B-5 - C-5 - D-5.B-6 = B-6 - C-6 - D-6.
    B-
7 = B-7 - C-7 - D-7.B-8 = B-8 - C-8 - D-8.
  ENDIF
.
  D 
= B. C = E.
  STRING
+I(8) = B.
  I 
= I + 8.
  
IF I >= J.
    
EXIT.
  ENDIF
.
ENDDO
.

WRITE: 
/ STRING.

 

 

Unicode版本的使用:

 

data: begin of lines occurs 0,
        line
(200),
      
end of lines.



FORM OUT2INTERFACE
.
data: amount
(15), tmp_line(200).

  refresh lines
.
  loop at s_itab
.
    amount 
= s_itab-net_pay.
    concatenate s_itab-name
                amount
                s_itab-zweck
                s_itab-zbankdesc
                into tmp_line
                separated by '
,'.

     perform encrypt using tmp_line changing lines-line
.

     
append lines.
     clear lines
.
     clear tmp_line
.
  endloop
.

  
CALL FUNCTION 'GUI_DOWNLOAD'
    EXPORTING
*      
codepage            = '8400'
      FILENAME            
= 'c:homedirpaylist.txt'
      FILETYPE            
= 'BIN'
    TABLES
      DATA_TAB            
= lines
    EXCEPTIONS
      INVALID_FILESIZE    
= 1
      INVALID_TABLE_WIDTH 
= 2
      INVALID_TYPE        
= 3.


**** Just 
for Test******
*data: begin of lines2 occurs 
0,
*        line
(200),
*      
end of lines2.
*  refresh lines2
.
*  refresh lines
.
*  
CALL FUNCTION 'GUI_UPLOAD'
*    EXPORTING
**      
codepage            = '8400'
*      FILENAME            
= 'c:homedirpaylist.txt'
*      FILETYPE            
= 'BIN'
*    TABLES
*      DATA_TAB            
= lines
*    EXCEPTIONS
*      INVALID_FILESIZE    
= 1
*      INVALID_TABLE_WIDTH 
= 2
*      INVALID_TYPE        
= 3.
*
*   loop at lines
.
*     clear lines2
.
*     perform decrypt using lines-line changing lines2-line
.
*     
append lines2.
*   endloop
.
*
*   
CALL FUNCTION 'GUI_DOWNLOAD'
*    EXPORTING
*      
codepage            = '8400'
*      FILENAME            
= 'c:homedirpaylist2.txt'
*      FILETYPE            
= 'ASC'
*    TABLES
*      DATA_TAB            
= lines2
*    EXCEPTIONS
*      INVALID_FILESIZE    
= 1
*      INVALID_TABLE_WIDTH 
= 2
*      INVALID_TYPE        
= 3.

ENDFORM
.                    "Out2Interface

 

注意点:

1-Unicode版本中使用CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C和CALL METHOD cl_abap_container_utilities=>READ_CONTAINER_C来实现string到structure的赋值,否则编译报错。

2-在Out2Interface Form中,当将加密内容写入文件中时,使用BIN方式写入,如果ASC/DAT编码方式会编码出错。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值