2012-01-06 6 views
6

पर यह लापता है यह मेरा पहला सवाल है इसलिए कृपया मुझे बताएं कि क्या मैं कुछ गलत करता हूं :)।8 बाइट EVP_DecryptFinal

मेरे समस्या मैं

EVP_DecryptInit(&ctx1, EVP_des_ecb(), tmpkey, NULL); 
EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout, &outlf); 
printf("DECLEN:%i",outlu + outlf); 

का उपयोग एक बाइनरी फ़ाइल को डिक्रिप्ट करने के लिए है। फ़ाइल 248 बाइट लंबी है लेकिन प्रिंटफ केवल मुझे ईवीपी 240 बाइट डिक्रिप्ट करता है। keysigfilelength 248 है और अद्यतन को यह बताना चाहिए कि 248 बाइट्स को डिक्रिप्ट करने की आवश्यकता है।

मुझे नहीं पता कि यह क्यों काम नहीं करता है और अगर आप मुझे प्रबुद्ध कर सकते हैं तो खुश होंगे।

संपादित करें: मैं सिर्फ आदेश

openssl enc -e -des-ecb -in test.txt -out test.bin -K 00a82b209cbeaf00 

साथ मैन्युअल रूप से एक फ़ाइल एन्क्रिप्ट और यह 8 बाइट्स की वृद्धि हुई: हे। मुझे अभी भी पता नहीं है कि वे कहां से आए हैं, लेकिन मुझे नहीं लगता कि मेरे कार्यक्रम में मेरी सामान्य त्रुटि इस वजह से है।

इस पूरे समस्या का संदर्भ मेरे विश्वविद्यालय में एक सूचना सुरक्षा पाठ्यक्रम है। हमें अलग-अलग एल्गोरिदम के साथ समान कार्य मिलते हैं, लेकिन यहां तक ​​कि जिसने अपना प्रोग्राम किया है, वह सफलतापूर्वक पता नहीं लगा सकता कि मेरे कार्यक्रम में समस्या कहां है।

क्या आपके लिए अपना पूरा कार्यक्रम पोस्ट करना ठीक है?

+0

बस यह सुनिश्चित करने के लिए, यह विंडोज़ पर कुछ नहीं है और फ़ाइल को टेक्स्ट मोड में खोलने की तरह कुछ नहीं है ताकि \ r को हटा दिया जा सके? –

+0

http://pastebin.com/H3riQhm7 यहां फ़ाइल का हेक्सडम्प-सी है। सभी काम लिनक्स – outsmartin

+0

में किया जाता है मैंने सोचा कि यह ऐसा नहीं होगा, लेकिन यह सुनिश्चित करने के लिए बेहतर होगा। –

उत्तर

2

मैं अपने ठीक आशा अपने ही सवाल का जवाब देने।

EVP_DecryptUpdate(&ctx1, keysigout, &outlu ,keysigin, keysigfilelength); 
EVP_DecryptFinal(&ctx1, keysigout + outlu, &outlf); 

समस्या outlu याद आ रही थी, DecryptFinal की कोशिश की पूरे ब्लॉक को फिर से डिक्रिप्ट करने के लिए। जब ​​मैंने ओ जोड़ा utlu मुझे outlf में 7 बाइट मिला, और यह काम किया। भविष्य के संदर्भ के लिए मैं नीचे पूरा कार्य जोड़ता हूं। यह कुंजी और iv डेटा के एक ब्लॉक होने की अपेक्षा करता है।

int decrypt(const EVP_CIPHER *cipher,unsigned char *key, unsigned char *encryptedData, int encryptedLength,unsigned int * length, unsigned char ** decryptedData) 
{ 
    int decryptedLength = 0, lastDecryptLength = 0, ret; 
    unsigned char * iv = NULL; 
    EVP_CIPHER_CTX *cryptCtx = EVP_CIPHER_CTX_new(); 
    EVP_CIPHER_CTX_init(cryptCtx); 
    *decryptedData = malloc (encryptedLength * sizeof(char)); 

    if(cipher->iv_len != 0) iv = key + cipher->key_len; 

    EVP_DecryptInit_ex(cryptCtx, cipher, NULL, key, iv); 
    EVP_DecryptUpdate(cryptCtx, *decryptedData, &decryptedLength, encryptedData, encryptedLength); 
    ret = EVP_DecryptFinal_ex(cryptCtx, *decryptedData + decryptedLength, &lastDecryptLength); 

    *length = decryptedLength + lastDecryptLength; 

    EVP_CIPHER_CTX_free(cryptCtx); 
    EVP_cleanup(); 
    return ret; 
} 
0

क्योंकि ब्लॉक सिफर केवल एक इनपुट पर काम करना चाहते हैं जो उनके ब्लॉक आकार के एकाधिक हैं, इनपुट सामान्य रूप से इस आवश्यकता को पूरा करने के लिए गद्देदार होता है। (openssl enc सहित कई कार्यक्रमों के लिए डिफ़ॉल्ट प्लेन 8 बाइट्स तो पैडिंग बाइट्स जोड़ रहे हैं की एक बहु नहीं है, तो PKCS #5 padding

उपयोग करने के लिए इतना है कि यह है। यदि यह पहले से ही 8 बाइट्स की एक बहु तो 8 बाइट्स है गद्दी जोड़ रहे हैं। इस प्रकार यह पूरी तरह से सामान्य है एन्क्रिप्टेड डेटा प्लेन से अधिक समय होने के लिए।

+0

मेरा सादा टेक्स्ट 248 बाइट था और वह अभी भी 8 बाइट – outsmartin

+0

जोड़ता है यदि सादा पाठ 248 बाइट्स है, 8 बाइट जोड़े गए हैं - मेरा शब्द बहुत स्पष्ट नहीं था –

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