दिलचस्प पोस्ट
MySQL में डेटा कैसे उत्पन्न करें? म्कक के साथ एचटीटीपी कंटेंटेबबेस मजाक करना PHP में निष्पादन समय-सीमा को कैसे बढ़ाएं? इंटेल सैंड्रिब्रिज-परिवार सीपीयू में पाइप लाइन के लिए एक कार्यक्रम को हटाना कक्षा के भीतर पायथन कॉल फंक्शन क्या UIAlertView में एक चित्र दिखाना संभव है? पायथन वर्लेवीनव प्रश्न किसी सर्वर पर एक छवि के रूप में एक HTML5 कैनवास कैसे सहेज सकता है? सी ++ में सूचक-से-सदस्य-> * और। * ऑपरेटर क्या हैं? JFrame बनाम इसे कार्यक्रम के अंदर बनाते हैं बिना किसी जबरन सूची में सूची को कैसे समतल करें? क्या एक सरल, सुरुचिपूर्ण तरीका है जो सिंगलोन को परिभाषित करता है? एकाधिक तालिकाओं से गिनती (*) का चयन करें कम से कम अंतर वाले दो सेटों में एक सरणी को विभाजित करें मैं एक PHP-unsaryialize jQuery-serialized प्रपत्र कैसे कर सकता हूँ?

OpenSSL EVP_BytesToKey विधि का सी # संस्करण?

मैं OpenSSL EVP_BytesToKey फ़ंक्शन के सीधे-अप। NET कार्यान्वयन की तलाश कर रहा हूं। मुझे मिली सबसे निकटतम चीज प्रणाली है। सुरक्षा। क्रिप्टोग्राफी। पासवर्ड ड्रायवबाइट्स क्लास (और आरएफसी 2898 डरिवब्लैट्स ) लेकिन यह थोड़ा अलग दिखता है और एक ही कुंजी उत्पन्न नहीं करता है और ईवीवी EVP_BytesToKey के रूप में

मुझे यह क्रियान्वयन भी मिला, जो एक अच्छी शुरुआत की तरह लगता है लेकिन खाते का ध्यान रखना नहीं है।

मुझे पता है कि ओपनएसएसएल। नेट है लेकिन यह केवल मूल openssl DLL के आसपास एक आवरण है "वास्तविक" .NET कार्यान्वयन नहीं है

Solutions Collecting From Web of "OpenSSL EVP_BytesToKey विधि का सी # संस्करण?"

मुझे EVP_BytesToKey विधि ( /soc/ssleay.txt में openssl स्रोत में) के इस छद्म-कोड स्पष्टीकरण मिला है:

/* M[] is an array of message digests * MD() is the message digest function */ M[0]=MD(data . salt); for (i=1; i<count; i++) M[0]=MD(M[0]); i=1 while (data still needed for key and iv) { M[i]=MD(M[i-1] . data . salt); for (i=1; i<count; i++) M[i]=MD(M[i]); i++; } If the salt is NULL, it is not used. The digests are concatenated together. M = M[0] . M[1] . M[2] ....... 

इसलिए इस आधार पर कि मैं इस सी # विधि (जो कि मेरे उद्देश्यों के लिए काम करता है और 32-बाइट कुंजी और 16-बाइट iv) के साथ काम करने में सक्षम था:

 private static void DeriveKeyAndIV(byte[] data, byte[] salt, int count, out byte[] key, out byte[] iv) { List<byte> hashList = new List<byte>(); byte[] currentHash = new byte[0]; int preHashLength = data.Length + ((salt != null) ? salt.Length : 0); byte[] preHash = new byte[preHashLength]; System.Buffer.BlockCopy(data, 0, preHash, 0, data.Length); if (salt != null) System.Buffer.BlockCopy(salt, 0, preHash, data.Length, salt.Length); MD5 hash = MD5.Create(); currentHash = hash.ComputeHash(preHash); for (int i = 1; i < count; i++) { currentHash = hash.ComputeHash(currentHash); } hashList.AddRange(currentHash); while (hashList.Count < 48) // for 32-byte key and 16-byte iv { preHashLength = currentHash.Length + data.Length + ((salt != null) ? salt.Length : 0); preHash = new byte[preHashLength]; System.Buffer.BlockCopy(currentHash, 0, preHash, 0, currentHash.Length); System.Buffer.BlockCopy(data, 0, preHash, currentHash.Length, data.Length); if (salt != null) System.Buffer.BlockCopy(salt, 0, preHash, currentHash.Length + data.Length, salt.Length); currentHash = hash.ComputeHash(preHash); for (int i = 1; i < count; i++) { currentHash = hash.ComputeHash(currentHash); } hashList.AddRange(currentHash); } hash.Clear(); key = new byte[32]; iv = new byte[16]; hashList.CopyTo(0, key, 0, 32); hashList.CopyTo(32, iv, 0, 16); } 

अद्यतनः यहां अधिक / कम समान कार्यान्वयन है लेकिन .NET DeriveBytes इंटरफ़ेस का उपयोग करता है: https://gist.github.com/1339719


OpenSSL 1.1.0c ने कुछ आंतरिक घटकों में डाइजेस्ट एल्गोरिथम को बदल दिया । पूर्व में, MD5 का उपयोग किया गया था, और 1.1.0 SHA256 पर स्विच किया गया था। सावधान रहें कि परिवर्तन EVP_BytesToKey और आज्ञाओं दोनों में आपको प्रभावित नहीं कर रहा है जैसे कि openssl enc