2011-06-23 13 views
6

मुझे एक्सएमएल फाइलों को स्थानांतरित करने की आवश्यकता है और उन्हें एन्क्रिप्ट किया जाना आवश्यक है। मैंने कुछ उदाहरण पाया है कि मैं करीब हूं लेकिन जब मैं फ़ाइल को डिक्रिप्ट करता हूं तो मैं पिछली जंक वर्णों के साथ समाप्त होता हूं। इसके बारे में कुछ पोस्ट हैं लेकिन मैंने ऐसा कोई नहीं देखा है जो वास्तव में मदद करेगा। यहां एन्क्रिप्ट और डिक्रिप्ट कोड है।फ़ाइलों को एन्क्रिप्ट/डिक्रिप्ट करने के लिए रिजेंडेल का उपयोग

private void EncryptFile(string inputFile, string outputFile, string key) { 
    try { 
     byte[] keyBytes; 
     keyBytes = Encoding.Unicode.GetBytes(key); 

     Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes); 

     RijndaelManaged rijndaelCSP = new RijndaelManaged(); 
     rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize/8); 
     rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize/8); 

     ICryptoTransform encryptor = rijndaelCSP.CreateEncryptor(); 

     FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read); 

     byte[] inputFileData = new byte[(int)inputFileStream.Length]; 
     inputFileStream.Read(inputFileData, 0, (int)inputFileStream.Length); 

     FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write); 

     CryptoStream encryptStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write); 
     encryptStream.Write(inputFileData, 0, (int)inputFileStream.Length); 
     encryptStream.FlushFinalBlock(); 

     rijndaelCSP.Clear(); 
     encryptStream.Close(); 
     inputFileStream.Close(); 
     outputFileStream.Close(); 
    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message, "Encryption Failed!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 

    MessageBox.Show("File Encryption Complete!"); 

} 

private void DecryptFile(string inputFile, string outputFile, string key) { 
    try { 
     byte[] keyBytes = Encoding.Unicode.GetBytes(key); 

     Rfc2898DeriveBytes derivedKey = new Rfc2898DeriveBytes(key, keyBytes); 

     RijndaelManaged rijndaelCSP = new RijndaelManaged(); 
     rijndaelCSP.Key = derivedKey.GetBytes(rijndaelCSP.KeySize/8); 
     rijndaelCSP.IV = derivedKey.GetBytes(rijndaelCSP.BlockSize/8); 
     ICryptoTransform decryptor = rijndaelCSP.CreateDecryptor(); 

     FileStream inputFileStream = new FileStream(inputFile, FileMode.Open, FileAccess.Read); 

     CryptoStream decryptStream = new CryptoStream(inputFileStream, decryptor, CryptoStreamMode.Read); 

     byte[] inputFileData = new byte[(int)inputFileStream.Length]; 
     decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length); 

     FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write); 
     outputFileStream.Write(inputFileData, 0, inputFileData.Length); 
     outputFileStream.Flush(); 

     rijndaelCSP.Clear(); 

     decryptStream.Close(); 
     inputFileStream.Close(); 
     outputFileStream.Close(); 
    } 
    catch (Exception ex) { 
     MessageBox.Show(ex.Message, "Decryption Failed!", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     return; 
    } 

    MessageBox.Show("File Decryption Complete!"); 
} 

मैं

<?xml version="1.0" encoding="UTF-8"?> 
<transaction> 
    <header> 
    <qOrderNumber></qOrderNumber> 
    <qRequestDate></qRequestDate> 
    <testOrder></testOrder> 
    <qCustomerNumber></qCustomerNumber> 
    <transactionStatus></transactionStatus> 
    </header> 
    <lines> 
    <line> 
     <productID></productID> 
     <serialNumber></serialNumber> 
    </line> 
    <line> 
     <productID></productID> 
     <serialNumber></serialNumber> 
    </line> 
    </lines> 
</transaction>NULNULNULNULNULNUL 

उत्तर

10

डिक्रिप्ट करते समय, CryptoStream से वापसी मूल्य पर ध्यान दें। कॉल पढ़ें। यह आपको अपने बाइट सरणी में डिक्रिप्ट किए गए डेटा की लंबाई बताता है (आमतौर पर पैडिंग के कारण एन्क्रिप्टेड डेटा की लंबाई से मेल नहीं खाता)। अपने डिक्रिप्ट फ़ंक्शन में निम्न का उपयोग करने का प्रयास करें:

int decrypt_length = decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length); 
FileStream outputFileStream = new FileStream(outputFile, FileMode.Create, FileAccess.Write); 
outputFileStream.Write(inputFileData, 0, decrypt_length); 
+0

और हमारे पास विजेता है !!!! बहुत बहुत भाई धन्यवाद! – mjames

2

RijndaelManaged वस्तु पर साथ खत्म, PaddingMode.ANSIX923 या PaddingMode.ISO10126 करने के लिए Padding गुण सेट।

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

दोनों एन्क्रिप्ट में पैडिंग गुण सेट करें और दिनचर्या को उसी मान पर डिक्रिप्ट करें।

rijndaelCSP.Padding = PaddingMode.ANSIX923; 

यह जानता है क्या उम्मीद करें, तो डिक्रिप्शन धारा पैडिंग स्वचालित रूप से हटा देंगे, ताकि आगे कोई परिवर्तन आवश्यक होना चाहिए।

अद्यतन

अपने कोड को देख से, ऐसा लगता है कि बाइट्स है कि आप आउटपुट फ़ाइल के लिए लिख रहे की संख्या इनपुट फ़ाइल से में पढ़े गए बाइट की संख्या के बराबर है।

byte[] inputFileData = new byte[(int)inputFileStream.Length]; 
decryptStream.Read(inputFileData, 0, (int)inputFileStream.Length); 

डिक्रिप्शन प्रक्रिया पूरी तरह से इनपुट में गद्दी की वजह से, inputFileData सरणी को भरने के लिए नहीं जा रहा है।

आउटपुट स्ट्रीम तब बफर की पूरी लंबाई लिख जाएगी, भले ही यह पूरी तरह से भरी न हो।

outputFileStream.Write(inputFileData, 0, inputFileData.Length); 

यह आपके नल का स्रोत है।

आप ताकि यह भविष्य में कोई निश्चित-लम्बाई Bufferes का उपयोग करता है जिस तरह से आप एन्क्रिप्शन और डिक्रिप्शन कर रहे हैं बदलने के लिए कर सकते हैं। वैकल्पिक रूप से, आप शुरुआत में एन्क्रिप्टेड डेटा की लंबाई को स्टोर कर सकते हैं, और उस लंबाई के अनुरूप केवल बाइट्स की संख्या लिख ​​सकते हैं।

+0

+1 मैंने पहले इस में भाग लिया है। मेरा मानना ​​है कि यह वह समाधान है जिसका उपयोग मैंने इसे ठीक करने के लिए किया था। –

+0

मैंने उन पैडिंग मोड दोनों की कोशिश की और एक ही परिणाम प्राप्त किया। – mjames

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

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