C# RSA非对称加密异常
我使用以下代码生成RSA加密的公钥和私钥C# RSA非对称加密异常,c#,encryption,rsa,public-key-encryption,encryption-asymmetric,C#,Encryption,Rsa,Public Key Encryption,Encryption Asymmetric,我使用以下代码生成RSA加密的公钥和私钥 public static string RSA_Decrypt(string encryptedText, string privateKey) { CspParameters cspParams = new CspParameters { ProviderType = 1 }; RSACryptoServiceProvider rsaProvider = new RSACryptoS
public static string RSA_Decrypt(string encryptedText, string privateKey)
{
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey));
var buffer = Convert.FromBase64String(encryptedText);
byte[] plainBytes = rsaProvider.Decrypt(buffer, false);
string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length);
return plainText;
}
public static string RSA_Encrypt(string data, string publicKey)
{
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey));
byte[] plainBytes = Encoding.UTF8.GetBytes(data);
byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false);
return Convert.ToBase64String(encryptedBytes);
}
public static Tuple<string, string> CreateKeyPair()
{
CspParameters cspParams = new CspParameters { ProviderType = 1 /* PROV_RSA_FULL */ };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(2048, cspParams);
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
return new Tuple<string, string>(privateKey, publicKey);
}
publicstaticstringrsa\u解密(stringencryptedtext,stringprivatekey)
{
CspParameters cspParams=新CspParameters{ProviderType=1};
RSACryptServiceProvider rsaProvider=新的RSACryptServiceProvider(CSParams);
rsaProvider.importSCPBlob(Convert.FromBase64String(privateKey));
var buffer=Convert.FromBase64String(encryptedText);
byte[]plainBytes=rsaProvider.Decrypt(缓冲区,false);
string plainText=Encoding.UTF8.GetString(plainBytes,0,plainBytes.Length);
返回纯文本;
}
公共静态字符串RSA_加密(字符串数据、字符串公钥)
{
CspParameters cspParams=新CspParameters{ProviderType=1};
RSACryptServiceProvider rsaProvider=新的RSACryptServiceProvider(CSParams);
rsaProvider.importSCPBlob(Convert.FromBase64String(publicKey));
byte[]plainBytes=Encoding.UTF8.GetBytes(数据);
byte[]encryptedBytes=rsaProvider.Encrypt(纯字节,false);
返回Convert.tobase64字符串(encryptedBytes);
}
公共静态元组CreateKeyPair()
{
CspParameters cspParams=新CspParameters{ProviderType=1/*PROV_RSA_FULL*/};
RSACryptoServiceProvider rsaProvider=新的RSACryptoServiceProvider(2048,CSParams);
string publicKey=Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey=Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
返回新元组(privateKey、publicKey);
}
decrypt函数返回此异常
“密钥不存在”
请建议我解决这个问题 此代码(使用您提供的方法)运行良好:
static void Main()
{
var keyPair = CreateKeyPair();
var encryptedText = Encrypt(keyPair.Item2, "test data");
var decryptedText = Decrypt(keyPair.Item1, encryptedText);
Console.WriteLine("Encrypted text: {0}", encryptedText);
Console.WriteLine("Decrypted text: {0}", decryptedText);
}
public static string RSA_Decrypt(string encryptedText, string privateKey)
{
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(privateKey));
var buffer = Convert.FromBase64String(encryptedText);
byte[] plainBytes = rsaProvider.Decrypt(buffer, false);
string plainText = Encoding.UTF8.GetString(plainBytes, 0, plainBytes.Length);
return plainText;
}
public static string RSA_Encrypt(string data, string publicKey)
{
CspParameters cspParams = new CspParameters { ProviderType = 1 };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams);
rsaProvider.ImportCspBlob(Convert.FromBase64String(publicKey));
byte[] plainBytes = Encoding.UTF8.GetBytes(data);
byte[] encryptedBytes = rsaProvider.Encrypt(plainBytes, false);
return Convert.ToBase64String(encryptedBytes);
}
public static Tuple<string, string> CreateKeyPair()
{
CspParameters cspParams = new CspParameters { ProviderType = 1 /* PROV_RSA_FULL */ };
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(2048, cspParams);
string publicKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey = Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
return new Tuple<string, string>(privateKey, publicKey);
}
static void Main()
{
var keyPair=CreateKeyPair();
var encryptedText=加密(keyPair.Item2,“测试数据”);
var decryptedText=解密(keyPair.Item1,encryptedText);
WriteLine(“加密文本:{0}”,encryptedText);
WriteLine(“解密文本:{0}”,decryptedText);
}
公共静态字符串RSA_解密(字符串加密文本,字符串私钥)
{
CspParameters cspParams=新CspParameters{ProviderType=1};
RSACryptServiceProvider rsaProvider=新的RSACryptServiceProvider(CSParams);
rsaProvider.importSCPBlob(Convert.FromBase64String(privateKey));
var buffer=Convert.FromBase64String(encryptedText);
byte[]plainBytes=rsaProvider.Decrypt(缓冲区,false);
string plainText=Encoding.UTF8.GetString(plainBytes,0,plainBytes.Length);
返回纯文本;
}
公共静态字符串RSA_加密(字符串数据、字符串公钥)
{
CspParameters cspParams=新CspParameters{ProviderType=1};
RSACryptServiceProvider rsaProvider=新的RSACryptServiceProvider(CSParams);
rsaProvider.importSCPBlob(Convert.FromBase64String(publicKey));
byte[]plainBytes=Encoding.UTF8.GetBytes(数据);
byte[]encryptedBytes=rsaProvider.Encrypt(纯字节,false);
返回Convert.tobase64字符串(encryptedBytes);
}
公共静态元组CreateKeyPair()
{
CspParameters cspParams=新CspParameters{ProviderType=1/*PROV_RSA_FULL*/};
RSACryptoServiceProvider rsaProvider=新的RSACryptoServiceProvider(2048,CSParams);
string publicKey=Convert.ToBase64String(rsaProvider.ExportCspBlob(false));
string privateKey=Convert.ToBase64String(rsaProvider.ExportCspBlob(true));
返回新元组(privateKey、publicKey);
}
当传递正确的密钥时,您的加密/解密方法工作正常,请仔细检查以确保您没有将公钥传递给解密方法。这对我来说似乎很好(尽管384位对于RSA来说是一个非常小的密钥大小)。我发布了下面的所有函数,您可以检查它。感谢您的支持1024位以下的任何东西都是不安全的,即使1024位也相当脆弱。人们通常推荐2048位。谢谢你的推荐,我已经应用了2048位密钥。谢谢,我明白了,我用私钥加密,而公开密钥解密只适用于小数据。我有大约2000个字符长的字符串。变长exception@KamranShahid-RSA可以加密的数据长度受密钥大小和使用的填充限制。对于PKCS#1填充,最大消息长度为密钥大小(以字节为单位)-11(例如,2048位密钥=256字节,因此最大消息长度为256-11=245字节)。对于OAEP填充,限制更为复杂,因为它还取决于所使用的哈希函数的大小。对于大数据,您可以使用混合加密方案,其中RSA仅用于加密随机生成的密钥,该密钥与对称算法(如AES)一起用于加密消息本身。尝试了混合实现,但在某一点上卡住了