C和C#文件加密方法及特殊解决方案

C和C#文件加密方法及特殊解决方案,c#,c,cryptography,C#,C,Cryptography,我在Windows7操作系统上有一个小系统,它由两个应用程序(C和C#应用程序)和一个实际上是文本或二进制文件的数据库组成 C应用程序只能从数据库中读取,C#应用程序可以读写。我想保护此数据库文件免受外部影响 我倾向于使用公钥加密方法,例如RSA。你能提供一个更好的方法或更好的解决方案吗。我建议我需要一些C和C语言的开源、商业友好的许可库(比如OpenSSL)。然而,我自己的实现也是一个不错的选择 UPD:我可以更改两个应用程序的代码,并希望加密整个文件。您应该使用一些标准对称加密。微软提供了一

我在Windows7操作系统上有一个小系统,它由两个应用程序(C和C#应用程序)和一个实际上是文本或二进制文件的数据库组成

C应用程序只能从数据库中读取,C#应用程序可以读写。我想保护此数据库文件免受外部影响


我倾向于使用公钥加密方法,例如RSA。你能提供一个更好的方法或更好的解决方案吗。我建议我需要一些C和C语言的开源、商业友好的许可库(比如OpenSSL)。然而,我自己的实现也是一个不错的选择


UPD:我可以更改两个应用程序的代码,并希望加密整个文件。

您应该使用一些标准对称加密。微软提供了一篇关于这个主题的好文章。编写自己的加密方法通常会导致算法不安全和错误

使用密码和Salt的初始化示例

var enc = new RijndaelManaged();
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(pw, Encoding.ASCII.GetBytes(salt));
enc.Key = key.GetBytes(encryption.KeySize / 8);
enc.IV = key.GetBytes(encryption.BlockSize / 8);
enc.Padding = PaddingMode.PKCS7;
在您的情况下,您在创建和存储密码和salt时遇到了问题。salt可以与文件一起存储(例如,前16个字节,或者您可以选择文件名),并且不得进行安全保护。密码由用户输入

如果数据绑定到windows帐户您可能更喜欢使用数据保护API,因为用户不需要执行密码输入。这是一个很好的例子


您可能对

的第一个答案感兴趣。您应该使用一些标准的对称加密。微软提供了一篇关于这个主题的好文章。编写自己的加密方法通常会导致算法不安全和错误

使用密码和Salt的初始化示例

var enc = new RijndaelManaged();
Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(pw, Encoding.ASCII.GetBytes(salt));
enc.Key = key.GetBytes(encryption.KeySize / 8);
enc.IV = key.GetBytes(encryption.BlockSize / 8);
enc.Padding = PaddingMode.PKCS7;
在您的情况下,您在创建和存储密码和salt时遇到了问题。salt可以与文件一起存储(例如,前16个字节,或者您可以选择文件名),并且不得进行安全保护。密码由用户输入

如果数据绑定到windows帐户您可能更喜欢使用数据保护API,因为用户不需要执行密码输入。这是一个很好的例子


您可能对

的第一个答案感兴趣:“但是我自己的实现也可能是一个不错的选择。”:不,不是。您想加密什么?文件中的数据,还是整个文件?如果用户对应用程序和文件都具有完全访问权限,则加密无法帮助您。要真正修复它,将数据放在一个真实的数据库中,并将其放在另一个系统上,然后加固该系统。这与修改二进制文件无关。在一个完整的文件加密方法中,私钥将在C应用程序的二进制文件中可读。您可以使用它来解密整个文件。@vard应用程序始终可以进行反向工程。当用户有权访问程序二进制文件时,程序处于其完全控制之下。即使在理论上,也无法保护程序免受用户的攻击。“但是我自己的实现也可能是一个不错的选择。”:不,不是。你想加密什么?文件中的数据,还是整个文件?如果用户对应用程序和文件都具有完全访问权限,则加密无法帮助您。要真正修复它,将数据放在一个真实的数据库中,并将其放在另一个系统上,然后加固该系统。这与修改二进制文件无关。在一个完整的文件加密方法中,私钥将在C应用程序的二进制文件中可读。您可以使用它来解密整个文件。@vard应用程序始终可以进行反向工程。当用户有权访问程序二进制文件时,程序处于其完全控制之下。即使在理论上,也无法保护程序免受用户的攻击。