2015-06-11 42 views
1

我曾经在微软的XNA中制作游戏。 XNA内置了一个ContentPipeline项目,可以自动将所有图像文件构建到.XNB文件。这具有用户不能轻易修改图像文件的优点(例如在Paint中)。如何将资源文件更改为自定义格式

现在,我在C#/ OpenTK我编码,我使用复制与输出功能,在Visual Studio中通过我的应用程序来复制我的图像,声音和字体文件运行时使用。但是我失去了自定义格式授予的保护。

我的问题是我该如何创建类似的东西?有没有我可以使用的现成库,或者我可以编写的代码来创建它?

压缩对我来说并不特别重要 - 只是改变了扩展自定义的东西是所有我真的很后。

+0

更改文件扩展名不会阻止用户修改您的图像 –

+0

否,但如果它不平凡明显,例如,当他们是.PNG。如果答案是“你可以做到这一点,但更好的答案也是加密/压缩它们,这里是一个加密/解密/压缩/解压缩库”,我很乐意听到这一点。 – Haighstrom

+0

你可以使用任何你喜欢的事后生成事件,例如一个命令行,用密码或其他方式压缩文件。在运行时,您可以使用zip c#库对其进行解压缩。 –

回答

1

这扩展了凯尔的回答和你有关加密程序的问题他。

如果你想要一个简单的加密/解密模式,您可以使用这一个。 keyString是你的Salt,它可以让你稍后解密数据。我从一篇关于加密的博客文章中得到了这段代码,虽然今天可能会有更好的例程,但这个运行良好。

public static byte[] EncryptData(string keyString, byte[] dataToEncrypt) 
    { 
     if (keyString.IsNullOrEmptyTrimmed()) 
      throw new ArgumentNullException("keyString", "You must provide a key string for salting."); 

     if (dataToEncrypt == null) 
      return null; 

     UTF8Encoding utf8 = new UTF8Encoding(); 
     byte[] encryptedData; 
     MD5CryptoServiceProvider hashProvider = new MD5CryptoServiceProvider(); 
     byte[] tdesKey = hashProvider.ComputeHash(utf8.GetBytes(keyString)); 

     TripleDESCryptoServiceProvider tdesAlgorithm = new TripleDESCryptoServiceProvider(); 

     tdesAlgorithm.Key = tdesKey; 
     tdesAlgorithm.Mode = CipherMode.ECB; 
     tdesAlgorithm.Padding = PaddingMode.PKCS7; 


     try 
     { 
      ICryptoTransform encryptor = tdesAlgorithm.CreateEncryptor(); 
      encryptedData = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length); 
     } 
     finally 
     { 
      tdesAlgorithm.Clear(); 
      hashProvider.Clear(); 
     } 

     return encryptedData; 
    } 

    public static byte[] DecryptData(string keyString, byte[] encyptedData) 
    { 
     if (encyptedData == null) 
      return null; 

     byte[] decryptedData; 
     UTF8Encoding utf8 = new UTF8Encoding(); 
     MD5CryptoServiceProvider hashProvider = new MD5CryptoServiceProvider(); 
     byte[] tdesKey = hashProvider.ComputeHash(utf8.GetBytes(keyString)); 

     TripleDESCryptoServiceProvider tdesAlgorithm = new TripleDESCryptoServiceProvider(); 
     tdesAlgorithm.Key = tdesKey; 
     tdesAlgorithm.Mode = CipherMode.ECB; 
     tdesAlgorithm.Padding = PaddingMode.PKCS7; 
     try 
     { 
      ICryptoTransform decryptor = tdesAlgorithm.CreateDecryptor(); 
      decryptedData = decryptor.TransformFinalBlock(encyptedData, 0, encyptedData.Length); 
     } 
     finally 
     { 
      tdesAlgorithm.Clear(); 
      hashProvider.Clear(); 
     } 

     return decryptedData; 
    } 
+0

这看起来不错。今晚我会尝试,并在成功时给予奖励。我可以问:大概我需要创建一个单独的应用程序来将我的Content文件夹中的文件转换为加密字节,然后将它们保存到bin目录中的磁盘 - 我可以使用生成后事件来运行它们?或者,也许我可以使用#if DEBUG预处理器指令仅在调试模式下运行代码的“保存”(加密)部分? – Haighstrom

+0

另外:如何保护我的“钥匙”?只是在应用程序中有一个静态常量就足够了? – Haighstrom

+0

如何以及何时加密是另一个问题。我会建议一个单独的实用程序应用程序为您做,只要您添加新图像即可运行。将新图像放在应用程序外的源文件夹中,但在源树中,运行实用程序应用程序,它会将加密文件输出到要包含的项目中。这样你就可以在调试模式下测试所有的东西。 –

0

最简单的方法是根本不担心,因为自定义扩展授予几乎没有保护反正。许多程序都会忽略扩展名,并且无论如何编辑文件。

如果你确实需要一些(伪)的保护,常见的选择是加密文件并在运行时对其进行解密。但是,恶意用户仍然可以通过逆向工程来获取文件。

+0

C#提供了一个简单的加密库,如果可以的话,您是否可以共享一个片段?或者你能推荐一个图书馆吗?我只是想要一些简单的东西让平均乔从“看到”内容文件夹中的图像文件并试图编辑它们。 – Haighstrom

相关问题