2015-08-19 3 views
7

हम अपने सिस्टम में बहुत सी साझा कार्यक्षमता को कम करने और पीसीएल पुस्तकालयों को पोर्ट करने की प्रक्रिया में हैं। मुझे पीसीएलक्रिप्टो का उपयोग कर कोई समस्या है। मैं अपने डेटाबेस में कुछ मौजूदा डेटा ले रहा हूं, और उसी एल्गोरिदम के साथ इसे डिक्रिप्ट करने का प्रयास कर रहा हूं। मुझे मूल्य वापस मिल जाता है, लेकिन अंत में 16 अतिरिक्त बाइट्स हैं जो सिर्फ कचरे हैं।सिस्टम। सुरक्षा। क्रिप्टोग्राफी बनाम पीसीएलक्रिप्टो

देखें कोड नीचे: पुराने एल्गोरिथ्म का उपयोग कर System.Security.Cryptography PCLCrypto

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) { 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcb); 

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer); 
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey); 
    byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length); 
} 

का उपयोग कर पुराने संस्करण का उपयोग करते हुए

public static string SymmetricEncrypt(this string plaintext, string key, SymmetricAlgorithm algorithm) 
{ 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] plainTextBuffer = Encoding.UTF8.GetBytes(plaintext); 

    var symmetricAlgorithm = new AesCryptoServiceProvider(); 
    symmetricAlgorithm.Key = keyBuffer; 
    symmetricAlgorithm.Mode = CipherMode.ECB; 

    var encryptor = symmetricAlgorithm.CreateEncryptor(); 
    byte[] cipherBuffer = encryptor.TransformFinalBlock(plainTextBuffer, 0, plainTextBuffer.Length); 
    symmetricAlgorithm.Clear(); 

    return Convert.ToBase64String(cipherBuffer); 
} 


public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) 
    { 
     byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
     byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 
     var symmetricAlgorithm = new AesCryptoServiceProvider(); 
     symmetricAlgorithm.Key = keyBuffer; 
     symmetricAlgorithm.Mode = CipherMode.ECB; 

     var decryptor = symmetricAlgorithm.CreateDecryptor(); 
     byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
     symmetricAlgorithm.Clear(); 

     return Encoding.Default.GetString(plainTextBuffer); 
    } 

डिक्रिप्शन: plainTextBuffer 16 बाइट्स, नया संस्करण है यह 32 बाइट्स है।

सहायता!

+1

यह एक सक्रिय गिटहब प्रोजेक्ट है, इसलिए आपको अपने लेखकों तक पहुंचने के लिए एक समस्या की रिपोर्ट करनी चाहिए। –

+0

आपके पोस्ट किए गए कोड की बहुत नीचे की रेखा पर, मुझे लगता है कि आप plainTextBuffer टाइप करना चाहते हैं, सादा पाठ नहीं। यहां कठिनाई यह है कि गिटहब परियोजना सिर्फ अन्य एपीआई तक पहुंच रही है और अपने स्वयं के एईएस को लागू नहीं करती है। लेकिन कहा कि, मुझे इस व्यवहार के लिए भंडार में और न ही आपके कोड में कोई कारण नहीं मिल रहा है। अजीब, आप TransformFinalBlock को कॉल में plainTextBuffer घोषित करते हैं, एक ऐसा फ़ंक्शन जिसे मैंने कभी भी एल्गोरिदम के वास्तविक ब्लॉक आकार से बड़ा नहीं किया है, फिर भी आपके पास उन अतिरिक्त बाइट्स हैं। मुझे खेद है कि मैं स्टंप हूं। – WDS

उत्तर

4

यह एक पैडिंग समस्या की तरह लगता है।

.NET में बेस क्लास सममित एल्गोरिदम के स्रोत को देखते हुए, जो AesCryptoServiceProvider का आधार है, डिफ़ॉल्ट पैडिंग पैडिंगमोड.पीकेसीएस 7 है। ऐसा लगता है कि आपने पैडिंग मोड को परिभाषित नहीं किया है, इसलिए मुझे लगता है कि डिफ़ॉल्ट अभी भी लागू होता है।

जबकि मैंने पहले पीसीएलक्रिप्टो लाइब्रेरी का उपयोग नहीं किया है, तो जिथब पर एक त्वरित रूप से देखने के लिए कुछ एसेकब एल्गोरिदम हैं: एएसईसीबी और एएसईसीबीपीकेसी 7। एईएसईसीबी के नाम से पैडिंग मोड की अनुपस्थिति मुझे संकेत देगी कि इसमें कोई पैडिंग नहीं है (और इस प्रकार कोई पैडिंग नहीं हटाई गई है), जो .NET पुस्तकालयों में पैडिंगमोड.None के बराबर होगी।

पीसीएलक्रिप्टो में प्रयोग करने के लिए पीसीएलक्रिप्टो। सममित एल्गोरिदम.एएसईसीबीपीकेसी 7 एल्गोरिदम का उपयोग करने का प्रयास करें और देखें कि क्या यह आउटपुट के अंत में आप जो पैडिंग देख रहे हैं उसे हटा देता है या नहीं।

अद्यतन

मैं सिर्फ यह परीक्षण किया है, और इसे सही ढंग से काम करते हैं और गद्दी आप देख किया जाएगा दूर करने के लिए प्रकट होता है:

public static string SymmetricDecrypt(this string cipherText, string key, SymmetricAlgorithm algorithm) { 
    byte[] keyBuffer = Convert.FromBase64String(key.Hash(HashAlgorithm.MD5)); 
    byte[] cipherTextBuffer = Convert.FromBase64String(cipherText); 

    ISymmetricKeyAlgorithmProvider symmetricAlgorithm = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7); 

    var symmetricKey = symmetricAlgorithm.CreateSymmetricKey(keyBuffer); 
    var decryptor = WinRTCrypto.CryptographicEngine.CreateDecryptor(symmetricKey); 
    byte[] plainTextBuffer = decryptor.TransformFinalBlock(cipherTextBuffer, 0, cipherTextBuffer.Length); 
    return UTF8Encoding.UTF8.GetString(plainTextBuffer, 0, plainTextBuffer.Length); 
}

केवल परिवर्तन से एल्गोरिथ्म बदल रहा था PCLCrypto.SymmetricAlgorithm.AesEcb PCLCrypto.SymmetricAlgorithm.AesEcbPkcs7

+0

आप मेरे नायक हैं। बहुत बहुत धन्यवाद। –

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