Oracle 3Des加解密

oracle 数据库3Des加解密,在大佬3des加解密的基础上添加IV参数。

https://www.cnblogs.com/SimonHu1993/p/14429884.html

顺便回馈DES加解密算法。
目前测试验证与JAVA的3Des加解密一致。
目前测试验证与JAVA的Des加解密一致。

3DES加密

Create Or Replace Function Fun_Encrypt_3Des
(
	v_Str Varchar2,
	v_Key Varchar2,
	v_Iv  Varchar2 := Null
) Return Varchar2 As
	v_Key_Raw    Raw(200);
	v_Str_Raw    Raw(2000);
	v_Return_Str Varchar2(2000);
	v_Iv_Raw     Raw(200);
	v_Type       Pls_Integer;
Begin
	/************************************************
     加密函数 Fun_Encrypt_3des 
        入参:
          V_STR 输入密文字符串,约定密文为16进制字符串
          V_KEY 输入密钥字符串,长度为24字节
          v_Iv 输入偏移位
        返回值:
          V_RETURN_STR 返回明文字符串
        异常处理:
          此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
  
        加密方式:
          密钥位数: DBMS_CRYPTO.ENCRYPT_AES192
          连接方式: DBMS_CRYPTO.CHAIN_CBC/Chain_Ecb
          填充方式: DBMS_CRYPTO.PAD_PKCS5
  
  ***************************************************/
	v_Key_Raw := Utl_I18n.String_To_Raw(v_Key, 'UTF8');
	If v_Iv Is Not Null Then
		v_Iv_Raw := Utl_I18n.String_To_Raw(v_Iv, 'UTF8');
	End If;
	v_Str_Raw := Utl_I18n.String_To_Raw(v_Str, 'UTF8');
	-- 指定‘密钥算法’、‘工作模式’、‘填充方式’、‘偏移位’
	v_Type := Dbms_Crypto.Encrypt_3des + Dbms_Crypto.Chain_Cbc + Dbms_Crypto.Pad_Pkcs5;
	If v_Iv Is Not Null Then
		v_Str_Raw := Dbms_Crypto.Encrypt(Src => v_Str_Raw, Typ => v_Type, Key => v_Key_Raw, Iv => v_Iv_Raw);
	Else
		v_Str_Raw := Dbms_Crypto.Encrypt(Src => v_Str_Raw, Typ => v_Type, Key => v_Key_Raw);
	End If;
	v_Return_Str := Utl_Raw.Cast_To_Varchar2(Utl_Encode.Base64_Encode(v_Str_Raw));
	Return v_Return_Str;
End;

3DES解密

Create Or Replace Function Fun_Decrypt_3Des
(
	v_Str Varchar2,
	v_Key Varchar2,
	v_Iv  Varchar2 := Null
) Return Varchar2 As
	v_Key_Raw    Raw(200);
	v_Str_Raw    Raw(2000);
	v_Return_Str Varchar2(2000);
	v_Type       Pls_Integer;
	v_Iv_Raw     Raw(200);
Begin
	/************************************************
     解密函数 Fun_Decrypt_3des
        入参:
          V_STR 输入密文字符串,约定密文为16进制字符串
          V_KEY 输入密钥字符串,长度为24字节
          v_Iv 输入偏移位
        返回值:
          V_RETURN_STR 返回明文字符串
        异常处理:
          此函数不对任何异常做捕捉处理,请相应的程序模块对异常做捕捉处理。
  
        加密方式:
          密钥位数: DBMS_CRYPTO.ENCRYPT_AES192
          连接方式: DBMS_CRYPTO.CHAIN_CBC/Chain_Ecb
          填充方式: DBMS_CRYPTO.PAD_PKCS5
  
  ***************************************************/
	v_Key_Raw := Utl_I18n.String_To_Raw(v_Key, 'UTF8');
	If v_Iv Is Not Null Then
		v_Iv_Raw := Utl_I18n.String_To_Raw(v_Iv, 'UTF8');
	End If;
	v_Str_Raw := Utl_Encode.Base64_Decode(Utl_Raw.Cast_To_Raw(v_Str));
	-- 指定‘密钥算法’、‘工作模式’、‘填充方式’、‘偏移位’
	v_Type := Dbms_Crypto.Encrypt_3des + Dbms_Crypto.Chain_Cbc + Dbms_Crypto.Pad_Pkcs5;
	If v_Iv Is Not Null Then
		v_Str_Raw := Dbms_Crypto.Decrypt(Src => v_Str_Raw, Typ => v_Type, Key => v_Key_Raw, Iv => v_Iv_Raw);
	Else
		v_Str_Raw := Dbms_Crypto.Decrypt(Src => v_Str_Raw, Typ => v_Type, Key => v_Key_Raw);
	End If;
	v_Return_Str := Utl_I18n.Raw_To_Char(v_Str_Raw, 'UTF8');
	Return v_Return_Str;
End;

DES加密

Create Or Replace Function fun_Encrypt_Des
(
  p_Text Varchar2,
  p_Key  Varchar2
) Return Varchar2 Is
  --des加密 
  v_Text        Varchar2(4000);
  v_Enc         Varchar2(4000);
  Raw_Input     Raw(128);
  Key_Input     Raw(128);
  Decrypted_Raw Raw(2048);
Begin
  v_Text    := Rpad(p_Text, (Trunc(Length(p_Text) / 8) + 1) * 8, Chr(0));
  Raw_Input := Utl_Raw.Cast_To_Raw(v_Text);
  Key_Input := Utl_Raw.Cast_To_Raw(p_Key);
  Dbms_Obfuscation_Toolkit.Desencrypt(Input => Raw_Input, Key => Key_Input, Encrypted_Data => Decrypted_Raw);
  v_Enc := Rawtohex(Decrypted_Raw);
  Dbms_Output.Put_Line(v_Enc);
  Return v_Enc;
End;

DES解密

Create Or Replace Function fun_Decrypt_Des
(
  p_Text Varchar2,
  p_Key  Varchar2
) Return Varchar2 Is
 --des解密 
  v_Text Varchar2(2000);
Begin
  Dbms_Obfuscation_Toolkit.Desdecrypt(Input_String => Utl_Raw.Cast_To_Varchar2(p_Text), Key_String => p_Key,
                                      Decrypted_String => v_Text);
  v_Text := Rtrim(v_Text, Chr(0));
  Dbms_Output.Put_Line(v_Text);
  Return v_Text;
End;
posted @ 2025-04-08 16:49  PengRay  阅读(50)  评论(0)    收藏  举报