Как преобразовать шифрование AES 128 CBC из Oracle в php с использованием openssl?

#php #oracle #encryption #openssl

#php #Oracle #шифрование #openssl

Вопрос:

У меня есть следующий код Oracle и соответствующий PHP, но оба возвращают разные результаты. Код Oracle:

 DECLARE

   raw_key          RAW(200);
   encryption_type  NUMBER;
   encrypted_result VARCHAR2(4000);
   decrypted_result VARCHAR2(4000);
   v_key            VARCHAR2(4000) := 'This!@#@#SSkkLeoKeyWAA';

BEGIN

   raw_key := utl_i18n.string_to_raw(v_key, 'UTF8'); 
   encryption_type  := dbms_crypto.encrypt_aes128   dbms_crypto.chain_cbc   dbms_crypto.pad_pkcs5;
   encrypted_result := dbms_crypto.encrypt(utl_i18n.string_to_raw('200601RR00001', 'UTF8'), encryption_type, raw_key);
   decrypted_result := dbms_crypto.decrypt(encrypted_result, encryption_type, raw_key);
   dbms_output.put_line(encrypted_result);
  

Перевод на PHP
На основе документа PHP http://php.net/manual/en/function.openssl-encrypt.php Я придумал это

 $string = strtoupper(implode(unpack("H*", "200601RR00001")));
$key = strtoupper(implode(unpack("H*", "This!@#@#SSkkLeoKeyWAA")));
$cipher="AES-128-CBC";

$ivlen = openssl_cipher_iv_length($cipher);
$iv = openssl_random_pseudo_bytes($ivlen);
$cipherATS = openssl_encrypt($string , $cipher, $key, 0 , $iv);

echo $cipherATS."n";
  

Комментарии:

1. Я ничего не знаю о PHP или Oracle, но для меня это не выглядит одинаково. Такие вещи, как: Использование «strtoupper» и IV в PHP, но не в Oracle, означало бы, что они никогда не будут работать. В PHP просто попробуйте простые строки и не используйте IV и посмотрите, работает ли это.

2. например, $ cipherATS = openssl_encrypt(«200601RR00001», «AES-128-CBC», «Это!@#@#SSkkLeoKeyWAA»);