3
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;                                         

ibp_crypto_decrypt=ORA-28817: PL/SQL 函数返回错误。

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
4

2 回答 2

1

我已经通过对实际值的加密完成了您的示例,并且它按预期工作。您确定您正确加密了该值吗?

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;
/
于 2014-06-04T06:31:19.183 回答
1

甲骨文支持说:

当您将加密值传递给解密函数或存储在数据库中时,不要使用 UTL_I18N.RAW_TO_CHAR 而是使用RAWTOHEXUTL_ENCODE.BASE64_ENCODE。同样,对于转换回 raw 不要使用 UTL_I18N.STRING_TO_RAW 而是使用HEXTORAWUTL_ENCODE.BASE64_DECODE

因此,答案取决于您如何创建传递给函数的 RAW 值。根据我在 Oracle 12.2 中使用UTL_RAW.cast_to_raw函数的经验,有时也会导致ORA-06512: at "SYS.DBMS_CRYPTO_FFI", line 67解密函数。

于 2021-03-05T06:20:20.737 回答