تحويل روبي AES256 وظيفة فك شفرة PHP ل
سؤال
ولدي الدالة التالية في روبي أن يفك شفرة قليلا من البيانات:
def decrypt(key, iv, cipher_hex)
cipher = OpenSSL::Cipher::Cipher.new('aes-256-cbc')
cipher.decrypt
cipher.key = key.gsub(/(..)/){|h| h.hex.chr}
cipher.iv = iv.gsub(/(..)/){|h| h.hex.chr}
decrypted_data = cipher.update(cipher_hex.gsub(/(..)/){|h| h.hex.chr})
decrypted_data << cipher.final
return decrypted_data
end
وأنا أحاول أن تفعل نفس الشيء بالضبط في PHP، ولكن لست متأكدا ما أفعله خطأ. وهنا ما عندي:
function decrypt_data($key, $iv, $cipher_hex) {
return mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
hex_to_str($key),
hex_to_str($cipher_hex),
MCRYPT_MODE_CBC,
hex_to_str($iv)
);
}
function hex_to_str($hex_str) {
preg_match_all('/(..)/', $hex_str, $matches);
$to_return = '';
foreach ($matches[1] as $val)
$to_return .= chr(hexdec($val));
return $to_return;
}
وإخراج ينتهي فقط الأمر القمامة، وليس سلسلة أنا أبحث عن. أفكار؟
وحتى قبل أن نبدأ، والتحول إلى MCRYPT_RIJNDAEL_256
لا يبدو المساعدة والقضايا العادلة ليشكو من الرابع لا يجري طالما حجم الكتلة. أعتقد 128 هو الصحيح في هذه الحالة منذ rel="nofollow هذا الموقع يقول إن 128/256 هو مؤشرا على حجم الكتلة، وليس حجم المفتاح.
المحلول 2
وتبين أنه كان يعمل على ما يرام، انها مجرد أن بيانات الاختبار بلدي كانت سيئة. التغييرين أدليت تستخدم pack()
(بناء على اقتراح مقهى) وإسقاط الأحرف الحشو من نهاية المباراة.
function decrypt_data($key, $iv, $cipher_hex) {
return rtrim(
mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
pack('H*', $key),
pack('H*', $cipher_hex),
MCRYPT_MODE_CBC,
pack('H*', $iv)
),
"\x00..\x1F"
);
}
نصائح أخرى
وشخصيا أنا المشبوهة قليلا من وظيفة hex_to_str
homebrewed - لماذا لا تستخدم فقط pack('H*', $key)