2009-09-18 12 views
6

मैं कुछ डेटा एन्क्रिप्ट करने के लिए सी ++ में डीपीएपीआई का उपयोग कर रहा हूं जिसे मुझे फ़ाइल में स्टोर करने की आवश्यकता है। बात यह है कि मैं सी # से फाइल को पढ़ने की जरूरत है, तो मैं करने में सक्षम होने की जरूरत है:डीपीएपीआई का उपयोग करके एन्क्रिप्ट करते समय मुझे अलग-अलग आउटपुट क्यों मिलते हैं?

सी ++ एन्क्रिप्ट, सी डिक्रिप्ट ++ (अच्छा काम कर रहा है)

सी # एन्क्रिप्ट, सी # डिक्रिप्ट (अच्छा काम कर रहा है)

सी ++ एन्क्रिप्ट, सी # डिक्रिप्ट और उपाध्यक्ष प्रतिकूल (काम नहीं कर रहा)

सी # में मैं तरीकों CryptProtectData और CryptUnprotectData PInvoke को DllImport उपयोग कर रहा हूँ, और मैं उन्हें लागू के रूप में समझाया here। मुझे पता है कि सी # में मैं संरक्षित डेटा वर्ग में निहित विधियों का उपयोग कर सकता हूं लेकिन यह सुनिश्चित करने के लिए कि मैं दोनों कोड (सी ++ और सी #) देख और काम करता हूं, मैं इसे इस तरह से कर रहा हूं (DllImport का उपयोग करके)।

अब अजीब बात यह है कि दोनों कोड एक ही लग रहा है, भले ही मैं इस पाठ के लिए उदाहरण के लिए अलग अलग आउटपुट मिलता है, यह है:

"सादा पाठ"

C++ मैं:

01 00 00 00 डी 0 8 सी 9 डी डीएफ 01 15 डी 1 11 8 सी 7 ए 00 सी0 4 एफ सी 2 9 7 ईबी 01 00 00 00 2 ई 6 एफ 88 86 ई 6 16 9 बी 4 एफ 9 बी बीएफ 35 डीए 9 एफ सी 6 ईसी 12 00 00 00 00 02 00 00 00 00 00 03 66 00 00 ए 8 00 00 00 10 00 00 00 93 06 68 39 डीबी 58 एफई ई 9 सी 4 1 एफ बी 3 डी 7 बी 0 ए बी 7 48 00 00 00 00 80 00 00 ए0 00 00 00 10 00 00 00 36 4 ई 84 05 0 डी 4 ए 34 15 9 7 डीसी 5 बी 1 एफ 6 सी ए 4 1 9 डी 9 10 00 00 00 एफ 5 33 9 एफ 55 49 94 26 54 2 बी सी 8 सीबी 70 7 बी एफई चुनाव आयोग 96 14 00 00 00 सी 5 23 डीए बीए सी 8 23 6C 0B बी 3 88 69 06 00 95 29 एई 76 ए 7 63 इ 4

और सी # में मैं:

01 00 00 00 D0 8C 9 डी डीएफ 01 15 डी 1 11 8 सी 7 ए 00 सी0 4 एफ सी 2 9 7 ईबी 01 00 00 00 2 ई 6 एफ 88 86 ई 6 16 9 बी 4 एफ 9 बी बीएफ 35 डीए 9 एफ सी 6 ईसी 12 00 00 00 00 02 00 00 00 00 00 03 66 00 00 ए 8 00 00 00 10 00 00 00 34 सी 4 40 सीडी 91 ईसी 94 66 ई 5 ई 9 23 एफ 7 9ई 04 9 सी 83 00 00 00 00 04 80 00 00 ए0 00 00 00 10 00 00 00 12 54 1 ई 26 72 26 0 ए डी 1 11 1 डी 4 डी ईएफ 13 1 डी बी 2 6 एफ 10 00 00 00 81 9 डी 46 37 डी 1 68 5 डी 17 बी 8 23 78 48 18 ईडी 06 ईडी 14 00 00 00 ई 4 45 07 1 सी 08 55 99 80 ए 4 59 डी 9 33 बीसी 0 बी 71 35 3 9 05 सी 4 बीबी

जैसा कि आप देख सकते हैं कि पहले वर्ण समान हैं लेकिन शेष ar ई नहीं, इसलिए अगर किसी को यह पता चल जाए कि यह क्यों हो रहा है, तो मैं मदद की सराहना करता हूं।

धन्यवाद।

कोड सी ++ में:

सी # में

value = "plain text"; 
DATA_BLOB DataIn; 
DATA_BLOB DataOut; 

BYTE *pbDataInput =(BYTE *)(char*)value.c_str(); 
DWORD cbDataInput = strlen((char *)pbDataInput)+1; 
DataIn.pbData = pbDataInput; 
DataIn.cbData = cbDataInput; 

CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut))

कोड:

(आप कैसे मेरी सी # कोड here लग रहा है देख सकते हैं, के बाद से इस माइक्रोसॉफ्ट उदाहरण में एक के समान है)

+2

कुछ स्वरूपित हेक्स संपादक उन स्क्रीनशॉट के बजाय डेटा उदाहरण की तरह अच्छा होगा। – schnaader

+0

स्क्रीनशॉट नहीं बना सकते हैं। –

+0

@ न्यूटन: आप इसे एक बेहतर टैब पर देखने के लिए ग्राफ़िक के लिंक को खोल सकते हैं (फ़ायरफ़ॉक्स में "ग्राफिक दिखाएं" काम भी) – schnaader

उत्तर

5

यह अगर आप अपना सी ++ और अपना सी # कोड पोस्ट कर सकते हैं तो मदद मिलेगी। शायद कुछ सूक्ष्म पैरामीटर अंतर या इस तरह कुछ हैं। उदाहरण के लिए, आपको यह सुनिश्चित करना चाहिए कि pOptionalEntropy पैरामीटर समान है (या यह जांचने के लिए NULL पर सेट करें कि यह त्रुटि स्रोत है या नहीं)। साथ ही, एक ही पीसी पर एन्क्रिप्ट और डिक्रिप्ट करने का प्रयास करें:

[...] डिक्रिप्शन आमतौर पर केवल कंप्यूटर जहां डाटा था एन्क्रिप्टेड

पर किया जा सकता (स्रोत: MSDN)

संपादित करें: कोड आपके द्वारा पोस्ट की और MSDN से सी # संस्करण पर कुछ टिप्पणियां (के कुछ हिस्सों यह निम्न):

public byte[] Encrypt(byte[] plainText, byte[] optionalEntropy) { 
    [...] 
    int bytesSize = plainText.Length; 
    plainTextBlob.pbData = Marshal.AllocHGlobal(bytesSize); 
    plainTextBlob.cbData = bytesSize; 
    Marshal.Copy(plainText, 0, plainTextBlob.pbData, bytesSize); 
    [...] 
    dwFlags = CRYPTPROTECT_LOCAL_MACHINE|CRYPTPROTECT_UI_FORBIDDEN; 
    [...] 
    if(null == optionalEntropy) 
    {//Allocate something 
    optionalEntropy = new byte[0]; // Is copied to entropyBlob later 
    } 
    [...] 
    retVal = CryptProtectData(ref plainTextBlob, "", ref entropyBlob,  
    IntPtr.Zero, ref prompt, dwFlags, 
    ref cipherTextBlob); 
    [...] 
} 

और यहाँ दोनों को ध्यान में रखते है करने के लिए फिर से अपनी सी ++ कोड है:

[...] 
BYTE *pbDataInput =(BYTE *)(char*)value.c_str(); 
DWORD cbDataInput = strlen((char *)pbDataInput)+1; 
[...] 
CryptProtectData(&DataIn, NULL, NULL, NULL, NULL, 0, &DataOut)) 

पैरामीटर मेल नहीं खाते हैं और मुझे लगता है कि यह अंतर का स्रोत है।

पहली बात झंडे है। सी # कोड dwFlags का उपयोग करता है! = 0, आपका सी ++ कोड dwFlags = 0 का उपयोग करता है, इसलिए यह स्पष्ट रूप से एक अंतर है।

मुझे एंट्रॉपी के बारे में निश्चित नहीं है। यदि आपने वैकल्पिक एन्टरॉपी = शून्य नहीं किया है तो यह एक अंतर है, लेकिन यदि यह शून्य है, तो "नया बाइट [0]" असाइनमेंट है और मुझे यकीन नहीं है कि यह क्या होगा, लेकिन मुझे लगता है कि आपको कम से कम प्रयास करना चाहिए C++ कोड से मेल खाने के लिए CryopyProtectData को entropyBlob के बजाय IntPtr.Zero पास करने के लिए।

अंतिम, लेकिन कम से कम नहीं, आपके सी ++ कोड में पिछली एनयूएल शामिल है जो सी स्ट्रिंग को सीमित करता है, मुझे नहीं पता कि यहां एन्क्रिप्शन कैसे काम करता है लेकिन वहां एन्क्रिप्शन हैं जो एक बाइट अलग होने पर आपको बहुत अलग आउटपुट देंगे (या आपके पास इस मामले में एक और बाइट है), तो आपको या तो सी # कोड में एनयूएल को समाप्त करना चाहिए या इसे सी ++ कोड में हटा देना चाहिए।

+0

मैंने कुछ कोड जोड़ा जो मुझे उम्मीद है कि इससे मदद मिलती है। – Vic

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

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