title: "Bad Data" when decrypting using RSACryptoProvider from string encrypted in PHP
body: <p>I am trying to decrypt a string in C# that was encrypted in PHP using RSA, and for the life of me, I can't get it right. I have condensed the problem to two sample test apps in .NET and PHP: </p>
  
  <p>In C#:</p>
  
  <pre><code>class Program
    {
      static void Main(string[] args)
      {
  
        RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
        string fileName = @"C:\privateKey";
        if (File.Exists(fileName))
        {
          provider.FromXmlString(File.ReadAllText(fileName));  
        }
        else
        {
        File.WriteAllText(fileName, provider.ToXmlString(true));
        }
        if(args.Length &gt; 0)
        {
         string decrypted = Encoding.UTF8.GetString(provider.Decrypt(Convert.FromBase64String(args[0]), false));
          Console.WriteLine("decrypted: {0}", decrypted);
        }
        else
        {
          Console.WriteLine(provider.ToXmlString(false));
        }
        Console.ReadLine();
      }
    }
  </code></pre>
  
  <p>The first time I run this, it outputs(nicely formatted):</p>
  
  <pre><code>&lt;RSAKeyValue&gt;
    &lt;Modulus&gt;
      2P8G+ospDboN87+FIWSzFA9E1QVXCDy4bO9YZPe1MTcxO7VhlBYmLy1J7b
      rSheaTa8RamrdeXe2Ev0y5O7zyxo/Bxw4W2UfnVAAFK+bgb8f0FicnSosAlGC95m5Goid9wWPf/QtqDa
      NxSMBBjULA1WKzA7+3HQncAenODYypOiE=
    &lt;/Modulus&gt;
    &lt;Exponent&gt;AQAB&lt;/Exponent&gt;
  &lt;/RSAKeyValue&gt;
  </code></pre>
  
  <p>I have verified that the key gets saved and loaded correctly between runs.</p>
  
  <p>Then I do this in PHP using the <a href="http://pear.php.net/package/Crypt_RSA/docs/latest/li_Crypt_RSA.html" rel="nofollow">Crypt_RSA Package</a>:</p>
  
  <pre><code>include('Crypt/RSA.php');
  $keyXML = &lt;&lt;&lt;EOS
  &lt;RSAKeyValue&gt;
    &lt;Modulus&gt;2P8G+ospDboN87+FIWSzFA9E1QVXCDy4bO9YZPe1MTcxO7VhlBYmLy1J7brSheaTa8RamrdeXe2Ev0y5O7zyxo/Bxw4W2UfnVAAFK+bgb8f0FicnSosAlGC95m5Goid9wWPf/QtqDaNxSMBBjULA1WKzA7+3HQncAenODYypOiE=&lt;/Modulus&gt;
    &lt;Exponent&gt;AQAB&lt;/Exponent&gt;
  &lt;/RSAKeyValue&gt;
  EOS;
  $doc = DOMDocument::loadXML($keyXML);
  $modulus = $doc-&gt;getElementsByTagName("Modulus")-&gt;item(0)-&gt;nodeValue;
  $exponent = $doc-&gt;getElementsByTagName("Exponent")-&gt;item(0)-&gt;nodeValue;
  $key = Crypt_RSA_Key::factory(base64_decode($modulus), base64_decode($exponent), 'public'); 
  
  $crypt = new Crypt_RSA();
  
  echo $crypt-&gt;encrypt("hello", $key)
  </code></pre>
  
  <p>This outputs my decrypted string:</p>
  
  <pre><code>CBGFdK+NXq39ZigXkW6JChHHCCUTzHzjsEPqdoaNJtZgTCRQfIIR6IU4m5LOHGidLaLWN7cIM9ImNdSsAsMH9awkZ7uW0KXdqQjhVGeXzmC6EuSHqrSzYiIZp+1F5Rxhg/JFD/Or3eQ+UIHm/4YtNTyys6S3maClitk5KV68lhs=
  </code></pre>
  
  <p>Finally, when I run my C# app again with this as input, I get the following exception when I call the Decrypt method:</p>
  
  <pre><code>System.Security.Cryptography.CryptographicException was unhandled
    Message=Bad Data.
    Source=mscorlib
    StackTrace:
         at System.Security.Cryptography.CryptographicException.ThrowCryptographicException(Int32 hr)
         at System.Security.Cryptography.RSACryptoServiceProvider.DecryptKey(SafeKeyHandle pKeyContext, Byte[] pbEncryptedKey, Int32 cbEncryptedKey, Boolean fOAEP, ObjectHandleOnStack ohRetDecryptedKey)
         at System.Security.Cryptography.RSACryptoServiceProvider.Decrypt(Byte[] rgb, Boolean fOAEP)
         at ConsoleApplication1.Program.Main(String[] args) in C:\development\FundCentric\src\Utilities\ConsoleApplication1\ConsoleApplication1\Program.cs:line 27
         at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
         at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
         at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
         at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
         at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
         at System.Threading.ThreadHelper.ThreadStart()
    InnerException:
  </code></pre>
  
  <p>Frankly, I'm at a point where I don't know what else I can try anymore. Any suggestions at what could be possibly going wrong or what else I could try would be very welcome.</p>