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加密。
**
电码本模式 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、加解密秘钥。
CBC模式:比ECB模式多了一个初始向量IV,加密的时候,第一个明文块会首先和初始向量IV做异或操作,然后再经过密钥加密,然后第一个密文块又会作为第二个明文块的加密向量来异或,依次类推下去,这样相同的明文块加密出的密文块就是不同的,明文的结构和密文的结构也将是不同的,因此更加安全,我们常用的就是CBC加密模式。
具体用法可参考https://blog.csdn.net/xiefireworks/article/details/124832051。