如果邮件长度超过15个字符,则AES解密失败

2020-08-28 20:12发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们需要解密由外部服务器发送的消息。 加密期间使用的算法是AES128/ECB/PKCS5。 我们已遵循此 AES加密博客,并且已使用co_aes128_algorithm_pem代替了co_aes256_algorithm_pem。

它运行良好,可以在邮件大小小于15个字符时解密示例邮件。 当我们尝试解密长度超过15个字符的邮件时,它失败了,但出现以下异常。

发生异常,下面将对其进行详细说明。 该异常已分配给类" CX_SEC_SXML_ENCRYPT_ERROR",并且未在过程" DECRYPT""((METHOD)""中捕获,也没有通过RAISING子句传播。 由于该过程的调用者无法预料到此异常,因此当前程序已终止。 发生这种情况的原因是:解密XML数据时出错。

以下代码段用于解密。 请帮助我们解决问题。

 i_iv ='00000000000000000000000000000000'。
 如果i_text不是初始的。
   调用函数'SCMS_BASE64_DECODE_STR'
     出口
       输入= i_text
 * UNESCAPE ='X'
     输入
       输出= i_xstring
 *例外情况
 *失败= 1
 *其他= 2
     。
   如果sy-subrc <> 0。
 *在这里实施适当的错误处理
   万一。

 万一。
 如果i_xstring不是初始的。
 *为了使CL_SEC_SXML_WRITER与外部应用程序一起使用,我们需要添加16位
 *解密前需要额外填充
   以字节模式将i_iv(16)i_xstring连接到i_xstring。
   尝试。
       cl_sec_sxml_writer =>解密(
         出口
           密文= i_xstring
           键= i_key_xstring
           算法= cl_sec_sxml_writer => CO_AES128_ALGORITHM_PEM
         输入
           明文= lv_message_decrypted)。
       "将xstring转换为字符串以进行输出
       cl_abap_conv_in_ce =>创建(输入= lv_message_decrypted)->读取(导入数据= e_text_dec)。
       写道:/e_text_dec。
       将cx_sec_sxml_encrypt_error捕获到data(oref)中。
   努力。
 endif。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


我们需要解密由外部服务器发送的消息。 加密期间使用的算法是AES128/ECB/PKCS5。 我们已遵循此 AES加密博客,并且已使用co_aes128_algorithm_pem代替了co_aes256_algorithm_pem。

它运行良好,可以在邮件大小小于15个字符时解密示例邮件。 当我们尝试解密长度超过15个字符的邮件时,它失败了,但出现以下异常。

发生异常,下面将对其进行详细说明。 该异常已分配给类" CX_SEC_SXML_ENCRYPT_ERROR",并且未在过程" DECRYPT""((METHOD)""中捕获,也没有通过RAISING子句传播。 由于该过程的调用者无法预料到此异常,因此当前程序已终止。 发生这种情况的原因是:解密XML数据时出错。

以下代码段用于解密。 请帮助我们解决问题。

 i_iv ='00000000000000000000000000000000'。
 如果i_text不是初始的。
   调用函数'SCMS_BASE64_DECODE_STR'
     出口
       输入= i_text
 * UNESCAPE ='X'
     输入
       输出= i_xstring
 *例外情况
 *失败= 1
 *其他= 2
     。
   如果sy-subrc <> 0。
 *在这里实施适当的错误处理
   万一。

 万一。
 如果i_xstring不是初始的。
 *为了使CL_SEC_SXML_WRITER与外部应用程序一起使用,我们需要添加16位
 *解密前需要额外填充
   以字节模式将i_iv(16)i_xstring连接到i_xstring。
   尝试。
       cl_sec_sxml_writer =>解密(
         出口
           密文= i_xstring
           键= i_key_xstring
           算法= cl_sec_sxml_writer => CO_AES128_ALGORITHM_PEM
         输入
           明文= lv_message_decrypted)。
       "将xstring转换为字符串以进行输出
       cl_abap_conv_in_ce =>创建(输入= lv_message_decrypted)->读取(导入数据= e_text_dec)。
       写道:/e_text_dec。
       将cx_sec_sxml_encrypt_error捕获到data(oref)中。
   努力。
 endif。
付费偷看设置
发送
2条回答
我是小鹏鹏啊
1楼-- · 2020-08-28 21:01

SAP实施用于CBC模式,并且您的数据已使用ECB加密。

它的前16个字节有效,假设IV双方都相同,例如 零,因为AES的块长度是128位= 16个字节,并且没有链接发生。

您可以相应地更改加密或在ABAP(不是内核模块)中使用AES实现,例如:

https://github.com/Sumu-Ning/AES (未经我的测试 )。

风早神人
2楼-- · 2020-08-28 20:43

另一种选择是将邮件拆分为16个字节的块,并依次对其进行解密。 这样,您将保持在EBC模式。

一周热门 更多>