EXCEL加密

EXCEL加密设置密码

例子:

Data  worksheet type ref to zcl_excel_worksheet.

Worksheet->zif_excel_sheet_protection~password zcl_excel_common=>encrypt_password|abc@123| ). "设置密码,不然用户可以自己解锁

定义数据元素:

数据元素

数据元素field

类型

长度

说明

AES Password

ZEXCEL_AES_PASSWORD

CHAR

50

定义密码

Password hash

ZEXCEL_PWD_HASH

RAW

2

method ENCRYPT_PASSWORD.

  DATA lv_curr_offset            TYPE i.
  DATA lv_curr_char              TYPE c LENGTH 1.
  DATA lv_curr_hex               TYPE zexcel_pwd_hash.
  DATA lv_pwd_len                TYPE zexcel_pwd_hash.
  DATA lv_pwd_hash               TYPE zexcel_pwd_hash.
  CONSTANTS:
    lv_0x7fff         TYPE zexcel_pwd_hash VALUE '7FFF',
    lv_0x0001         TYPE zexcel_pwd_hash VALUE '0001',
    lv_0xce4b         TYPE zexcel_pwd_hash VALUE 'CE4B'.
  DATA lv_pwd         TYPE zexcel_aes_password.


  lv_pwd i_pwd(15).
  lv_pwd_len STRLENlv_pwd ).
  lv_curr_offset lv_pwd_len 1.

  WHILE lv_curr_offset GE 0.

    lv_curr_char lv_pwd+lv_curr_offset(1).
    lv_curr_hex char2hexlv_curr_char ).

    lv_pwd_hash = (  shr14lv_pwd_hash BIT-AND lv_0x0001 BIT-OR shl01lv_pwd_hash BIT-AND lv_0x7fff ).

    lv_pwd_hash lv_pwd_hash BIT-XOR lv_curr_hex.
    SUBTRACT FROM lv_curr_offset.
  ENDWHILE.

  lv_pwd_hash = (  shr14lv_pwd_hash BIT-AND lv_0x0001 BIT-OR shl01lv_pwd_hash BIT-AND lv_0x7fff ).
  lv_pwd_hash lv_pwd_hash BIT-XOR lv_0xce4b.
  lv_pwd_hash lv_pwd_hash BIT-XOR lv_pwd_len.

  WRITE lv_pwd_hash TO r_encrypted_pwd.

  endmethod.

  method CHAR2HEX.

  IF o_conv IS NOT BOUND.
    o_conv = cl_abap_conv_out_ce=>create( endian   = 'L'
                                          ignore_cerr = abap_true
                                          replacement = '#' ).
  ENDIF.

  CALL METHOD o_conv->reset( ).
  CALL METHOD o_conv->write( data = i_char ).
  r_hex+1 = o_conv->get_buffer( ). " x'65' must be x'0065'

  endmethod.

  method SHR14.

  DATA:
    lv_bit TYPE i,
    lv_curr_pos TYPE i,
    lv_next_pos TYPE i.

  r_pwd_hash = i_pwd_hash.

  DO 14 TIMES.
    lv_curr_pos = 15.
    lv_next_pos = 16.

    DO 15 TIMES.
      GET BIT lv_curr_pos OF r_pwd_hash INTO lv_bit.
      SET BIT lv_next_pos OF r_pwd_hash TO lv_bit.
      SUBTRACT 1 FROM lv_curr_pos.
      SUBTRACT 1 FROM lv_next_pos.
    ENDDO.
    SET BIT 1 OF r_pwd_hash TO 0.
  ENDDO.

  endmethod.

  method SHL01.

  DATA:
     lv_bit TYPE i,
     lv_curr_pos  TYPE i VALUE 2,
     lv_prev_pos TYPE i VALUE 1.

  DO 15 TIMES.
    GET BIT lv_curr_pos OF i_pwd_hash INTO lv_bit.
    SET BIT lv_prev_pos OF r_pwd_hash TO lv_bit.
    ADD 1 TO lv_curr_pos.
    ADD 1 TO lv_prev_pos.
  ENDDO.
  SET BIT 16 OF r_pwd_hash TO 0.

  endmethod.
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值