对称加密与非对称加密
简介
对称加密:加密和解密用的是同一个密码或者同一套逻辑的加密方式 例如: **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 类
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
).
问题
- 与java进行交互时使用 abap 都是16进制加密解密, java都是byte[] 进行加密解密,java需要注意都是加密解密后在tohex
- 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' .
注意
- 针对含有中文的必须使用base64进行加密才能避免乱码 java是 8 sap 是16
2.应采用/ui2/cl_json=>deserialize( exporting json = json changing data = record ).
避免json 日期格式转换错误。
[知乎-加密](对称加密与非对称加密 - 知乎 (zhihu.com))
网友评论