PHP - ما هو الترميز الذي يستخدمه Mcrypt على سلسلة مشفرة؟

StackOverflow https://stackoverflow.com/questions/2174651

  •  24-09-2019
  •  | 
  •  

سؤال

باستخدام PHP ، أحاول تحويل نص المشفر الذي تم إنشاؤه بواسطة Mcrypt إلى ثنائي ، لكن عندما أحاول تحويله إلى نص الشفرات ، لا يتم تحويله إلى الوراء بشكل صحيح حتى لا يمكن فك تشفيره. أفترض أن ترميزاتي تفسد في مكان ما ولكني لا أعرف من أين أبدأ في معرفة ذلك. هنا رابط للموقع http://dev.hersha.me/str2bin.php وهنا رمز بلدي.

<?php

class phpSteg {

function bin2bstr($input) {
    if (!is_string($input)) return null;
    return pack('H*', base_convert($input, 2, 16)); 
}

function bstr2bin($input) {
    if (!is_string($input)) return null;
    $value = unpack('H*', $input);
    return base_convert($value[1], 16, 2);
}


};

$steg = new phpSteg();

//echo $steg->bstr2bin('OMG') . "\n <br \>";
//echo $steg->bin2bstr('010011110100110101000111') . "\n <br \>";
$hash =  hash('md5',"OMGZWTF");
echo $hash . "\n <br \>";
$message = "OMG WTF BBQ";

$text = $message;
$key = $hash;

$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CFB), MCRYPT_RAND);
echo $iv . "\n <br \>";
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv);

$binenc = $steg->bstr2bin($encrypted);

$bstrenc = $steg->bin2bstr($binenc);


$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bstrenc, MCRYPT_MODE_CFB, $iv);
echo "Cipher Text : " . $encrypted . "\n <br \>";

echo "Cipher Text (binary) : " . $binenc . "\n <br \>";

echo "Cipher Text (back from binary) : " . $bstrenc . "\n <br \>";

echo "Decryption : " . $decrypted; // The quick brown fox jumps over the lazy dog

?>

أيه أفكار؟

هل كانت مفيدة؟

المحلول 3

جميع القضايا التي تم حلها.

أولاً: كنت أفرط في التحميل base_convert وظيفة. تحتاج مجموعة بيانات أصغر.

ثانياً: بسيطة وواضحة حقًا ، base_convert يتجاهل الأصفار الرائدة ، لذلك كان على التحويل أن يضيفها مرة أخرى.

نصائح أخرى

لا تهتم باستخدام Bin2BSTR و BSTR2Bin. إذا كنت بحاجة إلى تخزين السلسلة في مكان ما (مثل قاعدة البيانات) ، فقط قم بتشفير/فك تشفير السلسلة بعد التشفير.

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CFB, $iv);

$binenc = base64_encode($encrypted);

$bstrenc = base64_decode($binenc);

$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $bstrenc, MCRYPT_MODE_CFB, $iv);

محاولة base64_encode على السلسلة الثنائية الخاصة بك قبل التشفير ، والاستخدام BASE64_DECODE بعد فك تشفيره. قد يختنق McRypt البيانات على خلاف ذلك ، دون أن تسمح لك بذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top