Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# RSA非对称加密异常_C#_Encryption_Rsa_Public Key Encryption_Encryption Asymmetric - Fatal编程技术网

C# 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

我使用以下代码生成RSA加密的公钥和私钥

  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)一起用于加密消息本身。尝试了混合实现,但在某一点上卡住了