加密算法:
CREATE OR REPLACE PROCEDURE U_ldsPassWord (s_inno IN VARCHAR2,
                                        s_outpass IN OUT VARCHAR2) 
/*密码加密*/
/* Source is wrapped */
/*当用户为LDS 时,密码为lds 或LDS都一样*/
AS
s_no VARCHAR2(4);
i_i NUMBER;
i_passlen NUMBER;
i_j NUMBER;
i_nolen NUMBER;
i_value NUMBER;
s_str VARCHAR2(32);--VARCHAR2(32);
s_defpass VARCHAR2(32);--CHAR(32);
s_pass VARCHAR2(32);
s_reverno VARCHAR2(32);
i_reveri NUMBER;
i_reverj NUMBER;
begin
 IF (LENGTH(s_inno)<4) THEN s_no:=u_ufright('0000'||s_inno,4); --LPAD(s_inno,4,'0'); 
   ELSE s_no:=s_inno; END IF;--将密码的字符顺序倒序排列
 i_reveri:=1;
 i_reverj:=LENGTH(s_no);
 s_reverno:=SUBSTR(s_no,-1,1);
 WHILE i_reveri<i_reverj LOOP
   i_reveri:=i_reveri+1;
   s_reverno:=s_reverno||SUBSTR(s_no,-i_reveri,1);
 END LOOP;
 
 s_defpass:='?/>.<,'||s_reverno||'~`_-+=|\'||SUBSTR(s_no,1,1)||']}[{'||
              SUBSTR(s_no,4,1)||';:''"'||s_no;    
 
 IF ((s_outpass='') OR (s_outpass IS NULL)) THEN s_pass:=s_defpass;--RPAD(s_defpass,32);  
  ELSE s_pass:=s_outpass;--RPAD(s_outpass,32); 
 END IF; i_i:=0;
 i_j:=0;
 i_value:=0;
 i_nolen:=4;
 i_passlen:=LENGTH(s_pass); 
 
 WHILE (i_passlen<32) LOOP
   i_value:=mod((ASCII(SUBSTR(s_no,1,1))+ASCII(SUBSTR(s_no,2,1))+
               ASCII(SUBSTR(s_no,3,1))+ASCII(SUBSTR(s_no,4,1))+
               i_passlen),32);
  IF i_value=0 THEN i_value:=1; END IF;
  s_pass:=LPAD((s_pass||NVL(SUBSTR(s_defpass,i_passlen,i_value),'A')),32);
  i_passlen:=LENGTH(s_pass);                     
 END LOOP; WHILE (i_i<i_passlen) LOOP
   i_i:=i_i+1;
   i_j:=i_j+1;
   IF i_j>i_nolen THEN i_j:=1; END IF; 
   i_value:=i_value+(i_i+i_j)*(ASCII(SUBSTR(s_pass,i_i,1))+
               ASCII(SUBSTR(s_no,i_j,1)));
 END LOOP;
 
 i_i:=1;
 s_str:=CHR(mod(i_value,57)+40606);
 i_j:=mod(i_value,32)+16;
--  IF (i_j>32) THEN i_j:=32; END IF;
 IF (i_j>16) THEN i_j:=16; END IF;
  
 WHILE (i_i<i_j) LOOP
   i_i:=i_i+1;
   
   s_str:=(CHR(mod((i_value+ASCII(SUBSTR(s_pass,i_i,1))*104*i_i),68)+40606)||
              --CHR((i_value+ASCII(SUBSTR(s_pass,i_i,1))*104*i_i) mod 57+39148)||
              s_str);
/*    
   s_str:=LPAD((CHR(mod((i_value+ASCII(SUBSTR(s_pass,i_i,1))*104*i_i),68)+40606)||
              --CHR((i_value+ASCII(SUBSTR(s_pass,i_i,1))*104*i_i) mod 57+39148)||
              s_str),32);*/
 END LOOP;
 
 s_outpass:=s_str;           END u_ldsPassWord;

解决方案 »

  1.   

    //加密函數
    FUNCTION  TGCFP.ENCRYPT(PASSWORD_STR: STRING):STRING;
    VAR
       TMP_STR   : STRING;
    //   TMP_CHAR  : CHAR;
       I,J,K,L,M : WORD;
    BEGIN
       ENCRYPT := '';
       TMP_STR := '';
       DecodeTime(NOW, I,J, K, L);       {procedure DecodeTime(Time: TDateTime; var Hour, Min, Sec, MSec: Word)}  
    //   M := 0;                         {I: HOUR, J: MIN, K: SEC, L:MSEC(微秒) } 
       L := 60+(L DIV 16);
       TMP_STR := CHR(L);
       I := LENGTH(PASSWORD_STR);
       IF I<1 THEN EXIT;
       FOR J:=1 TO I DO
           BEGIN
    //           TMP_CHAR := PASSWORD_STR[J];    
               K := ORD(PASSWORD_STR[J]);
               IF K>=100 THEN
                  BEGIN
                    M := K DIV 100;
                    TMP_STR := TMP_STR + CHR(M*8+32+(L DIV 10));
                    M := (K - ( M * 100 )) DIV 10;
                    TMP_STR := TMP_STR + CHR(M*8+32+(L DIV 10));
                    M := (K - (K DIV 100)*100 - (M * 10));
                    TMP_STR := TMP_STR + CHR(M*8+32+(L DIV 10));
                  END
               ELSE
                  IF (K<100) AND (K>=10) THEN
                     BEGIN
                         M := K DIV 10;
                         TMP_STR := TMP_STR + CHR(M*8+32+(L DIV 10));
                         M := (K - (M * 10));
                         TMP_STR := TMP_STR + CHR(M*8+32+(L DIV 10));
                     END;
           END;
       ENCRYPT := TMP_STR;
    END;
      

  2.   

    解密函數
    FUNCTION  TGCFP.DECRYPT(PASSWORD_STR: STRING):STRING;
    VAR
       TMP_STR   : STRING;
       I,J,K,L,M : WORD;
    BEGIN
       DECRYPT := '';
       TMP_STR := '';
       L := 0;
       M := 0;
       I := LENGTH(PASSWORD_STR);
       IF I<2 THEN EXIT;
       L := ORD(PASSWORD_STR[1]);
       L := L DIV 10;
       FOR J:=2 TO I DO
           BEGIN
               K := ORD(PASSWORD_STR[J]);
               K := (K-32-L) DIV 8;
               M := M*10+K;
               IF M>=32 THEN
                  BEGIN
                     TMP_STR := TMP_STR + CHR(M);
                     M := 0;
                  END;
           END;
       DECRYPT := TMP_STR;
    END;
      

  3.   

    package hq.pub;/**
     * <p>Title: </p>
     * <p>Description: </p>
     * <p>Copyright: Copyright (c) 2002</p>
     * <p>Company: </p>
     * @author unascribed
     * @version 1.0
     */import java.io.PrintStream;public class encrypt
    {  static String sWrong;
      static String sSkey = "207806514039";  public encrypt()
      {
        sWrong = "";
      }  public static String encryptkey(String s, int i)
      {
        String s1 = s;
        int j = s.length();
        if(i <= j)
          s1 = s.substring(0, i);
        else
          for(; j < i; j = s1.length())
            if(j + s.length() >= i)
              s1 = s1 + s.substring(0, i - j);
        else
          s1 = s1 + s;    return s1;
      }  public String encrypt(String s, String s1)
      {
        String s2 = "";
        if(s1 == "")
        {
          sWrong = "字符串为空!";
          return s2;
        }
        if(s == "")
        {
          sWrong = "请指定密钥!";
          return s2;
        }
        int i = s1.length();
        String s3 = encryptkey(s, i);
        for(int k = 0; k < i; k++)
        {
          char c = s1.charAt(k);
          char c1 = s3.charAt(k);
          char c2 = c;
          char c3 = c1;
          int j = c2 ^ c3;
          j += 29;
          j = 1000 + ((j / 10) % 10) * 100 + (j / 100) * 10 + j % 10;
          s2 = s2 + Integer.toString(j).substring(1);
        }    return s2;
      }  public String encrypt(String s)
      {
        return encrypt(sSkey, s);
      }  public static String decode(String s, String s1)
      {
        String s2 = "";
        if(s1 == "")
        {
          sWrong = "字符串为空!";
          return s2;
        }
        if(s == "")
        {
          sWrong = "请指定密钥!";
          return s2;
        }
        int i = s1.length() / 3;
        String s3 = encryptkey(s, i);
        for(int l = 0; l < i; l++)
        {
          String s4 = s1.substring(l * 3, (l + 1) * 3);
          char c1 = s3.charAt(l);
          int k = Integer.parseInt(s4);
          k = ((k / 10) % 10) * 100 + (k / 100) * 10 + k % 10;
          char c2 = c1;
          int j = k - 29 ^ c2;
          char c = (char)j;
          s2 = s2 + c;
        }    return s2;
      }  public static String decode(String s)
      {
        return decode(sSkey, s);
      }
      public static void main(String args[])
          throws Exception
      {
        String str = "000000";
        String key = "207806514039";
        encrypt encrypt = new encrypt();    str = encrypt.encrypt(str);//加密
        System.out.println(str);    str =decode(key, str); //解密
        System.out.println(str);
      }}