在PostgreSQL中解密Feistel密码

在PostgreSQL中解密Feistel密码,postgresql,user-defined-functions,encryption,feistel-cipher,Postgresql,User Defined Functions,Encryption,Feistel Cipher,我用这个更新了数据库中的一堆字段。根据文档,可以撤消密码以获得原始值。如果需要,如何撤消这些值 以下是原始密码函数: CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE int) returns bigint AS $$ DECLARE l1 int; l2 int; r1 int; r2 int; i int:=0; BEGIN l1:= (VALUE >> 16) & 65535; r1:= VALUE & 6553

我用这个更新了数据库中的一堆字段。根据文档,可以撤消密码以获得原始值。如果需要,如何撤消这些值

以下是原始密码函数:

CREATE OR REPLACE FUNCTION pseudo_encrypt(VALUE int) returns bigint AS $$
DECLARE
l1 int;
l2 int;
r1 int;
r2 int;
i int:=0;
BEGIN
 l1:= (VALUE >> 16) & 65535;
 r1:= VALUE & 65535;
 WHILE i < 3 LOOP
   l2 := r1;
   r2 := l1 # ((((1366.0 * r1 + 150889) % 714025) / 714025.0) * 32767)::int;
   l1 := l2;
   r1 := r2;
   i := i + 1;
 END LOOP;
 RETURN ((l1::bigint << 16) + r1);
END;
$$ LANGUAGE plpgsql strict immutable;
CREATE或REPLACE函数pseudo_encrypt(VALUE int)将bigint返回为$$
声明
l1 int;
l2-int;
r1 int;
r2int;
i int:=0;
开始
l1:=(值>>16)和65535;
r1:=值&65535;
当我<3圈时
l2:=r1;
r2:=l1#((1366.0*r1+150889)%714025)/714025.0)*32767):int;
l1:=l2;
r1:=r2;
i:=i+1;
端环;

RETURN((l1::bigint您首先可以使用这个自可逆变量:

CREATE FUNCTION rev_pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 int;
l2 int;
r1 int;
r2 int;
i int:=0;
BEGIN
 l1:= (VALUE >> 16) & 65535;
 r1:= VALUE & 65535;
 WHILE i < 3 LOOP
   l2 := r1;
   r2 := l1 # ((((1366.0 * r1 + 150889) % 714025) / 714025.0) * 32767)::int;
   l1 := l2;
   r1 := r2;
   i := i + 1;
 END LOOP;
 RETURN ((r1::bigint<<16) + l1);
END;
$$ LANGUAGE plpgsql strict immutable;

首先,您可以使用这个自可逆变量

CREATE FUNCTION rev_pseudo_encrypt(VALUE bigint) returns bigint AS $$
DECLARE
l1 int;
l2 int;
r1 int;
r2 int;
i int:=0;
BEGIN
 l1:= (VALUE >> 16) & 65535;
 r1:= VALUE & 65535;
 WHILE i < 3 LOOP
   l2 := r1;
   r2 := l1 # ((((1366.0 * r1 + 150889) % 714025) / 714025.0) * 32767)::int;
   l1 := l2;
   r1 := r2;
   i := i + 1;
 END LOOP;
 RETURN ((r1::bigint<<16) + l1);
END;
$$ LANGUAGE plpgsql strict immutable;