2011-02-03 4 views
1

を破損している私は、次のコードを使用してオンザフライでファイルを暗号化しようとしています:NSData.FromStream() - ファイルサイズのダブル、ファイルが

NSError oError = null; 
using (FileStream oStream = File.Open (sSourcePathAndFile, FileMode.Open)) 
{ 
    NSData oData = NSData.FromStream (oStream); 
    // Save and encrypt. 
    oData.Save (sDestPathAndFile, NSDataWritingOptions.FileProtectionAlways, out oError); 
} 

そこにはエラーはありませんが、保存されたすべてのファイルが約倍増していますサイズが壊れています。書き込みオプション "FileProtectionNone"を設定しても、ファイルを変更してはならない場合でも、同じ結果が得られます。

何が起こっているのでしょうか?

答えて

0

このヘルプは役に立ちませんか? MonoTouchで上でこれを試していないが、私の知る限り必要な名前空間は、スタックのmTouchたぶん

using System.Security; 
using System.Security.Cryptography; 
using System.Runtime.InteropServices; 

// Function to Generate a 64 bits Key. 
     static string GenerateKey() 
     { 
     // Create an instance of Symetric Algorithm. Key and IV is generated automatically. 
     DESCryptoServiceProvider desCrypto =(DESCryptoServiceProvider)DESCryptoServiceProvider.Create(); 

     // Use the Automatically generated key for Encryption. 
     return ASCIIEncoding.ASCII.GetString(desCrypto.Key); 
     } 

     static void EncryptFile(string sInputFilename, 
     string sOutputFilename, 
     string sKey) 
     { 
     FileStream fsInput = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.Read); 

     FileStream fsEncrypted = new FileStream(sOutputFilename, 
      FileMode.Create, 
      FileAccess.Write); 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
     ICryptoTransform desencrypt = DES.CreateEncryptor(); 
     CryptoStream cryptostream = new CryptoStream(fsEncrypted, 
      desencrypt, 
      CryptoStreamMode.Write); 

     byte[] bytearrayinput = new byte[fsInput.Length]; 
     fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 
     cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 
     cryptostream.Close(); 
     fsInput.Close(); 
     fsEncrypted.Close(); 
     } 

     static void DecryptFile(string sInputFilename, 
     string sOutputFilename, 
     string sKey) 
     { 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     //A 64 bit key and IV is required for this provider. 
     //Set secret key For DES algorithm. 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     //Set initialization vector. 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 

     //Create a file stream to read the encrypted file back. 
     FileStream fsread = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.Read); 
     //Create a DES decryptor from the DES instance. 
     ICryptoTransform desdecrypt = DES.CreateDecryptor(); 
     //Create crypto stream set to read and do a 
     //DES decryption transform on incoming bytes. 
     CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
      desdecrypt, 
      CryptoStreamMode.Read); 
     //Print the contents of the decrypted file. 
     StreamWriter fsDecrypted = new StreamWriter(sOutputFilename); 
     fsDecrypted.Write(new StreamReader(cryptostreamDecr).ReadToEnd()); 
     fsDecrypted.Flush(); 
     fsDecrypted.Close(); 
     } 

     static void Main() 
     { 
     // Must be 64 bits, 8 bytes. 
     // Distribute this key to the user who will decrypt this file. 
     string sSecretKey; 

     // Get the Key for the file to Encrypt. 
     sSecretKey = GenerateKey(); 

     // For additional security Pin the key. 
     GCHandle gch = GCHandle.Alloc(sSecretKey,GCHandleType.Pinned); 

     // Encrypt the file.   
     EncryptFile(@"C:\MyData.txt", 
      @"C:\Encrypted.txt", 
      sSecretKey); 

     // Decrypt the file. 
     DecryptFile(@"C:\Encrypted.txt", 
      @"C:\Decrypted.txt", 
      sSecretKey); 
     } 
+0

に含まれていますが、なぜ私はiOSとiPhone 3GS +は、ハードウェア暗号化で構築しているでしょうか? – Krumelur

+0

heheheええ私は知っているが、回避策としてあなたは、アプリを生産に持ち帰っているのです:)私はあなたのコードをテストしましたが、私もファイルが壊れてしまったので、私たちはバグを報告するべきだと思います。 – dalexsoto

+0

私はこの奇妙なNovellサイトのバグで失敗しました。経験があれば、バグを報告してください! – Krumelur

関連する問題