Oracle FAQ Your Portal to the Oracle Knowledge Grid
HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US
 

Home -> Community -> Usenet -> c.d.o.misc -> Re: Encrypting a data field

Re: Encrypting a data field

From: mark tomlinson <marktoml_at_gdi.net>
Date: Tue, 05 May 1998 12:13:31 GMT
Message-ID: <354f0228.333680326@newshost.us.oracle.com>


Here is a PLSQL function that will do this, you decide how best to fit this into your setup...



--

create or replace function encrypt (name_in char, password char) return char as

   l_name varchar2(30);
   l_password varchar2(30);
   l_root     number;
   l_offset   number;
   l_shift    number;
   l_answer   varchar2(30);
   l_char     varchar2(1);
   l_position number;

begin  


  if length(name_in) < 3 or

     length(password) < 3 then
     return '-1';

  end if;

  if length(name_in) > 30 or

     length(password) > 30 then
     return '-2';

  end if;

  l_name := upper(name_in);
  l_password := upper(password);


  for i in 1..length(l_name) loop

     l_shift := ascii(substr(l_name, i, 1));
     if l_shift < 65 or
        l_shift > 90 then
          l_shift := 65 + mod(l_shift, 24);
     
          l_name := substr(l_name, 1, i-1) ||
                    chr(l_shift)           ||
                    substr(l_name, i+1);
     end if;
   end loop;     

  for i in 1..length(l_password) loop

     l_shift := ascii(substr(l_password, i, 1));
     if l_shift < 65 or
        l_shift > 90 then
          l_shift := 65 + mod(l_shift, 24);
     
          l_password := substr(l_password, 1, i-1) ||
                        chr(l_shift)           ||
                        substr(l_password, i+1);
     end if;

   end loop;
  l_offset := ascii(substr(l_name, 2, 1));
  l_root   := ascii(substr(l_password, length(l_password)));
  l_shift  := ascii(substr(l_name, length(l_name)));
  l_shift  := mod(l_shift, 13);
  l_answer := l_name || l_password;

  ----------------------

  l_position := 1;

  for i in 1..30 loop

     if length(l_answer) >= 30 then
        exit;
     end if;

     l_shift := l_shift + l_offset + i;
     if l_shift > 90 then
        l_shift := mod(l_shift, 24);
        l_shift := l_shift + 65;
     end if;

     l_char := chr(l_shift);

     -- alternately place stuffing characters on 
     -- either end of password

     if l_position = 1 then
        l_answer := l_answer || l_char; 
        l_position := 0;
     else
        l_answer := l_char || l_answer;
        l_position := 1;
     end if;

  end loop;


 for i in 1..30 loop

     l_shift := ascii(substr(l_answer, i, 1));

     l_shift := l_shift + l_root + i;

     if l_shift > 90 then
        l_shift := mod(l_shift, 24);
        l_shift := l_shift + 65;
     end if;

     l_answer := substr(l_answer, 1, i-1) ||
                 chr(l_shift)             ||
                 substr(l_answer, i+1);

 end loop;  


 return l_answer;
end;
/ Received on Tue May 05 1998 - 07:13:31 CDT

Original text of this message

HOME | ASK QUESTION | ADD INFO | SEARCH | E-MAIL US