Bir webcoder arasında veri aktarmak için mcrypt kullanarak başarısız oluyor

3 Cevap php

Ben daha sonra merkezi bir db olarak hata günlükleri bir komut dosyası hata verileri (dosya, satır, hata, mesaj vb) şifreler ve (kıvırmak kullanarak) bir POST değişkeni olarak tefrika dizi geçer bir hata işleyicisi komut dosyası yazıyorum.

Benim şifrelemek / tek bir dosyada fonksiyonları ve veri şifreli ve ince deşifre edilir şifresini test ettik:

define('KEY', 'abc');
define('CYPHER', 'blowfish');
define('MODE', 'cfb');


function encrypt($data) {
    $td = mcrypt_module_open(CYPHER, '', MODE, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, KEY, $iv);
    $crypttext = mcrypt_generic($td, $data);
    mcrypt_generic_deinit($td);
    return $iv.$crypttext;
}

function decrypt($data) {
    $td = mcrypt_module_open(CYPHER, '', MODE, '');
    $ivsize = mcrypt_enc_get_iv_size($td);
    $iv = substr($data, 0, $ivsize);
    $data = substr($data, $ivsize);
    if ($iv)
    {
        mcrypt_generic_init($td, KEY, $iv);
        $data = mdecrypt_generic($td, $data);
    }
    return $data;
}

echo "<pre>";
$data = md5('');
echo "Data: $data\n";
$e = encrypt($data);
echo "Encrypted: $e\n";
$d = decrypt($e);
echo "Decrypted: $d\n";

Output:

Data: d41d8cd98f00b204e9800998ecf8427e
Encrypted: ê÷#¯KžViiÖŠŒÆÜ,ÑFÕUW£´Œt?†÷>c×åóéè+„N
Decrypted: d41d8cd98f00b204e9800998ecf8427e

Sorun, benim iletim dosyası (tx.php) olarak şifreleme işlevini koyduğunuzda, ve benim recieve dosyası (rx.php) in şifresini, veri tamamen (her iki dosya anahtarı için sabitler aynı kümesine sahip şifresi değil cypher ve mod).

Data before passing: a:4:{s:3:"err";i:1024;s:3:"msg";s:4:"Oops";s:4:"file";s:46:"/Applications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}
Data decrypted: Mª4:{s:3:"err";i:1024@7OYªç`^;g";s:4:"Oops";s:4:"file";sôÔ8F•Ópplications/MAMP/htdocs/projects/txrx/tx.php";s:4:"line";i:80;}

Note the random characters in the middle.

Benim kıvırmak oldukça basittir:

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);

Ben şüpheli şeyler bu neden olabilir:

  • Kıvırmak istek Kodlama
  • Mcrypt dolgu bayt eksik ile ilgili bir şey
  • Ben çok uzun bakıyordu oldum ve gerçekten çok belirgin bir şey kaçırmış

Ben crypt fonksiyonlarını kapatırsanız (yani transfer tx-> rx şifrelenmemiş) veri cezası alınır.

Her türlü çok takdir yardım!

Teşekkürler, Adam

3 Cevap

Ben bunu anladım - şifresini öncesi şifreleme sonra base64_encode veri ve ardından base64_decode vardı.

Benim adına bir düşünmek olanlar için teşekkürler!

Şifrelenmiş veriler ikili ama URL bunu kodlanmış vermedi. CURL bunu,

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'data=' . urlencode($data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);

Ne bu cevaplar benim için Tamam. Base64_encode hala güvenli değil ve uzun dizeleri için boşluk ve artı işaretleri ile sorunları var. I this fonksiyonları yararlı buldu:

<?php 
function urlsafe_b64encode($string)
{
    $data = base64_encode($string);
    $data = str_replace(array('+','/','='),array('-','_','.'),$data);
    return $data;
}
function urlsafe_b64decode($string)
{
    $data = str_replace(array('-','_','.'),array('+','/','='),$string);
    $mod4 = strlen($data) % 4;
    if ($mod4) {
        $data .= substr('====', $mod4);
    }
    return base64_decode($data);
}
?>

Bu birileri yardımcı olur umarım.