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.
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;
/