Oracle 版的RC4加密函数
CREATE OR REPLACE FUNCTION RC4(FBuffer VARCHAR2) RETURN VARCHAR2 IS
------------------------------------------------------------------------------------
-- FBuffer: 要进行加密的字符串
-- ex.
-- select RC4('plain_text') from dual;
------------------------------------------------------------------------------------
KeyLen NUMBER(10); --键值长度
CipherText VARCHAR2(512):=''; --加密后的字符串
TYPE AR IS VARRAY(256) OF VARCHAR2(10);
FState AR := AR();
K AR := AR();
FOutputArray AR := AR();
FKey AR := AR();
I INTEGER;
J INTEGER;
T INTEGER;
FInputLength INTEGER;
TEMP VARCHAR2(100);
HEX VARCHAR2(10);
PKEY VARCHAR2(1024);
BEGIN
IF FBuffer='' or FBuffer is null THEN
RETURN '';
END IF;
PKEY:=FBuffer;
KeyLen:=LENGTH(PKey);
FKey.Extend(256);
FState.Extend(256);
K.Extend(256);
FOutputArray.Extend(256);
FOR ct IN 1..KeyLen LOOP
FKey(ct):=ASCII(SUBSTR(PKey,ct,1));
END LOOP;
FOR ct IN 1..256 LOOP
FState(ct):=ct;
END LOOP;
FOR ct IN 1..256 LOOP
K(ct):=FKey(MOD(ct,KeyLen)+1);
END LOOP;
J:=0;
FOR I IN 1..256 LOOP
J:=MOD(J+FState(I)+K(I),256)+1;
TEMP:=FState(I);
FState(I):=FState(J);
FState(J):=TEMP;
END LOOP;
--加密处理程序
FInputLength:=LENGTH(FBuffer);
I:=0;
J:=0;
FOR X IN 1..FInputLength LOOP
I:=MOD((I + 1),256)+1;
J:=MOD(J + FState(I),256)+1;
TEMP:=FState(I);
FState(I):=FState(J);
FState(I):=TEMP;
T:=MOD(FState(I)+FState(J),256)+1;
FOutputArray(X):=UTL_RAW.BIT_XOR(RAWTOHEX(FState(T)),RAWTOHEX(FState(MOD(X,256)+1)));
END LOOP;
--加密后的字串,加起来当传回值
FOR I IN 1..FInputLength LOOP
HEX:=UPPER(FOutputArray(I));
T:=LENGTH(HEX)+1;
IF T<=4 THEN
FOR J IN T..4 LOOP
HEX:='0' || HEX;
END LOOP;
END IF;
CipherText:=CipherText || HEX;
END LOOP;
RETURN CipherText;
END;

浙公网安备 33010602011771号