1. 程式人生 > >Oracle wrap 和 unwrap( 加密與解密)

Oracle wrap 和 unwrap( 加密與解密)

我這裡貼一下unwrap 的程式碼:

/* Formatted on2011/8/18 12:59:54 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE PACKAGE amosunwrapper

IS

   FUNCTION deflate (src IN VARCHAR2)

      RETURN RAW;

   FUNCTION deflate (src IN VARCHAR2, quality IN NUMBER)

      RETURN RAW;

   FUNCTION inflate (src IN RAW)

      RETURN VARCHAR2;

END;

/

CREATE OR REPLACE PACKAGE BODY amosunwrapper

IS

   FUNCTION deflate (src IN VARCHAR2)

      RETURN RAW

   IS

   BEGIN

      RETURN deflate (src, 6);

   END;

   FUNCTION deflate (src IN VARCHAR2, quality IN NUMBER)

      RETURN RAW

   AS

      LANGUAGE JAVA

      NAME 'UNWRAPPER.Deflate( java.lang.String, int ) returnbyte[]';

   FUNCTION inflate (src IN RAW)

      RETURN VARCHAR2

   AS

      LANGUAGE JAVA

      NAME 'UNWRAPPER.Inflate( byte[] ) returnjava.lang.String';

END;

/

/* Formatted on2011/8/18 13:00:16 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE JAVA SOURCE NAMED UNWRAPPER

   AS import java.io.*;

import java.util.

zip.*;

public class UNWRAPPER

{

  public static String Inflate( byte[] src )

  {

    try

    {

      ByteArrayInputStream bis = new ByteArrayInputStream( src );

      InflaterInputStream iis = newInflaterInputStream( bis );

      StringBuffer sb = newStringBuffer();

      for( int c = iis.read(); c != -1; c = iis.read() )

      {

        sb.append( (char) c );

      }

      return sb.toString();

    } catch ( Exception e )

    {

    }

    return null;

  }

  public static byte[] Deflate( String src, intquality )

  {

    try

    {

      byte[] tmp = newbyte[ src.length() + 100 ];

      Deflater defl = new Deflater( quality );

      defl.setInput( src.getBytes( "UTF-8" ) );

      defl.finish();

      int cnt = defl.deflate( tmp );

      byte[] res = newbyte[ cnt ];

      for( int i = 0; i < cnt; i++ )

        res = tmp;

      return res;

    } catch ( Exception e )

    {

    }

    return null;

  }

}

/

ALTER JAVA SOURCE UNWRAPPER COMPILE

/

/* Formatted on2011/8/18 13:02:57 (QP5 v5.163.1008.3004) */

--為了輸出中文,要修改java過程

CREATE OR REPLACE JAVA SOURCE NAMED UNWRAPPER

   AS import java.io.*;

import java.util.zip.*;

public class UNWRAPPER

{

  public static String Inflate( byte[] src )

  {

    try

    {

      ByteArrayInputStream bis = newByteArrayInputStream( src );

      InflaterInputStream iis = newInflaterInputStream( bis );

      StringBuffer sb = newStringBuffer();

      for( int c = iis.read(); c != -1; c = iis.read() )

      {

        sb.append( (char) c );

      }

String hello = new String(sb.toString().getBytes("iso8859-1"), "GBK");

      return hello;

    } catch ( Exception e )

    {

    }

    return null;

  }

  public static byte[] Deflate( String src, intquality )

  {

    try

    {

      byte[] tmp = newbyte[ src.length() + 100 ];

      Deflater defl = new Deflater( quality );

      defl.setInput( src.getBytes( "UTF-8" ) );

      defl.finish();

      int cnt = defl.deflate( tmp );

      byte[] res = newbyte[ cnt ];

      for( int i = 0; i < cnt; i++ )

        res = tmp;

      return res;

    } catch ( Exception e )

    {

    }

    return null;

  }

}

/

ALTER JAVA SOURCE UNWRAPPER COMPILE

/

/* Formatted on2011/8/18 13:00:41 (QP5 v5.163.1008.3004) */

CREATE OR REPLACE PROCEDURE unwrap (o IN VARCHAR, n IN VARCHAR, t IN VARCHAR)

AS

   vWrappedtext    VARCHAR2 (32767);

   vtrimtext       VARCHAR2 (32767);

   vChar           VARCHAR2 (2);

   vRepchar        VARCHAR2 (2);

   vLZinflatestr   VARCHAR2 (32767);

   nLen            INTEGER;

   nLoop           INTEGER;

   nCnt            INTEGER;

   code            VARCHAR (512);

BEGIN

   code :=

      '3D6585B318DBE287F152AB634BB5A05F7D687B9B24C228678ADEA4261E03EB176F343E7A3FD2A96A0FE935561FB14D1078D975F6BC4104816106F9ADD6D5297E869E79E505BA84CC6E278EB05DA8F39FD0A271B858DD2C38994C480755E4538C46B62DA5AF322240DC50C3A1258B9C16605CCFFD0C981CD4376D3C3A30E86C3147F533DA43C8E35E1994ECE6A39514E09D64FA5915C52FCABB0BDFF297BF0A76B449445A1DF0009621807F1A82394FC1A7D70DD1D8FF139370EE5BEFBE09B97772E7B254B72AC7739066200E51EDF87C8F2EF412C62B83CDACCB3BC44EC069366202AE88FCAA4208A64557D39ABDE1238D924A1189746B91FBFEC901EA1BF7CE';--sys.idltranslate表內容存到字元陣列

   vtrimtext := '';

   SELECT COUNT (*)

     INTO ncnt

     FROM DBA_SOURCE

    WHERE owner = o AND Name = n AND TYPE = t;

   IF ncnt > 0 AND ncnt <= 5

   THEN

      FOR i IN 1 .. ncnt

      LOOP

         IF i = 1

         THEN

            SELECT RTRIM (SUBSTR (TEXT,

                                  INSTR (TEXT,

                                         CHR (10),

                                         1,

                                         20)

                                  + 1),

                          CHR (10))                      --儲存去掉前邊20行的BASE64碼正文

              INTO vLZinflatestr

              FROM DBA_SOURCE

             WHERE owner = o AND Name = n AND TYPE = t AND line = i;

         ELSE

            SELECT text

              INTO vLZinflatestr

              FROM DBA_SOURCE

             WHERE owner = o AND Name = n AND TYPE = t AND line = i;

         END IF;

         vtrimtext := vtrimtext || vLZinflatestr;

      END LOOP;

   END IF;

   vtrimtext := REPLACE (vtrimtext, CHR (10), '');

   nLen := LENGTH (vtrimtext) / 256;

   vWrappedtext := '';

   FOR i IN 0 .. nLen

   LOOP

      --ifi< nLen   then

      vWrappedtext :=

         vWrappedtext

         || UTL_ENCODE.base64_decode (

               UTL_RAW.cast_to_raw (SUBSTRB (vtrimtext, 256 * i + 1, 256)));

   --else

   --vWrappedtext:=vWrappedtext||utl_encode.base64_decode(utl_raw.cast_to_raw(substrb(vtrimtext,64*i+1 ))) ;

   --endif;

   --DBMS_OUTPUT.PUT_LINE(vWrappedtext);

   END LOOP;

   --vWrappedtext:=substr(vWrappedtext,41);

   nLen := LENGTH (vWrappedtext) / 2 - 1;

   vLZinflatestr := '';

   FOR nLoop IN 20 .. nLen

   LOOP                                                            --從第41位元組開始

      vChar := SUBSTRB (vWrappedtext, nLoop * 2 + 1, 2);

      vLZinflatestr :=

         vLZinflatestr || SUBSTR (code, TO_NUMBER (vChar, 'XX') * 2 + 1, 2); --從字串變數匹配

   --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

   END LOOP;

   --DBMS_OUTPUT.PUT_LINE(vLZinflatestr);

   DBMS_OUTPUT.PUT_LINE (amosunwrapper.inflate (vLZinflatestr));

END;

/