Sql 在Oracle中使用AES 128位解密十六进制字符串

Sql 在Oracle中使用AES 128位解密十六进制字符串,sql,oracle,encryption,oracle11g,Sql,Oracle,Encryption,Oracle11g,我执行了下面的函数,将我的字符串转换为Oracle中的AES 128位加密密码文本 create or replace function get_enc_val ( p_in_val in varchar2, p_key in varchar2 ) return raw is l_enc_val raw(4000); begin l_enc_val := dbms_crypto.encrypt ( src => utl_i18n.string_to_raw (

我执行了下面的函数,将我的字符串转换为Oracle中的AES 128位加密密码文本

    create or replace function get_enc_val
 (
 p_in_val in varchar2,
 p_key in varchar2
 )
 return raw
 is
 l_enc_val raw(4000);
 begin
 l_enc_val := dbms_crypto.encrypt
 (
 src => utl_i18n.string_to_raw (p_in_val, 'AL32UTF8'),
 key => utl_i18n.string_to_raw (p_key, 'AL32UTF8'),
 typ => dbms_crypto.encrypt_aes128 +
 dbms_crypto.chain_cbc +
 dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;
当我从dual运行选择get_enc_val('1234','1234567890ghjkle');它的工作很好,给我的密码文本,但当我想解密它使用下面的函数,我得到错误“ORA-01465:无效的十六进制数”


有人能帮我理解这个问题吗?

我尝试了下面的方法,效果很好

加密:

 create or replace function get_enc_val
     (
     p_in_val in varchar2,
     p_key in varchar2
     )
     return raw
     is
     l_enc_val raw(4000);
     begin
     l_enc_val := dbms_crypto.encrypt
     (
     src => utl_raw.cast_to_raw(p_in_val),
     --You can also use: src => utl_i18n.string_to_raw (p_in_val, 'AL32UTF8') 
     key => utl_raw.cast_to_raw(p_key),
     typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
     );
     return l_enc_val;
     end;
    /
解密:

create or replace function get_dec_val
 (
 p_in_val in RAW,
 p_key in varchar2
 )
 return VARCHAR2 
 is
 l_enc_val VARCHAR2(4000);
 begin
 l_enc_val := dbms_crypto.DECRYPT
 (
 src => p_in_val, -- No Need to convert ROW to CHAR.
 key => utl_raw.cast_to_raw(p_key),
 typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;
/
然后使用

向瓦查尔施压2


我尝试了下面的方法,它是有效的

加密:

 create or replace function get_enc_val
     (
     p_in_val in varchar2,
     p_key in varchar2
     )
     return raw
     is
     l_enc_val raw(4000);
     begin
     l_enc_val := dbms_crypto.encrypt
     (
     src => utl_raw.cast_to_raw(p_in_val),
     --You can also use: src => utl_i18n.string_to_raw (p_in_val, 'AL32UTF8') 
     key => utl_raw.cast_to_raw(p_key),
     typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
     );
     return l_enc_val;
     end;
    /
解密:

create or replace function get_dec_val
 (
 p_in_val in RAW,
 p_key in varchar2
 )
 return VARCHAR2 
 is
 l_enc_val VARCHAR2(4000);
 begin
 l_enc_val := dbms_crypto.DECRYPT
 (
 src => p_in_val, -- No Need to convert ROW to CHAR.
 key => utl_raw.cast_to_raw(p_key),
 typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;
/
然后使用

向瓦查尔施压2


decrypt
函数和调用
函数的方式存在问题

您的
解密
函数应如下所示:

现在让我们测试一下:


干杯

您的
解密
函数以及如何调用
函数
存在问题

您的
解密
函数应如下所示:

现在让我们测试一下:


干杯

解密中的
src
key
应该是RAW,而不是一些字符类型如果我将src和key都更改为RAW,则会出现错误“无效十六进制值”。因此我尝试将src=>p_in_val和key=>utl_i18n.string_更改为_RAW(p_key,'AL32UTF8')但现在解密的输出与输入完全不同text@VivekSingh检查下面的答案。希望它能帮助你。解密中的
src
key
应该是原始的,而不是一些字符类型。如果我将src和key都更改为原始的,那么我会得到错误“无效的十六进制值”。因此,我尝试将src=>p_in_val和key=>utl_i18n.string_更改为_raw(p_key,'AL32UTF8'),但现在解密的输出与输入完全不同text@VivekSingh检查下面的答案。希望它能帮助你。
select utl_raw.cast_to_varchar2(get_dec_val('12519D97D5299702A284F2E530F58A20','1234567890ghjkle')) from dual;
SQL> CREATE OR REPLACE FUNCTION GET_DEC_VAL (
  2      P_IN_VAL   IN         RAW,
  3      P_KEY      IN         RAW
  4  ) RETURN VARCHAR2 IS
  5  BEGIN
  6      RETURN UTL_RAW.CAST_TO_VARCHAR2(
  7          DBMS_CRYPTO.DECRYPT(
  8              SRC => P_IN_VAL, -- this is already RAW data type, should not be changed to char
  9              KEY => P_KEY, -- this is already RAW data type, should not be changed to char
 10              TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO)); -- it returns RAW data type so converted to varchar2 using UTL_RAW.CAST_TO_VARCHAR2
 11  END;
 12  /
SQL> SELECT
  2      GET_DEC_VAL(
  3          '12519D97D5299702A284F2E530F58A20', 
  4          UTL_I18N.STRING_TO_RAW('1234567890ghjkle', 'AL32UTF8')) AS DECRYPTED_VAL
  5  FROM DUAL; -- ^^ converterd the key to RAW data type

DECRYPTED_VAL
--------------
1234

SQL>