C#RSA使用私钥解密

时间:2012-08-15 18:20:23

标签: c# rsa private encryption

我一直在寻找,但我似乎找不到使用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());


我目前还没有尝试使用私钥,因为我不知道从哪里开始。

1 个答案:

答案 0 :(得分: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();
}

我没有对此进行过测试,所以可能会有一个错误,但是你明白了。