Может ли пакет Oracle PL/SQL dbms_crypto расшифровать файл, зашифрованный командой Linux gpg?

Я новичок в шифровании и пытаюсь выяснить, могут ли команда Linux gpg и пакет Oracle dbms_crypto работать вместе. Версия Oracle - 11R2. Я буду получать файлы, зашифрованные другой системой, и хотел бы расшифровать их с помощью PL/SQL, если это возможно. Я бегу через поток ниже как POC, чтобы посмотреть, возможно ли это.

В приглашении Linux я создал ключ с этой командой:

gpg --gen-key

Создал открытый ключ с помощью этой команды (используя реальный адрес электронной почты):

gpg --armor --export xxx@yyy.com > mypublickey

И зашифровал мой файл так:

gpg -r xxx@yyy.com --output input.txt.encrypted --encrypt input.txt

среди stdout было это сообщение:

gpg: encrypted with 2048-bit RSA key

Так что теперь у меня есть зашифрованный файл.

Используя blob /clobs, я загрузил зашифрованный файл и ключ публикации в таблицу Oracle. Я пытаюсь использовать функцию dbms_crypto.decrypt для расшифровки файла:

select dbms_crypto.decrypt(
          encrypted_file,
          ?,
          utl_raw.cast_to_raw('public_key'),
          null)
from crypto_test_lobs

На данный момент я не уверен, какие значения передать для второго аргумента, который является "типом потокового или блочного шифра и модификаторами, которые будут использоваться". Я пробовал несколько разных комбинаций, которые приводят к множеству исключений, которые, вероятно, не стоит публиковать.

Итак, мои вопросы:

  1. Это возможно?
  2. Как мне понять, что второй аргумент?

Спасибо

3 ответа

gpg шифруется с помощью протокола OpenPGP, и вам нужен пакет PL/SQL, поддерживающий OpenPGP.

Коммерческий пакет PL/SQL OraPGP поддерживает 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;

Короткий ответ на ваш первый вопрос: нет, большой ответ, кажется, что функция Oracle использует только симметричные шифры, в то время как созданный вами ключ (RSA) предназначен для использования с асимметричными шифрами, это не сработает. Я рекомендую взглянуть на алгоритмы DES и AES и на то, как они работают, чтобы вы лучше поняли, почему.

How do I figure out that 2nd argument?

Второй аргумент - это целое число, которое определяет используемый алгоритм. Смотрите также http://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_crypto.htm. В 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 вам нужно знать фактические числа, которые определяют константы. См. http://www.remote-dba.net/t_advanced_dbms_crypto.htm для соответствующего списка. Чтобы определить тот же алгоритм, что и выше, вы должны использовать 8 + 256 + 4096.

Другие вопросы по тегам