oracle中使用des进行加密,如果oracle编码UTF-8时,会出现编码错误。要进行转码。
网上查找的代码都会出现 中文截断的现象,比如 "加密这个1",会把“1”漏了加密,这是因为使用了length()函数的原因,使用lengthb()则不会出现问题。
优化空字节处理和解密空白字符处理
编码方法如下:
CREATE OR REPLACE function
encrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
v_text varchar2(4000);
v_enc varchar2(4000);
raw_input RAW(128) ;
key_input RAW(128) ;
decrypted_raw RAW(2048);
begin
dbms_output.put_line(p_text);
v_text := rpad( p_text, (trunc(lengthb(p_text)/8)+1)*8, chr(0));
dbms_output.put_line(v_text);
raw_input := UTL_I18N.STRING_TO_RAW(v_text,'ZHS16GBK');
key_input := UTL_I18N.STRING_TO_RAW(p_key,'ZHS16GBK');
dbms_obfuscation_toolkit.DESEncrypt(input => raw_input,key => key_input,encrypted_data =>decrypted_raw);
v_enc := rawtohex(decrypted_raw);
dbms_output.put_line(v_enc);
return v_enc;
end;
/
对应的解码方法:
CREATE OR REPLACE function WPGL.decrypt_des(p_text varchar2, p_key varchar2) return varchar2 is
p_text_raw RAW(2000);
p_key_raw RAW(2000);
v_text_raw RAW(2000);
v_text varchar2(2000);
begin
if(p_text is null or p_text = '' )
then return '';
end if;
p_text_raw := HEXTORAW(p_text);
p_key_raw := UTL_I18N.STRING_TO_RAW(p_key, 'ZHS16GBK');
dbms_obfuscation_toolkit.DESDECRYPT(input => p_text_raw, key =>p_key_raw, decrypted_data=> v_text_raw);
v_text := UTL_I18N.RAW_TO_CHAR(v_text_raw, 'ZHS16GBK');
dbms_output.put_line(v_text);
return rtrim(v_text,chr(0));
end;
/