Oracle中des等算法的加解密

1、oracle中加密function

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, 'UTF8');
  V_STR_RAW    := UTL_I18N.STRING_TO_RAW(V_STR, 'UTF8');
  -- 指定‘密钥算法’、‘工作模式’、‘填充方式’
  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;
2、oracle中解密function

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, 'UTF8');
  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, 'UTF8');
  RETURN V_RETURN_STR;
  /*  EXCEPTION
  WHEN OTHERS THEN
  RETURN SQLERRM||SQLCODE ; */
END;

测试sql:

加密:SELECT ENCRYPT_FUNCTION('1', '1111aaaa') FROM DUAL

输出:A23A359C2B1946A6

解密:SELECT DECRYPT_FUNCTION('A23A359C2B1946A6', '1111aaaa') FROM DUAL

输出:1

在上述function定义中声明的:

V_TYPE       := DBMS_CRYPTO.ENCRYPT_DES + DBMS_CRYPTO.CHAIN_ECB + DBMS_CRYPTO.PAD_PKCS5;

与java中默认的参数一直,以保证和java跨平台的加解密可以顺利执行。上述代码是针对des算法进行的,也可进行其他的配置


Oracle 加密包 DBMS_CRYPTO 中有好多不能定义参数的常量,可参考文章:http://blog.itpub.net/post/16888/215845/

Oracle DBMS_CRYPTO

Version 10.2

General Information
Source{ORACLE_HOME}/rdbms/admin/dbmsobtk.sql
Algorithm Constants
NameData TypeValue
Hash Functions
HASH_MD4 (128 bit hash)PLS_INTEGER1
HASH_MD5 (128 bit hash)PLS_INTEGER2
HASH_SH1 (160 bit hash)PLS_INTEGER3
MAC Functions
HMAC_MD5 (128 bit hash)PLS_INTEGER1
HMAC_SH1 (160 bit hash)PLS_INTEGER2
Block Cipher Algorithms
ENCRYPT_DES (56 bit)PLS_INTEGER1; -- 0x0001
ENCRYPT_3DES_2KEY (128 bit)PLS_INTEGER2; -- 0x0002
ENCRYPT_3DESPLS_INTEGER3; -- 0x0003
ENCRYPT_AES128 (128 bit)PLS_INTEGER6; -- 0x0006
ENCRYPT_AES192 (192 bit)PLS_INTEGER7; -- 0x0007
ENCRYPT_AES256 (256 bit)PLS_INTEGER8; -- 0x0008
ENCRYPT_RC4 (Stream Cipher)PLS_INTEGER129; -- 0x0081
Block Cipher Chaining Modifiers
CHAIN_CBC (Cipher Block Chaining)PLS_INTEGER256; -- 0x0100
CHAIN_CFB (Cipher Feedback)PLS_INTEGER512; -- 0x0200
CHAIN_ECB (Electronic cookbook)PLS_INTEGER768; -- 0x0300
CHAIN_OFB (Output Feedback)PLS_INTEGER1024; -- 0x0400
Block Cipher Padding Modifiers
PAD_PKCS5 (Complies with PKCS #5)PLS_INTEGER4096; -- 0x1000
PAD_NONE (No Dadding)PLS_INTEGER8192; -- 0x2000
PAD_ZERO (Pad with Zeros)PLS_INTEGER12288; -- 0x3000
Block Ciphers Suites
DES_CBC_PKCS5PLS_INTEGERENCRYPT_DES
+ CHAIN_CBC
+ PAD_PKCS5;
DES3_CBC_PKCS5PLS_INTEGERENCRYPT_3DES
+ CHAIN_CBC
+ PAD_PKCS5;
Dependencies
DBMS_CRYPTO_FFIDECRYPTBYTESENCRYPTBYTES
DECRYPTENCRYPTUTL_RAW
Exceptions
Error CodeReason
28827The specified cipher suite is not defined
28829No value has been specified for the cipher suite to be used
28233Source data was previously encrypted
28234DES: Specified key size too short. DES keys must be at least 8 bytes (64 bits).
AES: Specified key size is not supported. AES keys must be 128, 192, or 256 bits
28239The encryption key has not been specified or contains a NULL value
 
DECRYPT
Decrypt crypt text data using stream or block cipher with user supplied key and optional iv

Overload 1
dbms_crypto.decrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW,
iv  IN RAW DEFAULT NULL) RETURN RAW;
See Encrypt Overload 1 demo
Overload 2dbms_crypto.decrypt(dst IN OUT NOCOPY BLOB, src IN BLOB,
typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);
 
Overload 3dbms_crypto.decrypt (dst IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
src IN BLOB, typ IN PLS_INTEGER, key IN RAW, 
iv  IN RAW DEFAULT NULL);
 
 
ENCRYPT

Encrypt plain text data using stream or block cipher with user supplied key and optional iv

Overload 1
dbms_crypto.encrypt(src IN RAW, typ IN PLS_INTEGER, key IN RAW, 
iv IN RAW DEFAULT NULL) RETURN RAW;
set serveroutput on

DECLARE
 l_credit_card_no VARCHAR2(19) := '1234-5678-9012-3456';
 l_ccn_raw RAW(128) := utl_raw.cast_to_raw(l_credit_card_no);
 l_key     RAW(128) := utl_raw.cast_to_raw('abcdefgh');

 l_encrypted_raw RAW(2048);
 l_decrypted_raw RAW(2048);
BEGIN
  dbms_output.put_line('Original : ' || l_credit_card_no);

  l_encrypted_raw := dbms_crypto.encrypt(l_ccn_raw,
  dbms_crypto.des_cbc_pkcs5, l_key);

  dbms_output.put_line('Encrypted : ' ||
  RAWTOHEX(utl_raw.cast_to_raw(l_encrypted_raw)));

  l_decrypted_raw := dbms_crypto.decrypt(src => l_encrypted_raw,
  typ => dbms_crypto.des_cbc_pkcs5, key => l_key);

  dbms_output.put_line('Decrypted : ' ||
  utl_raw.cast_to_varchar2(l_decrypted_raw));
END;
/
set serveroutput on

DECLARE
 enc_val   RAW(2000);
 l_key     RAW(2000);
 l_key_len NUMBER := 128/8; -- convert bits to bytes
 l_mod     NUMBER := dbms_crypto.ENCRYPT_AES128
 + dbms_crypto.CHAIN_CBC + dbms_crypto.PAD_PKCS5;

BEGIN
  l_key := dbms_crypto.randombytes(l_key_len);

  enc_val := dbms_crypto.encrypt(
  utl_i18n.string_to_raw('1234-5678-9012-3456', 'AL32UTF8'),
  l_mod, l_key);

  dbms_output.put_line(enc_val);
END;
/
Overload 2dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB, src IN BLOB, 
typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);
 
Overload 3dbms_crypto.encrypt(dst IN OUT NOCOPY BLOB, 
src IN CLOB CHARACTER SET ANY_CS, typ IN PLS_INTEGER, key IN RAW, iv  IN RAW DEFAULT NULL);
 
dbms_crypto.encrypt(UTL_RAW.CAST_TO_RAW(CONVERT('XXX','AL32UTF8')),typ,key);
HASH
Hash source data by cryptographic hash type

Overload 1
dbms_crypto.hash(src IN RAW, typ IN PLS_INTEGER) RETURN RAW;
 
Overload 2dbms_crypto.hash(src IN BLOB, typ IN PLS_INTEGER) RETURN RAW;
 
Overload 3dbms_crypto.hash(src IN CLOB CHARACTER SET ANY_CS, 
typ IN PLS_INTEGER) RETURN RAW;
 
 
MAC
Message Authentication Code algorithms provide keyed message protection

Overload 1
dbms_crypto.mac(src IN RAW, typ IN PLS_INTEGER, key IN RAW) 
RETURN RAW;
 
Overload 2dbms_crypto.mac(src IN BLOB, typ IN PLS_INTEGER, key IN RAW)
RETURN RAW;
 
Overload 3dbms_crypto.mac(src IN CLOB CHARACTER SET ANY_CS,
typ IN PLS_INTEGER, key IN RAW) RETURN RAW;
 
 
RANDOMBYTES

Returns a raw value containing a pseudo-random sequence of bytes

dbms_crypto.randomnytes(number_bytes PLS_INTEGER) RETURN RAW;
SELECTdbms_crypto.randombytes(1) FROM dual;
SELECT LENGTH(dbms_crypto.randombytes(1)) FROM dual;

SELECT dbms_crypto.randombytes(28) FROM dual;
SELECT LENGTH(dbms_crypto.randombytes(28)) FROM dual;

SELECT dbms_crypto.randombytes(64) FROM dual;
SELECT LENGTH(dbms_crypto.randombytes(64)) FROM dual;
 
RANDOMINTEGER

Returns a random BINARY_INTEGER

dbms_crypto.randominteger RETURN NUMBER;
SELECTdbms_crypto.randominteger FROM dual;
 
RANDOMNUMBER

Returns a random Oracle Number

dbms_crypto.randomnumber RETURN NUMBER;
SELECTdbms_crypto.randomnumber FROM dual;



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值