【问题标题】:C# RSA Decrypt Using Private KeyC# RSA 使用私钥解密
【发布时间】:2012-08-15 18:20:22
【问题描述】:

我一直在搜索,但似乎找不到使用 RSA 进行解密的简单方法。

我已经生成了一个公钥和私钥,它们存储在两个单独的文件中,并且是 XML 格式。我可以使用 FromXmlString 将公钥与 RSACryptoServiceProvider 对象相关联,然后加密字符串。尝试解密加密字符串时,我感到困惑。我不确定如何将私钥数据与 RSACryptoServiceProvider 相关联,以便我可以使用 Decrypt 函数。

任何帮助将不胜感激。

编辑:

公钥和私钥的格式是RSACryptoServiceProvider对象生成的XML,我只是放到了一个文件中:

<RSAKeyValue><Modulus>vS7Y5up+6kHMx7hQjKA6sKlIVASaw  ... etc ...

我使用以下代码加载公钥:

StreamReader sr = new StreamReader(HttpContext.Current.Server.MapPath("public.key"));
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(sr.ReadToEnd().ToString());


我目前还没有尝试使用私钥进行任何操作,因为我不确定从哪里开始。

【问题讨论】:

  • 键是什么格式的?你用公钥做了什么?你用私钥试过什么?
  • 出于格式原因,我编辑了上面的帖子并回答了您的问题。

标签: c# rsa private encryption


【解决方案1】:

我不知道您的情况,但我建议您将关键信息存储在 KeyContainer 中。如果您这样做,您可以按名称访问 keyContainer 并可以执行类似的操作。

// retrieves the maximum number of characters that can be decrypted at once
private int getMaxBlockSize(int keySize){
    int max = ((int)(keysize/8/3) )* 4
    if (keySize / 8 mod 3 != 0){
        max += 4
    }
    return max;
}

public string decrypt(string msg, string containerName){
    CspParameters params = new CspParameters();
    params.KeyContainerName = containerName;
    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(params);
    StringBuilder decryptedMsg = new StringBuilder();
    int maxDecryptSize = getMaxBlockSize(rsa.KeySize);
    int iterationCount = Math.Floor(msg.length / maxDecryptSize)
    for(int i=0; i<iterationCount; i++){
        int start = i * maxDecryptSize;
        int blkSize = Math.min(start + maxDecryptSize, msg.Length);
        Byte[] msgBytes = System.Convert.FromBase64String(msg.Substring(start, blkSize));

        decryptedMsg.Append(System.Text.Encoding.Unicode.GetString(RSAProvider.Decrypt(msgBytes, false));
    }
    return decryptedMsg.ToString();
}

我还没有对此进行测试,所以这里可能存在错误,但你明白了。

【讨论】:

  • 我最初如何将私钥存储在容器中?现在它只是在一个文本文件中。