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;

浙公网安备 33010602011771号