美文网首页
abap 加密

abap 加密

作者: abapCiCi | 来源:发表于2021-05-21 18:30 被阅读0次

对称加密与非对称加密

简介

对称加密:加密和解密用的是同一个密码或者同一套逻辑的加密方式 例如:  **DES、3DES、Blowfish、IDEA、RC4、RC5、RC6 和 AES** 

非对称加密:用的是一对秘钥,分别叫做公钥(public key)和私钥(private key)例如 **RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)**

Hash算法(摘要算法)

它是一种单向算法例如 MD2、MD4、MD5、HAVAL、SHA

AES-cdc-pkcs7padding-128

某些加密算法要求明文需要按一定长度对齐,叫做块大小(BlockSize),比如16字节,那么对于一段任意的数据,加密前需要对最后一个块填充到16 字节,解密后需要删除掉填充的数据。

ZeroPadding,数据长度不对齐时使用0填充,否则不填充。
PKCS7Padding,假设数据长度需要填充n(n>0)个字节才对齐,那么填充n个字节,每个字节都是n;如果数据本身就已经对齐了,则填充一块长度为块大小的数据,每个字节都是块大小。
PKCS5Padding,PKCS7Padding的子集,块大小固定为8字节。
由于使用PKCS7Padding/PKCS5Padding填充时,最后一个字节肯定为填充数据的长度,所以在解密后可以准确删除填充的数据,而使用ZeroPadding填充时,没办法区分真实数据与填充数据,所以只适合以\0结尾的字符串加解密。

github aes 类

AES 类库

DEMO

*&---------------------------------------------------------------------*
*& Report Z_DCJM_AES2
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT z_dcjm_aes2.
DATA:
   lv_str TYPE string,
   keyTYPE xstring ,
   iv TYPE xstring ,
   mode   TYPE zcl_aes_utility=>mty_encryption_mode ,
   plaintext  TYPE xstring ,
   ciphertext TYPE xstring ,
   test   TYPE xstring ,
   paddingTYPE zcl_byte_padding_utility=>mty_padding_standard .

padding = zcl_byte_padding_utility=>mc_padding_standard_pkcs_7.

key = '2B7E151628AED2A6ABF7158809CF4F3C'.
iv  = '000102030405060708090A0B0C0D0E0F'.

*plaintext   = '6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17AD2B417BE66C3710'.
lv_str   = 'https://blog.csdn.net/u012232542/article/details/103184183'."纯文本

mode= zcl_aes_utility=>mc_encryption_mode_cbc.


"string --> xstring
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
  EXPORTING
text   = lv_str
  IMPORTING
buffer = plaintext
  EXCEPTIONS
failed = 1.


WRITE:/ '加密'.
zcl_aes_utility=>encrypt_xstring(
  EXPORTING
i_key   = key
i_data  = plaintext
i_initialization_vector = iv
i_encryption_mode   = mode
i_padding_standard  = padding
  IMPORTING
e_data  = test ).


  ciphertext = test.
  clear test.
* write:/ '解密'.
zcl_aes_utility=>decrypt_xstring(
  EXPORTING
i_key   = key
i_data  = ciphertext
i_initialization_vector = iv
i_encryption_mode   = mode
i_padding_standard  = padding
  IMPORTING
e_data  = test ).

"xstring --> string

DATA(lv_decrypt_string) = cl_abap_codepage=>convert_from(
EXPORTING
  source = test
).

问题

  1. 与java进行交互时使用 abap 都是16进制加密解密, java都是byte[] 进行加密解密,java需要注意都是加密解密后在tohex
  2. json 与abap 的格式转换代码如下

DATA: json_ser TYPE REF TO CL_TREX_JSON_SERIALIZER,
      json_des TYPE REF TO CL_TREX_JSON_DESERIALIZER.
DATA: jsonstr TYPE string.
DATA: BEGIN OF itab OCCURS 0,
  matnr LIKE makt-matnr,
  maktx LIKE makt-maktx,
  END OF itab.

START-OF-SELECTION.
  SELECT * INTO CORRESPONDING FIELDS OF TABLE itab
    FROM makt UP TO 10 ROWS.


***内表->JSON
  CREATE OBJECT json_ser
    EXPORTING
      data = itab[].
  CALL METHOD json_ser->SERIALIZE.
  CALL METHOD json_ser->GET_DATA
    RECEIVING
      rval = jsonstr.

WRITE: jsonstr.

***JSON->内表
  CREATE OBJECT json_des.
  CALL METHOD json_des->DESERIALIZE
    EXPORTING
      json = jsonstr
    IMPORTING
      abap = itab[].

json转换参考补充

json转换工具


优化

types: begin of t_record,
         key1 type string,
         key2 type string,
       end of t_record.

data: json type string.
data: record type t_record.

json = '{"key1": "VALUE1",  "key2": "VALUE2"}'.

/ui2/cl_json=>deserialize( exporting json = json changing data = record ).

"  abap 转json
  DATA(json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).
  CALL TRANSFORMATION id
                     SOURCE transno     = lv_transno
                            funcflag    = lv_funcflag
                            trandate    = lv_trandate
                            trantime    = lv_trantime
                            list        = gt_item1
                     RESULT XML json_writer.

  DATA(json) = json_writer->get_output( ).
  DATA: lv_json TYPE string .


  CALL FUNCTION 'ECATT_CONV_XSTRING_TO_STRING'
    EXPORTING
      im_xstring  = json
      im_encoding = 'UTF-8'
    IMPORTING
      ex_string   = lv_json.

  "抬头-key值驼峰式转换
  REPLACE  ALL OCCURRENCES OF 'TRANSNO'               IN lv_json    WITH 'transNo' .

注意

  1. 针对含有中文的必须使用base64进行加密才能避免乱码 java是 8 sap 是16
    2.应采用/ui2/cl_json=>deserialize( exporting json = json changing data = record ).
    避免json 日期格式转换错误。

[知乎-加密](对称加密与非对称加密 - 知乎 (zhihu.com))

相关文章

网友评论

      本文标题:abap 加密

      本文链接:https://www.haomeiwen.com/subject/tltgjltx.html