IDES Solution Manager Key 生成程序

*&---------------------------------------------------------------------*
*& Report   ZSLMKEY
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT   ZSLMKEY.

typesbegin of dswpclientkey,
          INSTNO type num10,
          DBID(3),
          BUNDLE_ID(8),
          SERVICE_KEY(40),
        end of dswpclientkey.
*data: dswpclientkey_w type standard table of dswpclientkey.
DATA: P_VALUE(10),
       P_INSTNO(10).

PARAMETERS: P_SID(3),
              P_SYSNO(2),
              P_SERVER(15).

START-OF-SELECTION.
   PERFORM GET_SP_VALUE USING P_SID
                              P_SYSNO
                              P_SERVER
                              P_INSTNO
                     CHANGING P_VALUE.

END-OF-SELECTION.
   WRITE P_VALUE.
*&---------------------------------------------------------------------*
*&       Form   get_sp_value
*&---------------------------------------------------------------------*
*        text
*----------------------------------------------------------------------*
*       -->P_PF_SID   text
*       -->P_PF_SYSNO   text
*       -->P_PF_SERVER   text
*       <--P_PF_VALUE   text
*----------------------------------------------------------------------*
FORM get_sp_value USING     P_PF_SID
                            P_PF_SYSNO
                            P_PF_SERVER
                            P_PF_INSTNO
                   CHANGING P_PF_VALUE.

   CONSTANTS: lc_part_len TYPE i VALUE 5,
              lc_pw_len    TYPE i VALUE 10,
              lc_allowed_chars(38TYPE c VALUE
              '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_'.

   data: lf_string(20)         type c,
         lf_key                type i,
         ls_key                type dswpclientkey,
         lf_part(lc_part_len) type c,
         lf_finalf(lc_pw_len) type c,
         lf_finalx             type xstring,
         lf_xbuffer            type xstring,
         lf_opf(10)            type c,
         lf_langu              like sy-langu,
         lf_subrc              like sy-subrc,
         lf_len                type i,
         lo_conv_to_x          TYPE REF TO cl_abap_conv_out_ce.

   clear: lf_string, lf_finalx, lf_opf.

   concatenate p_pf_sid p_pf_sysno p_pf_server into lf_string.

* Large letters only
   translate lf_string to upper case.

   lf_langu = sy-langu.
   SET LOCALE LANGUAGE 'E'.
   lo_conv_to_x = cl_abap_conv_out_ce=>createencoding = '1100' ).
   lf_len = STRLEN( lf_string ).

   IF lf_string(lf_len) CN lc_allowed_chars.
   else.

* Fold the input string to a lc_part_len long string
     WHILE lf_len > 0.
       lf_part = lf_string(lc_part_len).
       SHIFT lf_string BY lc_part_len PLACES.
       lf_len = STRLEN( lf_string ).
       CALL METHOD lo_conv_to_x->reset.
       CALL METHOD lo_conv_to_x->writedata = lf_part n = -1 ).
       lf_xbuffer = lo_conv_to_x->get_buffer( ).
       lf_finalx = lf_finalx BIT-XOR lf_xbuffer.
     ENDWHILE.

     lf_key = 12.

     PERFORM scramble USING       lf_finalx
                                 lf_key
                                 lc_part_len
                        CHANGING lf_finalf
                                 lf_subrc.

     if not lf_finalf is initial.
       p_pf_value = lf_finalf.
       ls_key-dbid         = p_pf_sid.
       ls_key-instno       = p_pf_instno.
       ls_key-bundle_id    = 'SM_KEY'.
       ls_key-service_key = lf_finalf.
       if not p_pf_instno is initial.
*         insert dswpclientkey_w from ls_key.
         if sy-subrc <> 0.
*           update dswpclientkey_w from ls_key.
         endif.
       endif.
     else.
       clear p_pf_value.
     endif.
   endif.
ENDFORM.                     " get_sp_value
*&---------------------------------------------------------------------*
*&       Form   scramble
*&---------------------------------------------------------------------*
*        text
*----------------------------------------------------------------------*
*       -->P_LF_FINALX   text
*       -->P_LF_KEY   text
*       -->P_LC_PART_LEN   text
*       <--P_LF_finalf   text
*       <--P_LF_SUBRC   text
*----------------------------------------------------------------------*
FORM scramble USING     iv_xstring TYPE xstring
                        iv_key TYPE i
                        iv_src_len TYPE i
               CHANGING lf_finalf
                        lf_subrc LIKE sy-subrc.

   CONSTANTS: lc_max_len     TYPE i VALUE 20,
              lc_mask(4)     TYPE x VALUE '0000003F',
              lc_random(64TYPE x VALUE
                       'F0ED53B83244F1F876C67959FD4F13A2' &
                       'C15195EC5483C234774943A27DE26596' &
                       '5E5398789A17A33CD383A8B829FBDCA5' &
                       '55D702778413ACDDF9B83116610E6DFA'.

   DATA: lv_key_index(4)   TYPE x,
         lv_rand_index(4TYPE x,
         lv_xkey(4)        TYPE x,
         lv_xkey_shl_1(4TYPE x,
         lv_xkey_shr_5(4TYPE x,
         lv_scramble_byte TYPE x,
         lv_dest(lc_max_len) TYPE x,
         lv_index          TYPE i,
         lv_len            TYPE i.

   CLEAR lf_subrc.

   IF iv_src_len EQ 0EXITENDIF.
   lv_len = XSTRLEN( iv_xstring ).
   IF iv_src_len GT lc_max_len OR
      iv_src_len GT lv_len.
     lf_subrc = 2.
     EXIT.
   ENDIF.

   lv_xkey        = iv_key.
   lv_xkey_shl_1 = iv_key * 2.
   lv_xkey_shr_5 = iv_key DIV 32.
   lv_rand_index = lv_xkey BIT-XOR lv_xkey_shr_5 BIT-XOR lv_xkey_shl_1.
   lv_rand_index = lv_rand_index BIT-AND lc_mask.

   lv_index = 0.
   DO iv_src_len TIMES.
     CATCH SYSTEM-EXCEPTIONS compute_int_times_overflow = 1.
       lv_key_index = ( iv_key * lv_index * lv_index ) - lv_index.
     ENDCATCH.
     IF sy-subrc <> 0.
       lf_subrc = 1.
       EXIT.
     ENDIF.
     lv_scramble_byte = lc_random+lv_rand_index(1BIT-XOR
                        lv_key_index+3(1).
     lv_dest+lv_index(1) = iv_xstring+lv_index(1BIT-XOR
                           lv_scramble_byte.
     lv_index = lv_index + 1.
     lv_rand_index = lv_rand_index + 1.
     lv_rand_index = lv_rand_index BIT-AND lc_mask.
   ENDDO.
   IF lf_subrc <> 0.
     EXIT.
   ENDIF.

   WRITE lv_dest(iv_src_len) TO lf_finalf.

ENDFORM.                     " scramble

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/23334.html