Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# to PHP base64 encode/decode

Tags:

c#

.net

php

base64

So I have this c# application that needs to ping my web server thats running linux/php stack.
I am having problems with the c# way of base 64 encoding bytes.

my c# code is like:

byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string");
String enc = Convert.ToBase64String(encbuff);

and php side:

$data = $_REQUEST['in'];
$raw = base64_decode($data);

with larger strings 100+ chars it fails. I think this is due to c# adding '+'s in the encoding but not sure. any clues

like image 534
w-ll Avatar asked Nov 02 '08 22:11

w-ll


4 Answers

You should probably URL Encode your Base64 string on the C# side before you send it.

And URL Decode it on the php side prior to base64 decoding it.

C# side

byte[] encbuff = System.Text.Encoding.UTF8.GetBytes("the string");
string enc = Convert.ToBase64String(encbuff);
string urlenc = Server.UrlEncode(enc);

and php side:

$data = $_REQUEST['in'];
$decdata = urldecode($data);
$raw = base64_decode($decdata);
like image 117
Eoin Campbell Avatar answered Nov 08 '22 08:11

Eoin Campbell


Note that + is a valid character in base64 encoding, but when used in URLs it is often translated back to a space. This space may be confusing your PHP base64_decode function.

You have two approaches to solving this problem:

  • Use %-encoding to encode the + character before it leaves your C# application.
  • In your PHP application, translate space characters back to + before passing to base64_decode.

The first option is probably your better choice.

like image 26
Greg Hewgill Avatar answered Nov 08 '22 10:11

Greg Hewgill


This seems to work , replacing + with %2B...

private string HTTPPost(string URL, Dictionary<string, string> FormData)
{

    UTF8Encoding UTF8encoding = new UTF8Encoding();
    string postData = "";

    foreach (KeyValuePair<String, String> entry in FormData)
    {
            postData += entry.Key + "=" + entry.Value + "&";
    }

    postData = postData.Remove(postData.Length - 1);

    //urlencode replace (+) with (%2B) so it will not be changed to space ( )
    postData = postData.Replace("+", "%2B");

    byte[] data = UTF8encoding.GetBytes(postData); 

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL);

    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.ContentLength = data.Length;

    Stream strm = request.GetRequestStream();
    // Send the data.
    strm.Write(data, 0, data.Length);
    strm.Close();

    WebResponse rsp = null;
    // Send the data to the webserver
    rsp = request.GetResponse();

    StreamReader rspStream = new StreamReader(rsp.GetResponseStream());
    string response = rspStream.ReadToEnd();

    return response;

}
like image 3
cliff Avatar answered Nov 08 '22 08:11

cliff


Convert.ToBase64String doesn't seem to add anything extra as far as I can see. For instance:

byte[] bytes = new byte[1000];
Console.WriteLine(Convert.ToBase64String(bytes));

The above code prints out a load of AAAAs with == at the end, which is correct.

My guess is that $data on the PHP side doesn't contain what enc did on the C# side - check them against each other.

like image 1
Jon Skeet Avatar answered Nov 08 '22 08:11

Jon Skeet