Oracle FAQ | Your Portal to the Oracle Knowledge Grid |
Home -> Community -> Usenet -> c.d.o.misc -> Re: Encrypting a data field
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';
if length(name_in) > 30 or
length(password) > 30 then return '-2';
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;
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