2012-07-25 18 views
5

PHP documentation for mcrypt_get_iv_size में यह कहा गया है कि वापसी मान शून्य हो जाएगा जब एल्गोरिथ्म/ब्लॉक मोड संयोजन एक चतुर्थ का उपयोग नहीं करता:क्या आईवी की आवश्यकता नहीं होने पर PHP की mcrypt_get_iv_size वास्तव में शून्य लौटाती है?

बाइट में प्रारंभ वेक्टर (चतुर्थ) के आकार देता है। त्रुटि पर फ़ंक्शन गलत लौटाता है। यदि निर्दिष्ट सिफर/मोड संयोजन में IV को अनदेखा किया जाता है तो शून्य वापस कर दिया जाता है।

जब मैं इस कार्य को MCRYPT_DES के साथ अलगो और MCRYPT_MODE_ECB के रूप में कॉल करता हूं, तो यह अपेक्षित 0 (शून्य) के बजाय 8 (आठ) देता है।

यह मेरी समझ है कि ईसीबी IV का उपयोग नहीं करता और नहीं कर सकता है, और इसलिए मुझे शून्य मान की उम्मीद है। क्या यह गलत है, दस्तावेज गलत है, या क्या मुझे कुछ और याद आ रही है?

निम्नलिखित स्निपेट समस्या को दर्शाता है:

<?php 
// I expect this call to return zero. 
$size = mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB); 
echo 'IV Size: ' . $size . PHP_EOL; 

कृपया ध्यान दें कि मैं वास्तव में वास्तविक दुनिया एन्क्रिप्शन के लिए ईसीबी का उपयोग नहीं कर रहा हूँ, मैं बस एक मनमाना अगर निर्धारित करने के लिए एक विश्वसनीय तरीका खोजने की कोशिश कर रहा हूँ algo/मोड एक चतुर्थ की आवश्यकता है। (मुझे पता है कि mcrypt लाइब्रेरी में "mcrypt_enc_mode_has_iv" फ़ंक्शन है, लेकिन ऐसा समतुल्य PHP फ़ंक्शन नहीं लगता है)।

मैं libmcrypt 2.5.8_1 के साथ PHP v5.3.12 का उपयोग कर रहा हूं।

संभावित समाधान के साथ अद्यतन:

libmcrypt स्रोत ऐसा लगता है जैसे कि mcrypt_enc_get_iv_size() हमेशा किसी भी ब्लॉक सिफर मोड के लिए ब्लॉक आकार वापस आ जाएगी को देखते हुए, लेकिन "पूछ" धारा के लिए एल्गोरिथ्म के लिए वापस गिर जाता है मोड।

int mcrypt_enc_get_iv_size(MCRYPT td) 
{ 
    if (mcrypt_enc_is_block_algorithm_mode(td) == 1) { 
     return mcrypt_enc_get_block_size(td); 
    } else { 
     return mcrypt_get_algo_iv_size(td); 
    } 
} 

mcrypt_get_algo_iv_size() कॉल एल्गोरिथ्म लाइब्रेरी की _mcrypt_get_algo_iv_size() फ़ंक्शन को अग्रेषित कर रहा है। तो उम्मीद है कि इसका मतलब है कि यदि मैं ईसीबी मामले को मैन्युअल रूप से संभालता हूं तो उसे उन एल्गोरिदम के लिए सही परिणाम मिलना चाहिए जिनके लिए स्ट्रीम मोड में IV की आवश्यकता होती है।

उत्तर

1

आप ठीक कह रहे हैं, ईसीबी, एक चतुर्थ का उपयोग नहीं करता के रूप में यह भी PHP documentation for mcrypt_get_iv_size में बताया जाता है:

MCRYPT_MODE_modename स्थिरांक में से एक, या निम्न तार में से एक: "ईसीबी", "सीबीसी "," सीएफबी "," ओबीबी "," एनओएफबी "या" स्ट्रीम "। आईवीबी मोड में चौथाई नजरअंदाज कर दिया गया है क्योंकि इस मोड को की आवश्यकता नहीं है। एन्क्रिप्शन और डिक्रिप्शन चरणों में आपको एक ही IV (सोच: प्रारंभ बिंदु) दोनों की आवश्यकता होगी, अन्यथा आपका एन्क्रिप्शन विफल हो जाएगा।

क्यों mcrypt_get_iv_size(MCRYPT_DES, MCRYPT_MODE_ECB) रिटर्न 8 अजीब है। जानबूझकर या नहीं, आपको इसे अवहेलना करना चाहिए।

+1

मैं इसे दुर्भाग्य से दुर्भाग्य से नहीं देख सकता क्योंकि अकेले ईसीबी एक विश्वसनीय संकेतक नहीं है कि आईवी की आवश्यकता है या नहीं (दस्तावेज़ीकरण में कहीं और यह कहता है कि स्ट्रीम मोड का उपयोग करते समय कुछ सिफर को चतुर्थ की आवश्यकता होती है)। मुझे लगता है कि मैं एक PHP बग रिपोर्ट लॉज करूँगा और देख सकता हूं कि क्या वे कोड या दस्तावेज़ीकरण को बदलने की दिशा में दुबला हैं :)। आपके जवाब के लिए धन्यवाद। – jmalloc

+1

ब्लॉक मोड के रूप में ईसीबी एक विश्वसनीय संकेतक है। कि आप किसी अन्य मोड को लागू करने के लिए ईसीबी का उपयोग इस तथ्य को नहीं बदलते हैं। –

+1

ध्यान दें कि मैं विधि और/या दस्तावेज़ीकरण के परिणाम को बदलने के लिए सभी हूं, हालांकि मैं एक असफल फास्ट स्थिति बनाने के लिए -1 लौटने का विकल्प चुनूंगा। –

संबंधित मुद्दे