如何将资源文件更改为自定义格式

本文关键字:自定义 格式 源文件 资源 | 更新日期: 2023-09-27 17:55:56

我曾经在Microsoft的XNA中制作游戏。XNA内置了一个ContentPipeline项目,可以自动将所有图像文件构建到。XNB 文件。这样做的好处是用户不能简单地修改图像文件(例如在 Paint 中)。

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

我的问题是我怎样才能创建类似的东西?是否有我可以使用的现成库,或者我可以编写的代码来创建它?

压缩对我来说并不是特别重要 - 只需将扩展更改为自定义内容即可。

如何将资源文件更改为自定义格式

这扩展了 Kyle 的回答和你向他提出的关于加密例程的问题。

如果你想要一个简单的加密/解密模式,你可以使用这个。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;
    }

最简单的选择是根本不用担心,因为自定义扩展无论如何都不会提供任何保护。许多程序会忽略扩展名,并让您无论如何编辑文件。

如果确实需要一些(伪)保护,常见的选项是加密文件并在运行时解密它们。但是,恶意用户仍可以通过对代码进行反向工程来访问文件。