Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 一种使文件只能由特定程序解密的方法?_C#_.net_Encryption_Cryptography - Fatal编程技术网

C# 一种使文件只能由特定程序解密的方法?

C# 一种使文件只能由特定程序解密的方法?,c#,.net,encryption,cryptography,C#,.net,Encryption,Cryptography,我的情况如下: 我必须部署一系列.NET桌面应用程序,包括一个包含加密数据的文件和一个可执行文件,该文件将访问该数据并在运行时解密其中的某些部分 我需要实现的是,每个数据容器只能由它所提供的特定.exe进行解密 第一个想法是使用.exe文件的散列值作为对称密钥对数据进行加密,在解密过程中,在运行时计算.exe文件的散列值,并使用该散列值对数据容器的各个部分进行解密 但是,这种方法的问题在于,用户可以使用ILSpy或任何其他反编译器轻松地查看.NET程序集,并发现整个加密算法,从而使用户能够解密我

我的情况如下:

我必须部署一系列.NET桌面应用程序,包括一个包含加密数据的文件和一个可执行文件,该文件将访问该数据并在运行时解密其中的某些部分

我需要实现的是,每个数据容器只能由它所提供的特定.exe进行解密

第一个想法是使用.exe文件的散列值作为对称密钥对数据进行加密,在解密过程中,在运行时计算.exe文件的散列值,并使用该散列值对数据容器的各个部分进行解密

但是,这种方法的问题在于,用户可以使用ILSpy或任何其他反编译器轻松地查看.NET程序集,并发现整个加密算法,从而使用户能够解密我的一系列应用程序中的所有数据容器

我想到的另一个解决方案是制作一个小C原生库(不太容易分解),它将用.exe程序集信息执行一些操作,并生成基于它的解密密钥(让我们考虑用户足够懒惰,这样他就不会试图从内存中拦截密钥)。 但理想情况下,我不想求助于C语言以外的任何语言,因为使用Mono将应用程序移植到其他平台将需要额外的工作(p/Invokes等)

所以我的问题是:有没有一种方法可以加密数据,这样只有特定的应用程序才能解密它

当然,我明白,在本地应用程序中,不可能保证数据绝对安全,但我需要让“黑客”至少不值得这么做。是否有任何合理的解决方案,否则我将不得不坚持我上述的一个想法


提前谢谢你

简单的答案是否定的

要加密和解密数据,您需要一个算法,还需要一个秘密或密钥。如果一台计算机可以执行该算法,其他人就可以知道它是什么。忽略反编译和反汇编,用户只需查看CPU执行的指令,就可以将算法拼凑起来

这留下了秘密。不幸的是,如果计算机或程序可以访问或派生机密,那么出于上述相同的原因,在该计算机上具有root或管理员权限的人也可以访问或派生机密

然而,也许你只是用错误的方式思考问题。如果您希望程序访问其他人所不能访问的数据,请考虑将数据从用户必须认证的服务器中访问。使用SSL以便在传输过程中保护数据,并使用只有本地用户和本地管理员才能访问的密钥在本地加密数据。它并不完美,但在一般情况下,它是最好的

如果你需要更多的保护,你可能想考虑硬件软件,但这很昂贵和复杂。很快,请阅读和跟踪和“我能问什么样的问题”和“如何问”的同伴页。我们通常不在这里进行设计讨论也就是说,请非常清楚您所说的“特定应用程序”是什么意思——这是否意味着只有此代码的原始副本才能完成此工作?只有在原始主机上运行的副本?从互联网上任何地方运行的代码副本?在这种情况下也适用。