--我这里使用的是utl_i18n.string_to_raw进行数据类型的转换,这是因为encrypt函数不但需要raw型数据,而且还需要使用专门的字符集—AL32UTF8,这里如果使用utl_raw.cast_to_raw,则会出现“ORA-06512”错误。
--只需要对解密函数写deterministic确定性函数
grant execute on SYS.DBMS_CRYPTO to enc;
create or replace function enc.encrypt(v_string in varchar2) return varchar2 is
encrypted_raw RAW (2000);
encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES + SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;
v_key raw(128) := utl_i18n.string_to_raw( 'artos0011', 'AL32UTF8' );
begin
encrypted_raw := DBMS_CRYPTO.ENCRYPT
(
src => UTL_I18N.STRING_TO_RAW (v_string,'AL32UTF8'),
typ => encryption_type,
key => v_key
);
return RAWTOHEX(encrypted_raw);
end encrypt;
/
create or replace function enc.decrypt(v_str in varchar2) return varchar2 is
decrypted_raw raw(2000);
encryption_type PLS_INTEGER := SYS.DBMS_CRYPTO.ENCRYPT_DES + SYS.DBMS_CRYPTO.CHAIN_CBC + SYS.DBMS_CRYPTO.PAD_PKCS5;
v_key raw(128) := utl_i18n.string_to_raw( 'artos001', 'AL32UTF8' );
begin
decrypted_raw := DBMS_CRYPTO.Decrypt
(
src => HEXTORAW(v_str),
typ => encryption_type,
key => v_key
);
return UTL_I18N.RAW_TO_CHAR (decrypted_raw, 'AL32UTF8');
end decrypt;
/
s