我一直在寻找,但我似乎找不到使用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());
我目前还没有尝试使用私钥,因为我不知道从哪里开始。
答案 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();
}
我没有对此进行过测试,所以可能会有一个错误,但是你明白了。