Oracle PL/SQL dbms_加密包能否解密使用Linux gpg命令加密的文件?

Oracle PL/SQL dbms_加密包能否解密使用Linux gpg命令加密的文件?,oracle,plsql,gnupg,dbms-crypto,Oracle,Plsql,Gnupg,Dbms Crypto,我是加密新手,正在尝试弄清楚LinuxGPG命令和Oracle的dbms_加密包是否可以一起工作。Oracle版本是11R2。我将接收由另一个系统加密的文件,如果可能的话,我想通过PL/SQL对它们进行解密。我正在以POC的身份运行下面的线程,看看这是否可行 在Linux提示符下,我使用以下命令创建了一个密钥: gpg --gen-key 使用此命令创建公钥(使用实际电子邮件地址): 并对我的文件进行如下加密: gpg -r xxx@yyy.com --output input.txt.enc

我是加密新手,正在尝试弄清楚LinuxGPG命令和Oracle的dbms_加密包是否可以一起工作。Oracle版本是11R2。我将接收由另一个系统加密的文件,如果可能的话,我想通过PL/SQL对它们进行解密。我正在以POC的身份运行下面的线程,看看这是否可行

在Linux提示符下,我使用以下命令创建了一个密钥:

gpg --gen-key
使用此命令创建公钥(使用实际电子邮件地址):

并对我的文件进行如下加密:

gpg -r xxx@yyy.com --output input.txt.encrypted --encrypt input.txt
其中包括以下信息:

gpg: encrypted with 2048-bit RSA key
现在我有一个加密文件

我使用blob/clob将加密文件和pub密钥加载到Oracle表中。我正在尝试使用dbms_crypto.decrypt函数对文件进行解密:

select dbms_crypto.decrypt(
          encrypted_file,
          ?,
          utl_raw.cast_to_raw('public_key'),
          null)
from crypto_test_lobs
此时,我不确定要为第二个参数传递什么值,第二个参数是“要使用的流或分组密码类型和修饰符”。我尝试了几种不同的组合,它们导致了各种可能不值得发布的异常

因此,我的问题是:

  • 这可能吗
  • 我该如何理解第二个论点

  • 谢谢

    我如何理解第二个参数?

    第二个参数是定义要使用的算法的整数。另见。在PL/SQL中,您可以使用DBMS_CRYPTO包中的常量来设置这些值,例如,要将AES-256与CBC和PKCS5填充一起使用,请使用

    encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES256
                                 + DBMS_CRYPTO.CHAIN_CBC
                                 + DBMS_CRYPTO.PAD_PKCS5;
    

    在PL/SQL之外,您需要知道常量定义的实际数字。有关相应的列表,请参阅。要定义与上述相同的算法,您将使用8+256+4096。

    第一个问题的简短回答:不,大的答案是,Oracle函数似乎只使用对称密码,而您创建的密钥(RSA)用于非对称密码,这将不起作用。我的建议是查看DES和AES算法及其工作原理,以便您更好地了解原因。

    gpg使用该协议进行加密,您需要支持OpenPGP的PL/SQL包

    商业PL/SQL包支持OpenPGP,下面是使用它进行解密的示例:

    DECLARE
      MESSAGE VARCHAR2(2000);
      PRIVATE_KEY VARCHAR2(200);
      KEY_PASSWORD VARCHAR2(200);
      v_Return VARCHAR2(200);
    BEGIN
      MESSAGE := NULL;
      PRIVATE_KEY := 'c:\PGPKeys\private_key.asc';
      KEY_PASSWORD := 'key password';
    
      SELECT encrypted_data_field INTO MESSAGE
      FROM my_data_table
      WHERE my_id = 1000;
    
      v_Return := ORA_PGP.DECRYPT(
        MESSAGE => MESSAGE,
        PRIVATE_KEY => PRIVATE_KEY,
        KEY_PASSWORD => KEY_PASSWORD
      );
    
     DBMS_OUTPUT.PUT_LINE('Decrypted data = ' || v_Return);
    END;
    

    您对此参数尝试了什么?根据,它是一个带有常数组合的整数,如DBMS_CRYPTO.ENCRYPT_AES256、DBMS_CRYPTO.CHAIN_CBC、DBMS_CRYPTO.PAD_PKCS5尝试了表39-5、7和8的几种组合。从这里开始。真的只是在黑暗中刺伤。不知道Rafael提到的对称/不对称密码。
    DECLARE
      MESSAGE VARCHAR2(2000);
      PRIVATE_KEY VARCHAR2(200);
      KEY_PASSWORD VARCHAR2(200);
      v_Return VARCHAR2(200);
    BEGIN
      MESSAGE := NULL;
      PRIVATE_KEY := 'c:\PGPKeys\private_key.asc';
      KEY_PASSWORD := 'key password';
    
      SELECT encrypted_data_field INTO MESSAGE
      FROM my_data_table
      WHERE my_id = 1000;
    
      v_Return := ORA_PGP.DECRYPT(
        MESSAGE => MESSAGE,
        PRIVATE_KEY => PRIVATE_KEY,
        KEY_PASSWORD => KEY_PASSWORD
      );
    
     DBMS_OUTPUT.PUT_LINE('Decrypted data = ' || v_Return);
    END;