ABAP 的 AES 加密

作者:郑德鼎 约 5 分钟阅读 更新日期:2025-03-02 1 年前更新 标签:ABAP, Data Engineering, 开发, 数据工程
ABAP 的 AES 加密 - 封面图
ABAP 的 AES 加密 - 封面图

AES的全称是Advanced Encryption

Standard,意思是高级加密标准,属于对称加密算法,(想了解对称加密参考https://www.jianshu.com/p/3840b344b27c),实现加密需要:明文

+ 密钥+

偏移量(IV)+密码模式(算法/模式/填充)。加密算法提供了五种不同的分组模式:CBC,ECB,CTR,CFB,OFB。AES采用分组密码体制,首先把明文切成一段一段的,每段的长度必须是128位16个字节,如果最后一段不够16个字节了,就要用Padding来把这段数据填满16个字节,然后分别对每段数据进行加密,最后再把每段加密数据拼接起来形成最终的密文,Padding模式(补齐模式)也有三种:PKCS5、PKCS7和NOPADDING,

PKCS5和PKCS7是指分组数据缺少几个字节,就在数据的末尾填充几个字节的几,比如缺少5个字节,就在末尾填充5个字节的5;NoPadding是指不需要填充,也就是说数据的发送方肯定会保证最后一段数据也正好是16个字节。AES要求密钥长度可以是128位16个字节、192位或者256位,位数越高,加密强度自然越大,但是加密的效率自然会低一些。

** 在项目开发中,由于需要对接口传参的敏感信息进行加密传输,外围系统对SAP提出需要对某些字段信息进行AES/ECB/PKCS5Padding加密。

**

ABAP 的 AES 加密 - 封面图
ABAP 的 AES 加密 - 封面图

电码本模式 ECB (Electronic codebook,ECB):需要加密的消息按照块密码的块大小被分为数个块,并对每个块进行独立加密。

ECB模式:最基本的加密模式,即仅仅使用明文和密钥来加密数据,相同的明文块会被加密成相同的密文块,这样明文和密文的结构将是完全一样的,就会更容易被破解,相对来说不是那么安全,因此很少使用。

PKCS5Padding是PKCS7Padding的子集,只是块大小固定为8字节。在AES/SM4等加密算法中,密码的最小长度都是16字节(128位),所以,事实上都没PKCS5Padding什么事了,只有在类似RC2

/ RC5和 DES/3DES 算法的情況,这些算法 BlockSize=64bits=8bytes算法才有有到PKCS5Padding。

原理:使用Github开源项目AES algorithm implementation by ABAP, 地址如下

https://github.com/Sumu-Ning/AES

通过abapgit安装项目代码,激活开发类

在本例中,SAP调用外围系统提供的接口,需要对请求报文HEADER中的account(用户名),time(JAVA时间戳)进行拼接再进行加密,同时将加密好的字符串放到HEADER中的sign(签名)字段上,用以双方系统识别,加密密钥(key)由外围系统提供。

示例代码:

*&--Unix时间戳到毫秒级GET TIME STAMP FIELD lv_timestampl.lv_str_timestampl = lv_timestampl.cl_pco_utility=>convert_abap_timestamp_to_java(EXPORTINGiv_date = CONV #( lv_str_timestampl(8) )iv_time = CONV #( lv_str_timestampl+8(6) )iv_msec = CONV #( lv_str_timestampl+15(3) )IMPORTINGev_timestamp = lv_java_timestamp)."时间戳ls_json-time = lv_java_timestamp.

"AES-ECB 加密mode = zcl_aes_utility=>mc_encryption_mode_ecb.padding = zcl_byte_padding_utility=>mc_padding_standard_pkcs_7.

lv_plaintext = ls_json-account && lv_java_timestamp. CALL FUNCTION 'SCMS_STRING_TO_XSTRING'EXPORTINGtext = lv_plaintext* mimetype = mimetypeIMPORTINGbuffer = plaintextEXCEPTIONSfailed = 1OTHERS = 2. CALL FUNCTION 'SCMS_STRING_TO_XSTRING'EXPORTINGtext = lv_key* mimetype = mimetypeIMPORTINGbuffer = keyEXCEPTIONSfailed = 1OTHERS = 2.

zcl_aes_utility=>encrypt_xstring(EXPORTINGi_key = keyi_data = plaintexti_initialization_vector = ivi_encryption_mode = modei_padding_standard = paddingIMPORTINGe_data = test ).

CALL FUNCTION 'SCMS_BASE64_ENCODE_STR'EXPORTINGinput = testIMPORTINGoutput = lv_str."签名ls_json-sign = lv_str.

SAP标准方法(cl_sec_sxml_writer)AES加密模式为CBC,填充为pkcs7padding,支持AES128,AES192,AES256。

密码分组链接模式(CBC):将整段明文切成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与密钥进行加密。在 CBC 模式下,使用 AES

加解密方式进行分组加解密时,需要用到的两个参数:1、初始化向量,也就是偏移量,2、加解密秘钥。

ABAP 的 AES 加密 - 封面图
ABAP 的 AES 加密 - 封面图

CBC模式:比ECB模式多了一个初始向量IV,加密的时候,第一个明文块会首先和初始向量IV做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全,我们常用的就是CBC加密模式。

具体用法可参考https://blog.csdn.net/xiefireworks/article/details/124832051。

郑德鼎

关于作者:郑德鼎

企业信息化与 SAP 技术顾问,长期专注 SAP ABAP、FI/CO、MM、SD 等模块的技术分享与实战经验总结。查看更多介绍

来源说明:本文内容由「ABAP的AES加密.md」整理生成,仅用于内部技术分享与学习交流。