Skip to Main Content

SQL & PL/SQL

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

How to write a decryption function?

Winters TsaiJan 20 2015 — edited Jan 21 2015

Hi! everybody,


I see an encryption function in my database.


select  f_pwd_encrypt('password') from dual


-->12412913141313139139130121


My question is


How to write a decryption function?


Like:


select f_pwd_decrypt('12412913141313139139130121') from dual


-->password

CREATE OR REPLACE FUNCTION EPADM."F_PWD_ENCRYPT" ( vpwd in varchar2)

return varchar2

is

    vother_p   varchar2(9);

    vtr_pwd  varchar2(2048);

    i       number;

    j         number;

    vsubstr varchar2(9);

    vtemp1 varchar2(08);

    vvalue number := 0;

    vdb_pwd varchar2(100);

    function str_2_bit(vstring in varchar2)

    return varchar2

    is

       i number;

       vtemp number;

       v1 varchar(2048);

     function single_byte(vin in number)

       return varchar2

       is

         i number;

         vresult varchar2(08);

         vtemp number := vin;

       begin

         for i in 1..8 loop

           vresult := to_char(mod(vtemp,2))||vresult;

           vtemp := trunc(vtemp/2);

         end loop;

         return(vresult);

       end;

  --

    begin

      for i in 1..lengthb(vstring) loop

        select to_number(substrb(dump( vstring ,10,i,1),instr(dump( vstring ,10,i,1),' ',-1)+1))

          into vtemp

        from dual;

        v1 := v1 || single_byte(vtemp);

      end loop;

      return(v1);

    end;

begin

  vtr_pwd := str_2_bit(vpwd);

  vtr_pwd := substrb(vtr_pwd,4)||substrb(vtr_pwd,1,3);

  vvalue := 0;

  vdb_pwd := null;

   for i in  1..(lengthb(vtr_pwd)/4)  loop

     vtemp1 := substrb(vtr_pwd,(i-1)*4+1,4);

     for j in 1..4 loop

       vvalue :=  vvalue + to_number(substrb(vtemp1,j,1)) * power(2,j-1);

       dbms_output.put_line(j||' '||vvalue);

     end loop;

          vdb_pwd := to_char(vvalue) ||vdb_pwd;

          vvalue := 0;

   end loop;

  return(vdb_pwd);

END;

/

This post has been answered by BluShadow on Jan 20 2015
Jump to Answer
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Feb 18 2015
Added on Jan 20 2015
21 comments
3,732 views