Расшифруйте шестнадцатеричную строку, используя AES 128 бит в Oracle - PullRequest
1 голос
/ 24 февраля 2020

Я выполнил нижеприведенную функцию для преобразования моей строки в 128-битный зашифрованный текст AES в Oracle

    create or replace function get_enc_val
 (
 p_in_val in varchar2,
 p_key in varchar2
 )
 return raw
 is
 l_enc_val raw(4000);
 begin
 l_enc_val := dbms_crypto.encrypt
 (
 src => utl_i18n.string_to_raw (p_in_val, 'AL32UTF8'),
 key => utl_i18n.string_to_raw (p_key, 'AL32UTF8'),
 typ => dbms_crypto.encrypt_aes128 +
 dbms_crypto.chain_cbc +
 dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;

Когда я запускаю select get_enc_val ('1234', '1234567890ghjkle') из dual; он работает нормально и дает мне зашифрованный текст, но когда я хочу расшифровать его с помощью функции ниже, я получаю сообщение об ошибке "ORA-01465: неверное шестнадцатеричное число"

create or replace function get_dec_val
 (
 p_in_val in RAW,
 p_key in RAW
 )
 return VARCHAR2 
 is
 l_enc_val VARCHAR2(4000);
 begin
 l_enc_val := dbms_crypto.DECRYPT
 (
 src => utl_i18n.RAW_TO_CHAR (p_in_val, 'AL32UTF8'),
 key => utl_i18n.RAW_TO_CHAR (p_key, 'AL32UTF8'),
 typ => dbms_crypto.encrypt_aes128 +
 dbms_crypto.chain_cbc +
 dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;
 select get_dec_val('12519D97D5299702A284F2E530F58A20','1234567890ghjkle') from dual

Может кто-нибудь помочь мне понять вопрос?

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Существует проблема с функцией decrypt и способом вызова function.

Ваша функция decrypt должна выглядеть следующим образом:

SQL> CREATE OR REPLACE FUNCTION GET_DEC_VAL (
  2      P_IN_VAL   IN         RAW,
  3      P_KEY      IN         RAW
  4  ) RETURN VARCHAR2 IS
  5  BEGIN
  6      RETURN UTL_RAW.CAST_TO_VARCHAR2(
  7          DBMS_CRYPTO.DECRYPT(
  8              SRC => P_IN_VAL, -- this is already RAW data type, should not be changed to char
  9              KEY => P_KEY, -- this is already RAW data type, should not be changed to char
 10              TYP => DBMS_CRYPTO.ENCRYPT_AES128 + DBMS_CRYPTO.CHAIN_CBC + DBMS_CRYPTO.PAD_ZERO)); -- it returns RAW data type so converted to varchar2 using UTL_RAW.CAST_TO_VARCHAR2
 11  END;
 12  /

Теперь давайте проверим это:

SQL> SELECT
  2      GET_DEC_VAL(
  3          '12519D97D5299702A284F2E530F58A20', 
  4          UTL_I18N.STRING_TO_RAW('1234567890ghjkle', 'AL32UTF8')) AS DECRYPTED_VAL
  5  FROM DUAL; -- ^^ converterd the key to RAW data type

DECRYPTED_VAL
--------------
1234

SQL>

Ура !!

0 голосов
/ 24 февраля 2020

Я попробовал следующий способ, и он работает.

Шифрование:

 create or replace function get_enc_val
     (
     p_in_val in varchar2,
     p_key in varchar2
     )
     return raw
     is
     l_enc_val raw(4000);
     begin
     l_enc_val := dbms_crypto.encrypt
     (
     src => utl_raw.cast_to_raw(p_in_val),
     --You can also use: src => utl_i18n.string_to_raw (p_in_val, 'AL32UTF8') 
     key => utl_raw.cast_to_raw(p_key),
     typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
     );
     return l_enc_val;
     end;
    /

Расшифровка:

create or replace function get_dec_val
 (
 p_in_val in RAW,
 p_key in varchar2
 )
 return VARCHAR2 
 is
 l_enc_val VARCHAR2(4000);
 begin
 l_enc_val := dbms_crypto.DECRYPT
 (
 src => p_in_val, -- No Need to convert ROW to CHAR.
 key => utl_raw.cast_to_raw(p_key),
 typ => dbms_crypto.encrypt_aes128 + dbms_crypto.chain_cbc + dbms_crypto.pad_zero
 );
 return l_enc_val;
 end;
/

И затем выберите Дешифрованную строку, используя

cast_to_varchar2

select utl_raw.cast_to_varchar2(get_dec_val('12519D97D5299702A284F2E530F58A20','1234567890ghjkle')) from dual;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...