Sql 在Oracle中使用AES 128位解密十六进制字符串
我执行了下面的函数,将我的字符串转换为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 (
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>