我将Windows应用程序部署到某些客户端计算机上。他们将脱机运行。我需要确保他们无法将应用程序移动到另一台机器上。我能够为每个部署构建我的项目。
所以我的想法是:我编写了一个工具,用于获取计算机cpuID,对其进行加密,将其嵌入到我的应用程序代码中的静态变量中,构建并部署到客户端。然后在应用程序启动时,我将在这次使用应用程序本身获取cpuID并从该静态变量中解密加密的cpuID,检查它们是否匹配并允许或拒绝启动应用程序。所以我只会在应用程序代码中出现解密算法。
我需要确保即使他们对代码进行反向工程,他们也无法创建自己的加密cpuID并更改该静态变量。
我需要一个加密系统,我认为它必须是一个非对称系统,但我不确定,不好的人不应该通过查看解密来理解我加密cpuId的方式算法。
这样的事情是否可能?如果有可能是什么样的算法,我可以自己实现它们吗?或者有任何稳定的实施吗?
编辑:我要问的实际上是一种加密算法,这种算法无法从其decrpytion算法中推断出来。所以问题实际上并不是关于软件保护。我只是想解释一下我将如何使用它。
EDIT2:以下是我要做的事情。
哈希工具:
public string GetDeviceHashEncrypted(out RSParameters publicKey)
{
var deviceHash = getComputerHash(); // combination of few things.
using(var rsa = new RSACryptoServiceProvider())
{
publicKey = rsa.ExportParameters(false);
return new UnicodeEncoding().GetString(rsa.Encrypt(deviceHash, false));
}
}
从哈希工具中获取公钥和加密数据后,我手动将它们写入客户端应用程序代码。并构建并部署到客户端。
客户端:
public static string EncryptedDeviceHash = ...; //encrypted version of device hash
public static RSAParameters PublicKey = ...; // public key generated by hash tool
...
public bool _validateDevice()
{
var deviceHash = getComputerHash(); // combination of few things.
using(var rsa = new RSACryptoServiceProvider())
{
rsa.ImportParameters(PublicKey);
return rsa.Decrypt(EncryptedDeviceHash, false) == deviceHash;
}
}
但由于公钥不是用于解密,因为我无法复制相同的加密字符串,所以我无法对此逻辑做任何事情。