1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| create or replace function decrypt (in s_in varchar, in s_key varchar) returns varchar as $$
declare
lkey int;
ls int;
i int;
offs int;
newcode int;
resultat varchar;
begin
resultat:='';
lkey:=length(s_key);
ls:=length(s_in);
for i in 1..ls
loop
offs:=ascii(substr(s_key,(i-1)%lkey + 1,1));
newcode:=test(ascii(substr(s_in,i,1)),-offs,32,121);
resultat:=resultat||chr(newcode);
end loop;
return resultat;
end;$$ language 'plpgsql' immutable;
create or replace function test (val in int, offs in int, minVal in int, maxVal in int) returns int as $$
declare
xOffset integer;
newOffset integer;
newVal integer;
range integer;
begin
range=maxval-minval+1;
newOffset=(offs/abs(offs))*(abs(offs) % range);
newVal=val-minVal;
xOffset=(newVal+newOffset) % range;
if xOffset < 0 then
xOffset=range+xOffset;
end if;
return xOffset+minVal;
end; $$ language plpgsql immutable; |