C#RSA加密私密解密公众?

时间:2011-01-31 21:10:16

标签: c# asp.net asp.net-mvc encryption rsa

以下是我要解决的问题。假设我发布了一些基于ASP.NET MVC构建的Web软件,我只希望最终用户能够将X用户添加到系统中。该软件将托管在他们的服务器上。

我想要包含一个加密文件,当用户尝试添加新用户时,它会熄灭并从文件中读取加密字符串。当网站对其进行解码时,明文将是允许用户的数量。

我最终加密的最佳/最简单的方法是在我的终端生成这个字符串,然后将其解码回我的应用程序中的清除文本?显然,我想确保最终用户无法启动自己的加密字符串,只需替换我的。我不想担心必须尝试混淆我的源代码,以便他们无法看到我如何解码字符串。

是否可以使用私有rsa密钥进行加密,然后使用公共密钥对其进行解密?我在下面的代码中没有运气:

        var rsa = new RSACryptoServiceProvider();

        var pubicKey = rsa.ToXmlString(false);
        var privateKey = rsa.ToXmlString(true);

        var test = "this string needs to be encrypted then decrypted";

        var rsa2 = new RSACryptoServiceProvider();
        rsa2.FromXmlString(privateKey);

        var encryptedBytes = rsa2.Encrypt(Encoding.UTF8.GetBytes(test), false);
        var encryptedString = Convert.ToBase64String(encryptedBytes);

        var rsa3 = new RSACryptoServiceProvider();
        rsa3.FromXmlString(pubicKey);

        encryptedBytes = Convert.FromBase64String(encryptedString);

        var decryptedString = Encoding.UTF8.GetString(rsa3.Decrypt(encryptedBytes,                        false));      

5 个答案:

答案 0 :(得分:3)

您可以使用签名策略,其中私钥用于生成签名,以验证您的邮件是否真实。

// Create message and signature on your end
string message = "Here is the license message";

var converter = new ASCIIEncoding();
byte[] plainText = converter.GetBytes(secret);

var rsaWrite = new RSACryptoServiceProvider();
var privateParams = rsaWrite.ExportParameters(true);

// Generate the public key / these can be sent to the user.
var publicParams = rsaWrite.ExportParameters(false);

byte[] signature =
    rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider());

// Verify from the user's side. Note that only the public parameters
// are needed.
var rsaRead = new RSACryptoServiceProvider();
rsaRead.ImportParameters(publicParams);
if (rsaRead.VerifyData(plainText,
                       new SHA1CryptoServiceProvider(),
                       signature))
{
    Console.WriteLine("Verified!");
}
else
{
    Console.WriteLine("NOT verified!");
}

此示例主要是从Microsoft的网站上复制的:

这是解释概念的网页:

答案 1 :(得分:2)

我认为你要找的是数字签名。内容是否加密并不重要,因为用户具有(公共)密钥来解密它。重要的是内容的来源是否是你。 由于你有一个配置文件,我认为它是XML,因此你正在寻找XMLDSIG

您可以使用.Net中的SignedXml类轻松实现此目的。然后,您需要做的就是在加载配置文件时验证签名。此方法允许您轻松使用您可能拥有的任何X509证书。您甚至可以将公钥嵌入到签名文件中,因此用户无需安装证书(公钥)。

答案 2 :(得分:0)

你的想法是正确的,但我想知道不可预见的后果。

您声明他们将在其服务器上运行软件,因此这意味着他们正在为自己托管服务。但是你也提到这个服务必须连接到互联网,通过验证服务器来添加用户。当互联网出现故障或他们想拥有一个安全的系统和防火墙阻止互联网访问服务器时会发生什么?他们会完全丧失运作能力吗?

只是问你一个问题:p

答案 3 :(得分:0)

您不使用公钥来“解密”该文件。您只能使用私钥解密文件。

在您的情况下,您可以存储用户数以及使用私钥创建的数据的签名。

在客户端服务器上,使用公钥验证签名是否与文件中的数据匹配(用户数)

但是,高级用户可能会将您的公钥换成自己的公钥并自行签名。

答案 4 :(得分:0)

正如您在问题中的评论所述,您的方法是使用客户端的密钥和自己的密钥。这不起作用,因为RSA中使用的素数仅用于相应的私钥/公钥。

您需要做什么才能使用您的两把钥匙,而不是客户端或客户端的两把钥匙,而不是您的两把钥匙。例如,

  1. 您可以使用两个密钥签署,方法是使用您的私钥进行加密,并允许客户端使用您的公钥进行解密。
  2. 您可以使用客户端的公钥对其进行加密,并使用他们(客户端)的私钥对其进行解密。
  3. 希望这有帮助!