PHP - ما هو الترميز الذي يستخدمه Mcrypt على سلسلة مشفرة؟
سؤال
باستخدام 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 البيانات على خلاف ذلك ، دون أن تسمح لك بذلك.