Не работает шифрование в Oracle

Я пытаюсь сделать шифрование и дешифрование в Oracle, но у меня возникают проблемы с директорией ключа. Ошибка:

Произошла ошибка: ORA-29283: недопустимая операция файла : несуществующий файл или путь [29434]
Ошибка: файл не существует.
Произошла ошибка: ORA-02291: нарушено ограничение целостности (USER1.PRODUCT_FK1) - исходный ключ не найден

Код для проверки шифрования:

DECLARE
    key_v RAW(16);
BEGIN
GENERATE_PRODEDURE_KEY('key1');
READ_GENERATED_KEY('key1', key_v);
  ENCRYPT_PRODUCT('Телевизор Samsung');
  DECRYPT_PRODUCT(214);
  ENCRYPT_PRODUCT_WITH_FILE_KEY('Телевизор Philips', 'key1');
  DECRYPT_PRODUCT_WITH_FILE_KEY(13, 'key1');
  COMMIT;

EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Произошла ошибка: ' || SQLERRM);
END;

Таблица:

  CREATE TABLE "USER1"."PRODUCT" 
   (    "ID" NUMBER(*,0) DEFAULT "USER1"."PRODUCT_SEQUENCE"."NEXTVAL" NOT NULL ENABLE, 
    "NAME" VARCHAR2(80 BYTE) NOT NULL ENABLE, 
    "GROUP_ID" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE, 
    "ENTRY_PRICE" NUMBER DEFAULT 0, 
    "RETAIL_PRICE" NUMBER DEFAULT 0, 
    "COUNT" NUMBER(*,0) DEFAULT 0 NOT NULL ENABLE, 
     CONSTRAINT "PRODUCT_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS"  ENABLE, 
     CONSTRAINT "PRODUCT_FK1" FOREIGN KEY ("GROUP_ID")
      REFERENCES "USER1"."PRODUCT_GROUP" ("ID") ON DELETE CASCADE ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ;

Процедуры:

create or replace NONEDITIONABLE PROCEDURE generate_prodedure_key(file_name VARCHAR2) AS
  key_raw RAW(16);
  fk1 UTL_FILE.FILE_TYPE;
BEGIN
  fk1 := UTL_FILE.FOPEN('KEY_DIR', file_name, 'wb', 16);
  key_raw := DBMS_CRYPTO.RANDOMBYTES(16);
  UTL_FILE.PUT_RAW(fk1, key_raw);
  UTL_FILE.FCLOSE(fk1);

  DBMS_OUTPUT.PUT_LINE('Сгенерированный ключ: ' || key_raw);
END;

create or replace NONEDITIONABLE PROCEDURE read_generated_key(file_name VARCHAR2, key OUT RAW) AS
  fk1 UTL_FILE.FILE_TYPE;
BEGIN
  fk1 := UTL_FILE.FOPEN('KEY_DIR', file_name, 'rb', 16);
  UTL_FILE.GET_RAW(fk1, key, DBMS_LOB.GETLENGTH(key));
  UTL_FILE.FCLOSE(fk1);
  DBMS_OUTPUT.PUT_LINE('прочитаный ключ:' || key);
END;

create or replace NONEDITIONABLE PROCEDURE password_change_handler (
    object_schema   VARCHAR2,
    object_name     VARCHAR2,
    policy_name     VARCHAR2
) IS
BEGIN
    INSERT INTO password_change_audit (username, change_date)
    VALUES (USER, SYSTIMESTAMP);
END;

create or replace NONEDITIONABLE PROCEDURE encrypt_product(input_string VARCHAR2) 
AS
  encrypted_raw RAW(2000);
  encryption_key RAW(2000);
  encryption_key_str VARCHAR2(16) := 'ключ_0123456';
  encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
  encryption_key := UTL_RAW.CAST_TO_RAW(encryption_key_str);
  encrypted_raw := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), encryption_type, encryption_key);
  INSERT INTO PRODUCT (NAME) VALUES (encrypted_raw);

  DBMS_OUTPUT.PUT_LINE('Данные успешно зашифрованы и добавлены в таблицу PRODUCT.');
END;

create or replace NONEDITIONABLE PROCEDURE decrypt_product(product_id_v NUMBER) AS
  encrypted_raw RAW(2000);
  decryption_key RAW(2000);
  encryption_key_str VARCHAR2(16) := 'ключ_0123456';
  encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
  decrypted_raw RAW(2000);
  decrypted_string VARCHAR2(2000);
BEGIN
    SELECT NAME INTO encrypted_raw FROM PRODUCT WHERE ID = product_id_v;
    DBMS_OUTPUT.PUT_LINE(encrypted_raw);

  decryption_key := UTL_RAW.CAST_TO_RAW(encryption_key_str);
  decrypted_raw := DBMS_CRYPTO.DECRYPT(encrypted_raw, encryption_type, decryption_key);

  decrypted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');

  DBMS_OUTPUT.PUT_LINE(decrypted_string);

  UPDATE PRODUCT SET NAME = decrypted_string WHERE ID = product_id_v;
  DBMS_OUTPUT.PUT_LINE('Данные успешно дешифрованы и добавлены в таблицу PRODUCT.');
END;

create or replace NONEDITIONABLE PROCEDURE encrypt_product_with_file_key(input_string VARCHAR2, key_file_name VARCHAR2) AS
  encrypted_raw RAW(2000);
  encryption_key RAW(16);
  encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
BEGIN
  user1.read_generated_key(key_file_name, encryption_key);

  encrypted_raw := DBMS_CRYPTO.ENCRYPT(UTL_I18N.STRING_TO_RAW(input_string, 'AL32UTF8'), encryption_type, encryption_key);
  INSERT INTO PRODUCT (NAME) VALUES (encrypted_raw);

  DBMS_OUTPUT.PUT_LINE('Данные успешно зашифрованы и добавлены в таблицу PRODUCT.');
END;

create or replace NONEDITIONABLE PROCEDURE decrypt_product_with_file_key(product_id_v NUMBER, key_file_name VARCHAR2) AS
  encrypted_raw RAW(2000);
  encryption_key RAW(16);
  encryption_type PLS_INTEGER := DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_PKCS5;
  decrypted_raw RAW(2000);
   decrypted_string VARCHAR2(2000);
BEGIN
  SELECT NAME INTO encrypted_raw FROM PRODUCT WHERE ID = product_id_v;

  read_generated_key(key_file_name, encryption_key);

  decrypted_raw := DBMS_CRYPTO.DECRYPT(encrypted_raw, encryption_type, encryption_key);

  decrypted_string := UTL_I18N.RAW_TO_CHAR(decrypted_raw, 'AL32UTF8');
  DBMS_OUTPUT.PUT_LINE(decrypted_string);

  UPDATE PRODUCT SET NAME = decrypted_string WHERE ID = product_id_v;
  DBMS_OUTPUT.PUT_LINE('Данные успешно дешифрованы и добавлены в таблицу PRODUCT.');
END;

Ответы (0 шт):