Plsql 我正在使用下面的函数解密代码?能帮我解决吗?

Plsql 我正在使用下面的函数解密代码?能帮我解决吗?,plsql,plsqldeveloper,mod-plsql,Plsql,Plsqldeveloper,Mod Plsql,ibp_crypto_decrypt=ORA-28817:PL/SQL函数返回了一个错误 function ibp_crypto_decrypt ( p_session_id in RAW) return raw is l_decrypted_raw RAW(2048); l_encrypted_raw RAW(2048) := p_session_id; l_key RAW(128) := UTL_RAW.cast_to_raw('abcdefgh'

ibp_crypto_decrypt=ORA-28817:PL/SQL函数返回了一个错误

function ibp_crypto_decrypt ( p_session_id in RAW) return raw is
l_decrypted_raw     RAW(2048);
l_encrypted_raw     RAW(2048) := p_session_id;
l_key               RAW(128) := UTL_RAW.cast_to_raw('abcdefgh');
begin
dbms_output.put_line('l_encrypted_raw '||'='||l_encrypted_raw);
l_decrypted_raw := DBMS_CRYPTO.decrypt(src => l_encrypted_raw, 
                                       typ => DBMS_CRYPTO.des_cbc_pkcs5, 
                                       key => l_key); 
DBMS_OUTPUT.put_line('Decrypted : ' || UTL_RAW.cast_to_varchar2(l_decrypted_raw))   ;                                      
return l_decrypted_raw;--RAWTOHEX(UTL_RAW.cast_to_varchar2(l_decrypted_raw));                                          
exception when others
then
dbms_output.put_line(' ibp_crypto_decrypt'||'='||sqlerrm||dbms_utility.format_error_backtrace);
end;                                         

我已经用一个实际值的加密完成了您的示例,它按照预期工作。您确定正确加密了该值吗

ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67
ORA-06512: at "SYS.DBMS_CRYPTO", line 44
ORA-06512: at "IBOXV5_TEST.IBK_CRYPTO_ENCRYPTION", line 28
Oracle支持部门表示:

将加密值传递给解密函数或存储在数据库中时,不要使用UTL_I18N.RAW_to_CHAR,而应使用RAWTOHEXUTL_ENCODE.BASE64_ENCODE。同样,对于转换回原始数据,不要使用UTL_I18N.STRING_转换为原始数据,而是使用HEXTORAWUTL_ENCODE.BASE64_DECODE

因此,答案取决于如何创建传递给函数的原始值。
根据我在Oracle 12.2中使用
UTL\u RAW.cast\u to\u RAW
函数的经验,有时也会导致
ORA-06512:在解密函数中的“SYS.DBMS\u CRYPTO\u FFI”第67行

我的回答是否解决了这个问题?如果是,请接受答案并关闭问题或评论。当您使用
utl\u raw.cast\u to\u raw
utl\u raw.cast\u to\u varchar2
时,有时可能会发生上述错误。当您编码类似于
12345678
的内容时,就可以了。但是如果您尝试更长的时间,您将在第67行的“SYS.DBMS\u CRYPTO\u FFI”中获得ORA-06512:
DECLARE
    l_input VARCHAR2(30) := utl_raw.cast_to_raw('12345678');
    l_encrypted_raw RAW(2048);
    l_decrypted_raw RAW(2048);
    l_key RAW(128) := utl_raw.cast_to_raw('abcdefgh');
BEGIN
    l_encrypted_raw := dbms_crypto.encrypt(src=>l_input, typ=>dbms_crypto.des_cbc_pkcs5, key=>l_key);
    l_decrypted_raw := dbms_crypto.decrypt(src=>l_encrypted_raw, typ=>dbms_crypto.des_cbc_pkcs5, key=>l_key);
    dbms_output.put_line('Decrypted : ' || utl_raw.cast_to_varchar2(l_decrypted_raw));
END;
/