4

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


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

4

1 回答 1

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();
}

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

于 2012-08-15T21:28:56.210 回答