CL_SEC_SXML_WRITER => DECRYPT AES解密失败/CX_SEC_SXML_ENCRYPT_ERROR

2020-08-15 11:55发布

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

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


尊敬的SAP社区,

我的目标是使用给定的密码在一个程序中对字符串进行加密,并将加密后的结果保存在文件中。 在另一个程序中,我将从该文件中读取加密的消息并将其解密。

我正在使用CL_SEC_SXML_WRITER => ENRCYPT进行加密,并使用CL_SEC_SXML_WRITER => DECRYPT进行解密(算法:cl_sec_sxml_writer => co_aes256_algorithm)。 加密工作顺利。 尝试解密时,出现异常:CX_SEC_SXML_ENCRYPT_ERROR(UNCAUGHT_EXCEPTION)。

如果我在同一程序中进行加密和解密,则一切正常。 仅当我将加密和解密分为两个程序时,我才会获得异常。

我的加密演示:

报告y_enrypt_txt。

参数:
p_msg类型字符串强制默认'这是我的测试'小写字母,
p_pwd类型字符串强制默认'1234'小写字母,

p_file类型字符串强制小写字母。

开始选择。

*创建消息
DATA(lr_conv_sec)= cl_abap_conv_out_ce => create()。
lr_conv_sec-> write(p_msg)。

*创建密钥
DATA(lr_conv_key)= cl_abap_conv_out_ce =>创建()。
键= lr_conv_key-> get_buffer()
算法= cl_sec_sxml_writer => co_aes256_algorithm
导入
密文= DATA(lv_message))。

OPEN DATASET p_file用于在二进制模式下输出。
将lv_message传输到p_file。
关闭数据集p_file。

我的解密演示

报告y_decrypt_txt。

数据:
lv_enc_msg_xstring TYPE xstring,
lf_plaintext_file TYPE xstring,
lv_decrypted_string TYPE类型

参数:
p_pwd类型字符串强制默认'1234'小写字母,

p_file类型字符串强制默认小写​​字母。

开始选择。

打开数据集p_file以便以二进制模式输入。
读取数据集p_file到lv_enc_msg_xstring。
关闭数据集p_file。

*创建密钥
DATA(lr_conv_key)= cl_abap_conv_out_ce => create()。
lr_conv_key->写入(p_pwd)。

*使用AES256解密

cl_sec_sxml_writer =>解密(
导出
密文= lv_enc_msg_xstring
密钥= lr_conv_key-> get_buffer()

算法= cl_sec_sxml_writer => co_aes256_algorithm

导入
plaintext = lf_plaintext_file)。

cl_abap_conv_in_ce =>创建(输入= lf_plaintext_file)->读取(导入数据= lv_decrypted_string)。

写:/'已解密:',lv_decrypted_string。

我在做什么错? 为什么可以在同一程序中进行加密和解密? 如果将代码分成两个程序,为什么会出现异常?

最诚挚的问候,

饭能

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

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


尊敬的SAP社区,

我的目标是使用给定的密码在一个程序中对字符串进行加密,并将加密后的结果保存在文件中。 在另一个程序中,我将从该文件中读取加密的消息并将其解密。

我正在使用CL_SEC_SXML_WRITER => ENRCYPT进行加密,并使用CL_SEC_SXML_WRITER => DECRYPT进行解密(算法:cl_sec_sxml_writer => co_aes256_algorithm)。 加密工作顺利。 尝试解密时,出现异常:CX_SEC_SXML_ENCRYPT_ERROR(UNCAUGHT_EXCEPTION)。

如果我在同一程序中进行加密和解密,则一切正常。 仅当我将加密和解密分为两个程序时,我才会获得异常。

我的加密演示:

报告y_enrypt_txt。

参数:
p_msg类型字符串强制默认'这是我的测试'小写字母,
p_pwd类型字符串强制默认'1234'小写字母,

p_file类型字符串强制小写字母。

开始选择。

*创建消息
DATA(lr_conv_sec)= cl_abap_conv_out_ce => create()。
lr_conv_sec-> write(p_msg)。

*创建密钥
DATA(lr_conv_key)= cl_abap_conv_out_ce =>创建()。
键= lr_conv_key-> get_buffer()
算法= cl_sec_sxml_writer => co_aes256_algorithm
导入
密文= DATA(lv_message))。

OPEN DATASET p_file用于在二进制模式下输出。
将lv_message传输到p_file。
关闭数据集p_file。

我的解密演示

报告y_decrypt_txt。

数据:
lv_enc_msg_xstring TYPE xstring,
lf_plaintext_file TYPE xstring,
lv_decrypted_string TYPE类型

参数:
p_pwd类型字符串强制默认'1234'小写字母,

p_file类型字符串强制默认小写​​字母。

开始选择。

打开数据集p_file以便以二进制模式输入。
读取数据集p_file到lv_enc_msg_xstring。
关闭数据集p_file。

*创建密钥
DATA(lr_conv_key)= cl_abap_conv_out_ce => create()。
lr_conv_key->写入(p_pwd)。

*使用AES256解密

cl_sec_sxml_writer =>解密(
导出
密文= lv_enc_msg_xstring
密钥= lr_conv_key-> get_buffer()

算法= cl_sec_sxml_writer => co_aes256_algorithm

导入
plaintext = lf_plaintext_file)。

cl_abap_conv_in_ce =>创建(输入= lf_plaintext_file)->读取(导入数据= lv_decrypted_string)。

写:/'已解密:',lv_decrypted_string。

我在做什么错? 为什么可以在同一程序中进行加密和解密? 如果将代码分成两个程序,为什么会出现异常?

最诚挚的问候,

饭能

付费偷看设置
发送
6条回答
当学会了学习
1楼-- · 2020-08-15 12:22

里卡多,你好

代替CL_SEC_SXML_WRITER => ENCRYPT尝试使用ENCRYPT_IV方法,它具有其他导入参数Initialization Vector。 我将IV参数与初始值一起使用,如下所示,它以这种方式工作。 我希望它也适用于您的情况!

 cl_sec_sxml_writer => encrypt_iv(
   出口
     明文= lr_conv_sec-> get_buffer()
     键= lr_conv_key-> get_buffer()
     算法= cl_sec_sxml_writer => co_aes256_algorithm_pem
     iv ='00000000000000000000000000000000'
   输入
     密文= DATA(lv_message))。
My梦
2楼-- · 2020-08-15 12:36

您好,Juanmi,您解决了这个问题吗?

我目前在CL_SEC_SXML_WRITE上也遇到同样的问题。 我编写了一个测试程序,该程序从前端上传XML文件,然后加密并再次将其下载到前端,并添加文件名"已加密"。 到那时为止,一切正常。

当我尝试上载和解密以前加密的文件时,ABAP转储开始了:CX_SEC_SXML_ENCRYPT_ERROR:XML数据解密失败。 此外,在使用rijndael_utility解密时,尾随字符在XML末尾添加。

当我加密后立即解密时,就像您已经提到的那样,这没问题。

我尝试使用AES256,AES128。

外部接收者说他们没有办法处理它。

有什么方法可以避免这种情况?

shere_lin
3楼-- · 2020-08-15 12:12

你好,

我有同样的问题,我的班级没有ENCRYPT_IV(或crypto_iv)。 菲利普,我们需要解密,加密才能成功。

直接调用DECRYPT方法时出现错误。 我已经测试过调用具有与ENCRYPT方法相同的值的调用,它可以完美运行,但是当尝试多带带执行操作时,它会给我们转储。

预先感谢

Nan4612
4楼-- · 2020-08-15 12:38

我已经成功使用了上述加密/解密方法。 请记住使用正确的加密密钥长度,即对于XSTRING,它将是:
AES128-32个字符
AES192-48个字符
AES256-64个字符。

您可以在CL_SEC_SXML_WRITER的本地测试类中找到用法示例,例如 在方法LCL_XML_SECURITY_TEST-> SYMMTRIC_ENC_WITH_IV

常量:lf_aes128_key类型xstring值'2B7E151628AED2A6ABF7158809CF4F3C'
 ,lf_aes192_key类型xstring值'8E73B0F7DA0E6452C810F32B809079E562F8EAD2522C6B7B'
 ,lf_aes256_key类型xstring值'603DEB1015CA71BE2B73AEF0857D77811F352C073B6108D72D9810A30914DFF4'
 
打个大熊猫
5楼-- · 2020-08-15 12:24

嗨,饭能。
这里有同样的问题。 您找到解决方案了吗?

歪着头看世界
6楼-- · 2020-08-15 12:37

您好,

我遇到了同样的问题,并且该问题与无法正常运行的算法256有关: /img/questions/6654008/hmac-sha256.html

尝试使用cl_sec_sxml_writer => co_aes128_algorithm并检查其是否有效。 对我来说就是解决方案。

一周热门 更多>