2014-10-15 3 views
1

У меня есть приложение, в котором я пытаюсь зашифровать строку с использованием PLSQL (dbms_crypto.encrypt), сохранить ее в файл cookie, затем прочитать файл cookie с помощью PHP (mcrypt_decrypt) и дешифровать строка. У меня есть чертовски время, чтобы расшифровать строку. Надеюсь, кто-то сделал это раньше и может мне помочь?Шифровать строку с PLSQL, а затем расшифровать с помощью PHP

Вот код PLSQL: (Запуск в Oracle 11)

set serveroutput on 

set linesize 121 

DECLARE 
cookieInfo VARCHAR2(500) := '[email protected]@[email protected]'; 
cookieInfo_raw RAW(500) := utl_raw.cast_to_raw(cookieInfo); 
l_key  RAW(128) := utl_raw.cast_to_raw('abcdefgh'); 

l_encrypted_raw RAW(2048); 
BEGIN 
    dbms_output.put_line('Original : ' || cookieInfo); 

    l_encrypted_raw := dbms_crypto.encrypt(cookieInfo_raw, 
    dbms_crypto.des_cbc_pkcs5, l_key); 

    dbms_output.put_line('Encrypted : ' || 
    l_encrypted_raw); 

END; 
/

Если я правильно читать, данные шифруются с помощью DES с CBC и PKCS5. Вот вывод из кода:

Original : [email protected]@[email protected] 
Encrypted : 3CB6F761112AE388DDA1AE973042D08472B06C2170587D5E 

PHP явно использует MCRYPT_decode, но я не могу показаться, чтобы получить выходное право. Я собрал скрипт, который выполняет часть задания, но вывод всегда выглядит закодированным. Моя проблема в том, что я не в состоянии ускорить то, что все варианты действительно означают. CBC и PKCS5 для меня немного греческие. Также кажется, что частью проблемы может быть кодирование текста (HEX vs RAW/BIN). Кажется, я просто смущен.

Вот мой PHP код: (Запуск на PHP 5.3.10)

<?php 
    $input = "[email protected]@L00579796"; 
    $key = "abcdefgh"; 
    $data = "DC979D2F301CA90A548B2F749237B5AF783F13A8CBECE03C"; 
    $iv = ""; 

    $decrypt = mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC); 
    $decrypt = bin2hex($decrypt); 

    $block = mcrypt_get_block_size('des', 'cbc'); 
    echo "BLOCK: ". $block ."<br>"; 
    $pad = ord($decrypt[($len = strlen($decrypt)) - 1]); 
    echo "PAD: ". $pad ."<br>"; 
    $output = substr($decrypt, 0, strlen($decrypt) - $pad); 

    echo "OUTPUT: ". $output; 
?> 

И выход:

OUTPUT: 793fe26d587e144f140d70e6013374acb082ff9e411 

Любая помощь будет принята с благодарностью. Эта небольшая проблема связана с гораздо более масштабным проектом.

Заранее спасибо.

ответ

0

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

$input = "[email protected]@L00579796"; 
$key = "abcdefgh"; 
$data = "DC979D2F301CA90A548B2F749237B5AF783F13A8CBECE03C"; 
$iv = ""; 

/* 
* Convert hex to bin data 
* 
* This code is courtesy of "Johnson" 
* http://php.net/manual/en/function.hex2bin.php#110973 
* Not needed if you have PHP > 5.4 
* Then you can just use hex2bin() builtin 
*/ 
$data = hextobin($data); 

$decrypt = mcrypt_decrypt(MCRYPT_DES, $key, $data, MCRYPT_MODE_CBC); 

$block = mcrypt_get_block_size('des', 'cbc'); 
echo "BLOCK: ". $block ."<br>"; 
$pad = ord($decrypt[($len = strlen($decrypt)) - 1]); 
echo "PAD: ". $pad ."<br>"; 
$output = substr($decrypt, 0, strlen($decrypt) - $pad); 

echo "OUTPUT: ". $output; 

function hextobin($hexstr) 
{ 
    $n = strlen($hexstr); 
    $sbin=""; 
    $i=0; 
    while($i<$n) 
    {  
     $a =substr($hexstr,$i,2);   
     $c = pack("H*",$a); 
     if ($i==0){$sbin=$c;} 
     else {$sbin.=$c;} 
     $i+=2; 
    } 
    return $sbin; 
} 
+0

Красота! Благодаря! Это сделал трюк. – Fotan

Смежные вопросы