
ORACLE 字段AES算法加密、解密(解决中文乱码问题)
2014年02月12日 17:13:37 华智互联 阅读数:9797
1.加解密函数入口
CREATE OR REPLACE FUNCTION F_ZNMH_SMK_CRYPT(P_SRC IN VARCHAR2,
 P_TYPE IN NUMBER)
 RETURN VARCHAR2 IS
 RESULT VARCHAR2(4000);
BEGIN
 /*************************************************
 信息加密函数 F_ZNMH_SMK_CRYPT 
 入参:
 P_SRC 输入明文字符串
 P_TYPE 处理类型,1,为加密;2,为解密;
 返回值:
 RESULT 返回密文字符串,约定返回为 16进制密文字符串
  异常处理:
 此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
 
 加密方式:
 密钥位数:AES192 DBMS_CRYPTO.ENCRYPT_AES192
 连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
 填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
 默认密钥:
 KEY ZNMH1234
 **************************************************/
 DECLARE
 KEY VARCHAR2(20);
 
 BEGIN
 KEY := ‘ZNMH1234‘;
 RESULT := ‘ERROR ENCRPT INFO‘;
 
 --P_TYPE为1时,代表加密;2时,代表解密;
 IF (P_TYPE = 1) THEN
 RESULT := ENCRYPT_FUNCTION(P_SRC, KEY);
 ELSIF (P_TYPE = 2) THEN
 RESULT := DECRYPT_FUNCTION(P_SRC, KEY);
 END IF;
 EXCEPTION
 WHEN OTHERS THEN
 DBMS_OUTPUT.PUT_LINE(‘SQLCODE : ‘ || SQLCODE);
 DBMS_OUTPUT.PUT_LINE(‘SQLERRM : ‘ || SQLERRM);
 RETURN(RESULT);
 END;
 RETURN(RESULT);
END F_ZNMH_SMK_CRYPT;
2.加密函数
CREATE OR REPLACE FUNCTION ENCRYPT_FUNCTION(
 V_STR VARCHAR2, V_KEY VARCHAR2) RETURN VARCHAR2 AS V_KEY_RAW RAW(24);
 V_STR_RAW RAW(2000);
 V_RETURN_STR VARCHAR2(2000);
 V_TYPE PLS_INTEGER;
BEGIN
 /*************************************************
 加密函数 FUN_ENCRYPTION 
 入参:
 V_STR 输入明文字符串
 V_KEY 输入密钥字符串,长度为24字节
 返回值:
 V_RETURN_STR 返回密文字符串,约定返回为 16进制密文字符串
  异常处理:
 此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
 加密方式:
 密钥位数:AES192 DBMS_CRYPTO.ENCRYPT_AES192
 连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
 填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
 **************************************************/
 V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY, ‘ZHS16GBK‘);
 V_STR_RAW := UTL_I18N.STRING_TO_RAW(V_STR, ‘ZHS16GBK‘);
 -- 指定‘密钥算法’、‘工作模式’、‘填充方式’
 V_TYPE := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_ECB +
 DBMS_CRYPTO.PAD_PKCS5;
 V_STR_RAW := DBMS_CRYPTO.ENCRYPT(SRC => V_STR_RAW,
 TYP => V_TYPE,
 KEY => V_KEY_RAW);
 V_RETURN_STR := RAWTOHEX(V_STR_RAW);
 RETURN V_RETURN_STR;
 /* EXCEPTION
 WHEN OTHERS THEN
 RETURN SQLERRM||SQLCODE ; */
END;
 
3.解密函数
CREATE OR REPLACE FUNCTION DECRYPT_FUNCTION(V_STR VARCHAR2, V_KEY VARCHAR2)
 RETURN VARCHAR2 AS
 V_KEY_RAW RAW(24);
 V_STR_RAW RAW(2000);
 V_RETURN_STR VARCHAR2(2000);
 V_TYPE PLS_INTEGER;
BEGIN
 /************************************************
 解密函数 FUN_DECRYPTION 
 入参:
 V_STR 输入密文字符串,约定密文为16进制字符串
 V_KEY 输入密钥字符串,长度为24字节
 返回值:
 V_RETURN_STR 返回明文字符串
 异常处理:
 此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
 加密方式:
 密钥位数:AES192 DBMS_CRYPTO.ENCRYPT_AES192
 连接方式:CBC DBMS_CRYPTO.CHAIN_CBC
 填充方式:PKCS5 DBMS_CRYPTO.PAD_PKCS5
***************************************************/ V_KEY_RAW := UTL_I18N.STRING_TO_RAW(V_KEY, ‘ZHS16GBK‘); V_STR_RAW := HEXTORAW(V_STR); -- 指定‘密钥算法’、‘工作模式’、‘填充方式’ V_TYPE := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5; V_STR_RAW := DBMS_CRYPTO.DECRYPT(SRC => V_STR_RAW, TYP => V_TYPE, KEY => V_KEY_RAW); V_RETURN_STR := UTL_I18N.RAW_TO_CHAR(V_STR_RAW, ‘ZHS16GBK‘); RETURN V_RETURN_STR; /* EXCEPTION WHEN OTHERS THEN RETURN SQLERRM||SQLCODE ; */END;














