title: C# RSA Encrypt -> PHP RSA Decrypt
body: <p>I am trying to crypt AES Key and IV with RSA in C# and decrypt them with PHP using phpseclib. I tried to fix this problem for about 4 hours but I always get 'Decryption error on line 2495'. Seems to be something wrong with PKCS.</p>
  
  <p>Temporary Private Key</p>
  
  <pre><code>&lt;?php define("RSA_Private", "-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP9wTdAh+f0Ndi55R4qBcrAIUv 1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET/DiwwTP/+YPEJYenU2Zbfirb 2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8auNNzp22QVIH19tDlwIDAQAB AoGAV62wD84pZW8YjYHiK9v3GHYCtqOKuY41z2tOwXGU61u/dNxCO9U4Xyrs1d57 zokPXFImO7y/tupmLVQuy4N8rgO0BqB2t3YETpOlwmOF4CYl0Lkoa5mlQ1XvBXoU qbNU33UlJUNheLT0UM7lhwwnBTqNlfC1/bNXL8TYCsyt+KECQQDstdKRaip8YH20 DgB2301/91pCTAkw/vXEPi8GBVq4EN/hWSwpz+hDrJrbmSBnTkQ2IlWvYy3nghGB g/QwTaZ/AkEAzriR/Snqfif2fpSovp0ln8/A0AR0utq1FfvYWMkT9woqPR5iJjS7 ZcVX1U9ayC4fPypMz/BXafy9MGstllhG6QJAakZ387GmwZDQ3zYqHzTCpuF3NKzO s6DE1wbUNe/RezKYUaSnn14o+blVDaMCWV9aYLOppMTypy5Ojcegqs8yIQJADXjL 0tLbfFNAZilsAdgd7pdMeoH/1XmRWZhrFgYsrenUrN0BCnpfSBefTMB6KxeOY8Bu 9xIzsC2PasthUi34mQJAV5IvcjaOiMSed28LegOHTBXP5Qpu96GQGneD3x92AtM+ aRhEjMeoadetA0JQcPRJgVXTov5wir5xeCEUjpplGg== -----END RSA PRIVATE KEY-----");?&gt;
  </code></pre>
  
  <p>Temporary Public Key</p>
  
  <pre><code>&lt;?php define("RSA_Public", "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP 9wTdAh+f0Ndi55R4qBcrAIUv1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET /DiwwTP/+YPEJYenU2Zbfirb2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8 auNNzp22QVIH19tDlwIDAQAB -----END PUBLIC KEY-----");?&gt;
  </code></pre>
  
  <p>Ciphertext after RSA encryption in C#(decrypted = "testkey" cause I removed the aes encryption for testing)</p>
  
  <pre><code>Cd/RsiVqKnEP2T9oTgnvRuHVKY09VfynLHIlinIGtW4PFrB2kKffIrIqRQKhob6bPIR4efjxhCn43AQ2gE5P/AMG/EDWk9HMJF8XuhdtsWfPmnqxVV4crpA2FZwh4BWdXq4N70ieWbuk+pRJ1dHGhLgFfphp4sVVopn3bPKw2VKI0O+MT4nUCHFac25owoFnMULzuxj60I9Qa/TIlCKwMNcv2r7ili/LvplPZIEnH2p/bR62TAUvty0yo9NTHZm+wlqyIUmA1/GrM0VHjmcnRjFQHp1zQreRspvRsbk=
  </code></pre>
  
  <p>PHP (no change if strrev or not):</p>
  
  <pre><code>public function RSADecryption($key, $iv) {
      $PrivateKeyFile = RSA_Private;
      $rsa = new Crypt_RSA();
      $rsa-&gt;setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
      $rsa-&gt;loadKey($PrivateKeyFile);
      // decrypt key and iv for aes decryption
      $aes_key = base64_encode($rsa-&gt;decrypt(strrev((base64_decode($key)))));
      $aes_iv = base64_encode($rsa-&gt;decrypt(base64_decode($iv)));
      echo $aes_key;
      echo "&lt;br /&gt;";
      echo $aes_iv;
  }
  </code></pre>
  
  <p>C# Encryption:</p>
  
  <pre><code>public static string RSAEncryption(string aes_key, string aes_iv, string publickey)
      {
          if (publickey.Contains("-----"))
          {
              // Get public key without -----....
              publickey = publickey.Split(new string[] { "-----" }, StringSplitOptions.RemoveEmptyEntries)[1];
          }
  
          // Remove "new line" characters
          publickey.Replace("\n", "");
          byte[] KeyToEncrypt = Encoding.Default.GetBytes(aes_key);
          byte[] IVToEncrypt = Encoding.Default.GetBytes(aes_iv);
          byte[] PublicKey = Encoding.Default.GetBytes(publickey);
  
          //Values to store encrypted symmetric keys.
          byte[] EncryptedKey;
          byte[] EncryptedIV;
  
          //Create a new instance of RSACryptoServiceProvider.
          RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
  
          //Get an instance of RSAParameters from ExportParameters function.
          RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
  
          //Set RSAKeyInfo to the public key values.
          RSAKeyInfo.Modulus = PublicKey;
          //Import key parameters into RSA.
          RSA.ImportParameters(RSAKeyInfo);
  
          //Encrypt the symmetric key and IV.
          EncryptedKey = RSA.Encrypt(KeyToEncrypt, false);
          EncryptedIV = RSA.Encrypt(IVToEncrypt, false);
          System.IO.File.WriteAllText(@"C:\WriteTextCryptKey.txt", Convert.ToBase64String(EncryptedKey));
          System.IO.File.WriteAllText(@"C:\WriteTextCryptIV.txt", Convert.ToBase64String(EncryptedIV));
          return Convert.ToBase64String(EncryptedKey);
      }
  </code></pre>
  
  <p>Function get called in phpseclib:</p>
  
  <pre><code>function _rsaes_pkcs1_v1_5_decrypt($c)
  {
      // Length checking
  
      if (strlen($c) != $this-&gt;k) { // or if k &lt; 11
          user_error('Decryption error');
          return false;
      }
  
      // RSA decryption
  
      $c = $this-&gt;_os2ip($c);
      $m = $this-&gt;_rsadp($c);
  
      if ($m === false) {
          user_error('Decryption error');
          return false;
      }
      $em = $this-&gt;_i2osp($m, $this-&gt;k);
  
      // EME-PKCS1-v1_5 decoding
  
      if (ord($em[0]) != 0 || ord($em[1]) &gt; 2) {
          user_error('Decryption error');
          return false;
      }
  
      $ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
      $m = substr($em, strlen($ps) + 3);
  
      if (strlen($ps) &lt; 8) {
          user_error('Decryption error');
          return false;
      }
  
      // Output M
  
      return $m;
  }
  </code></pre>
  
  <p><code>if (ord($em[0]) != 0 || ord($em[1]) &gt; 2)</code> is line 2495</p>