SAP RSA算法例子

1 Introduction

This is a SAP RSA encryption .

2 Example

  DATA: lv_output         TYPE xstring,
        lv_input_x        TYPE xstring,
        lv_input          TYPE string,
        lv_crc            TYPE ssfparms-ssfcrc,
        lt_recipient_list TYPE STANDARD TABLE OF ssfinfo,
        ls_recipient_list LIKE LINE OF lt_recipient_list.

  DATA: lv_base64    TYPE string,
        lv_pubkey    TYPE xstring,
        lv_pubbase64 TYPE string,
        lv_str       TYPE string.


  lv_input =  iv_userid.

  lv_input_x = cl_bcs_convert=>string_to_xstring( lv_input ).


  CASE sy-mandt .

    WHEN  '150'.
      " 公钥(固定参数)加密
      lv_pubbase64 =
                      'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAl4mK2FfF1KpL23SMPX4RL3'
                   && 'BcdFPfDQ4QLmoTuIG41Z8Hb2YZ4XjGxmrsIDfWV3M15IDu+e/xG6J0oZg1lSV8azQzc9H0V'
                   && '5Bje9c4pJtxCx1WluditiCpsLzQT/Y8QUkYIy/0DGNKu3NnNx8Qe2S9IBUT5xbUuWCQ7HGKw'
                   && 'KyYq+U5kNGMM5VS7UTCEpHW0ZrG1MBtPLkwBmuZ/tW1YlImeN1nce3N9xqMtdIw+3Kim4u'
                   && 'VcXAk3sjLzwwZbv76W0a5btUuZtEyC/EVZjk9xGMbYM5lJxw0ouNOilxYKvbwny5EsRWeAWF'
                   && 'l8e2ybEQ6xCrm+hOPKaJT5nzBjyJ0sBcVwwIDAQAB'.

    WHEN '800'.

      " 公钥(固定参数)加密
      lv_pubbase64 =
                      'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnASjMejEpL8O+vu1JxBXvGlzReRZjb20RxwlDMkM2LZUyMB0OYoyN'
                   && '0MVCzftWZV0C89gtcC/+zslD/MXDQXnNwoHL5ej4LEgbZ4en2nwBSIvTMmueZ0QGONvGnBz5JpaR0p7RKnExu3qP9SOuaVjTR'
                   && 'v1q4Itv5aqIi3311umu8KzvkRoNUH5oauHTBI3suZP30hIgDy4XqOrcJ61NoPmN3V+lJvCmAiUcStcKeEtM9q6dL8m9i6dpf12Zhm'
                   && '4cseGLRGSxC8Zx+Mi5lcQb251/xL+EXqNGFOdadmhWpR9zJve8iIxvrqzJOHp7aMv3tdcI9kkKw0YEiY4VX0ch//ASwIDAQAB'.
    WHEN OTHERS.
  ENDCASE.

  CALL FUNCTION 'SCMS_BASE64_DECODE_STR'
    EXPORTING
      input  = lv_pubbase64
*     UNESCAPE       = 'X'
    IMPORTING
      output = lv_pubkey
    EXCEPTIONS
      failed = 1
      OTHERS = 2.

  " 模数 参考加密概述
  lv_str = lv_pubkey.
  DATA(length) = strlen( lv_str ).
  IF length > 514." 2048位密钥
    DATA(pos) = length - 10 - 514.
    lv_str = lv_str+pos(514).
  ELSEIF length > 256." 1024位密钥
    pos = length - 10 - 256.
    lv_str = lv_str+pos(256).
  ENDIF.


  " 函数使用密钥格式
  lv_str = 'R:m=' && lv_str && ':e=010001:'.
  lv_pubkey = cl_bcs_convert=>string_to_xstring( lv_str ).
  ls_recipient_list-id = '<implicit>'."
  APPEND ls_recipient_list TO lt_recipient_list.

  CALL FUNCTION 'SSFW_KRN_ENVELOPE'
    EXPORTING
      str_format          = 'PKCS1-V1.5'
      str_pab             = '<no_certificate_check>'
      str_chainfmt        = 'KEYVALUE'
      ostr_chain_data     = lv_pubkey
      ostr_input_data     = lv_input_x
    IMPORTING
      ostr_enveloped_data = lv_output
      crc                 = lv_crc
    TABLES
      recipient_list      = lt_recipient_list
    EXCEPTIONS
      OTHERS              = 1.

  CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'
    EXPORTING
      input  = lv_output
    IMPORTING
      output = lv_base64.


  ev_out = lv_base64.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值