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;

posted @ 2007-10-25 15:20  peak  阅读(375)  评论(0)    收藏  举报