Может ли пакет 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
На данный момент я не уверен, какие значения передать для второго аргумента, который является "типом потокового или блочного шифра и модификаторами, которые будут использоваться". Я пробовал несколько разных комбинаций, которые приводят к множеству исключений, которые, вероятно, не стоит публиковать.
Итак, мои вопросы:
- Это возможно?
- Как мне понять, что второй аргумент?
Спасибо
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.