Skip to content
Advertisement

Convert php decryption function to C# responds differently result

I created a service that encrypts and stores keys using PHP. The Service returns an encrypted response to the client. The client program will need to decrypt the encrypted data. But the decrypt function I wrote in PHP responds differently in C#.

So my php Function:

<?php
$key = 12;
$string = "rVOlpZOlp6RUa2RhY11UpKeUlZalpFRrpqOnll5TlpKmklRrrVOempWQm5VUa2NdVJKnpZqgpFNsU4FYnaWTnlKKk6Knk6GnVF1UoKSYk5+bq5Olm6CgkKCSn5ZUa1R+e35ziVKEgXeGiHODd1F5g4GGglNeU6GjmZKgmqySppqhn5GWn5KbnVRrVKSnoaKgpKVynpuek6mZo6Gmol+VoJ9TXlOho5mSoJqskqaaoZ+RoZqgoJZUa1SFk6SanJefplF1mqaqVF1UnZuUkZaqoZujl5VUa1RjYmNnXmNiX2NkUWJhbGFia2JhVF1UnZuUl5+llpGUpJaTpZeVVGtUY2JjZF5iYl9iZFNeU56alZagpJeQl6mimqSWllNsU2RhZGZfYmNeZGNUXVSVl6eblJeQnpqfmqZTbGJirl5Tn5alpJOYl1NsU4ugp6NSnZuUl5+lllKcl6pSkpWlm6eTpZeVVK4=";
$result = '';
$string = base64_decode($string);
 for ($i = 0, $k = strlen($string); $i < $k; $i++) {
    $char = substr($string, $i, 1);
    $keyChar = substr($key, ($i % strlen($key)) - 1, 1);
    $char = chr(ord($char) - ord($keyChar));
    $result .= $char;
  }
  echo $result;
?>

It returns:

{"status":201,"success":true,"data":{"lic_id":1,"author":"Author Name","organization_name":"XXXXX XXXXXX GROUP","organization_email":"support@xxxxxx.com","organization_phone":"City/City","lic_expired":"2025-11-22 00:00:00","license_created":"2022-01-12","license_expired":"2025-11-22","device_limit":10},"message":"Your license key activated"}

Now I have converted the above function to C #. The result is strange. My C# code:

static void Main(string[] args)
        {
            string key = "rVOlpZOlp6RUa2RhY11UpKeUlZalpFRrpqOnll5TlpKmklRrrVOempWQm5VUa2NdVJKnpZqgpFNsU4FYnaWTnlKKk6Knk6GnVF1UoKSYk5+bq5Olm6CgkKCSn5ZUa1R+e35ziVKEgXeGiHODd1F5g4GGglNeU6GjmZKgmqySppqhn5GWn5KbnVRrVKSnoaKgpKVynpuek6mZo6Gmol+VoJ9TXlOho5mSoJqskqaaoZ+RoZqgoJZUa1SFk6SanJefplF1mqaqVF1UnZuUkZaqoZujl5VUa1RjYmNnXmNiX2NkUWJhbGFia2JhVF1UnZuUl5+llpGUpJaTpZeVVGtUY2JjZF5iYl9iZFNeU56alZagpJeQl6mimqSWllNsU2RhZGZfYmNeZGNUXVSVl6eblJeQnpqfmqZTbGJirl5Tn5alpJOYl1NsU4ugp6NSnZuUl5+lllKcl6pSkpWlm6eTpZeVVK4=";
            Console.WriteLine(DecryptIt(key));
        }

        static string DecryptIt (string key)
        {
            /// <summary> 
            /// Decrypt key using custom algarithm
            /// </summary>
            ///
            string keyLength = "12";
            string result = "";
            byte[] data = Convert.FromBase64String(key);
            key = Encoding.UTF8.GetString(data);
            for (int i = 0; i < key.Length; i++)
            {
                int res = (i % keyLength.Length) - 1;
                int res2 = res < 0 ? keyLength.Length + res : res;
                //Console.WriteLine(res2.ToString());
                //Console.WriteLine(key.Length);
                char ch = key.Substring(i, 1).ToCharArray()[0];
                char KeyChar = keyLength.Substring(res2, 1).ToCharArray()[0];
                ch = (char)((byte)ch - KeyChar);
                result += ch.ToString();
            }
            return result;
        }
    }

It returns:

E"EIEIEI":201,"IEIEIEI":EIEI,"EIEI":E"EIEIEI":1,"IEIEIE":"E'EIEI IEIEIEI","IEIEIEIEIEIEIEIEI":"MIMAI IEFEIAIE GIEIE","EIEIEIEIEIEIEIEIEI":"IEIEIEI@IEIEIEIEIE.EIE","EIEIEIEIEIEIEIEIEI":"IEIEIEIE CIEI","IEIEIEIEIEI":"2025-11-22 00:00:00","IEIEIEIEIEIEIEI":"2022-01-12","EIEIEIEIEIEIEIE":"2025-11-22","IEIEIEIEIEIE":10I,"EIEIEIE":"EIEI IEIEIEI IEI IEIEIEIEI"I

I can’t understand where I’m making a mistake. The letters are completely different. If I do it like this:

ch = (char)((char)ch - (char)KeyChar);

It returns:

?"??????":201,"???????":????,"????":?"??????":1,"??????":"?'???? ???????","?????????????????":"MIMA? ??F??A?E G????","??????????????????":"???????@??????????.???","??????????????????":"???????? C???","???????????":"2025-11-22 00:00:00","???????????????":"2022-01-12","???????????????":"2025-11-22","????????????":10?,"???????":"???? ??????? ??? ?????????"?

Can anyone help to solve this problem?

Advertisement

Answer

The line:

key = Encoding.UTF8.GetString(data);

is incorrect, you want to deal with bytes directly, not converting it to a utf-8 string.

In fact, the decoded base64 is not even a valid UTF-8 string.

Working Python port:

#!/usr/bin/env python3

import base64

a = "rVOlpZOlp6RUa2RhY11UpKeUlZalpFRrpqOnll5TlpKmklRrrVOempWQm5VUa2NdVJKnpZqgpFNsU4FYnaWTnlKKk6Knk6GnVF1UoKSYk5+bq5Olm6CgkKCSn5ZUa1R+e35ziVKEgXeGiHODd1F5g4GGglNeU6GjmZKgmqySppqhn5GWn5KbnVRrVKSnoaKgpKVynpuek6mZo6Gmol+VoJ9TXlOho5mSoJqskqaaoZ+RoZqgoJZUa1SFk6SanJefplF1mqaqVF1UnZuUkZaqoZujl5VUa1RjYmNnXmNiX2NkUWJhbGFia2JhVF1UnZuUl5+llpGUpJaTpZeVVGtUY2JjZF5iYl9iZFNeU56alZagpJeQl6mimqSWllNsU2RhZGZfYmNeZGNUXVSVl6eblJeQnpqfmqZTbGJirl5Tn5alpJOYl1NsU4ugp6NSnZuUl5+lllKcl6pSkpWlm6eTpZeVVK4="

s = base64.b64decode(a)

key = b'12'
result = ''
for i in range(len(s)):
    char = s[i]
    pos = (i % len(key)) - 1
    if pos < 0:
        pos += len(key)
    keychar = key[(i % len(key)) - 1]
    result += chr((char) - (keychar))

print(result)

UPDATE: C#

using System;
using System.Text;

class Untitled
{
    static void Main(string[] args)
            {
                string key = "rVOlpZOlp6RUa2RhY11UpKeUlZalpFRrpqOnll5TlpKmklRrrVOempWQm5VUa2NdVJKnpZqgpFNsU4FYnaWTnlKKk6Knk6GnVF1UoKSYk5+bq5Olm6CgkKCSn5ZUa1R+e35ziVKEgXeGiHODd1F5g4GGglNeU6GjmZKgmqySppqhn5GWn5KbnVRrVKSnoaKgpKVynpuek6mZo6Gmol+VoJ9TXlOho5mSoJqskqaaoZ+RoZqgoJZUa1SFk6SanJefplF1mqaqVF1UnZuUkZaqoZujl5VUa1RjYmNnXmNiX2NkUWJhbGFia2JhVF1UnZuUl5+llpGUpJaTpZeVVGtUY2JjZF5iYl9iZFNeU56alZagpJeQl6mimqSWllNsU2RhZGZfYmNeZGNUXVSVl6eblJeQnpqfmqZTbGJirl5Tn5alpJOYl1NsU4ugp6NSnZuUl5+lllKcl6pSkpWlm6eTpZeVVK4=";
                Console.WriteLine(DecryptIt(key));
            }
    
            static string DecryptIt (string key)
            {
                /// <summary> 
                /// Decrypt key using custom algarithm
                /// </summary>
                ///
                byte[] data = Convert.FromBase64String(key);
                byte[] keyLength = new byte[] {0x31, 0x32}; //"12"
                byte[] result = new byte[data.Length];
                for (int i = 0; i < data.Length; i++)
                {
                    int res = (i % keyLength.Length) - 1;
                    int res2 = res < 0 ? keyLength.Length + res : res;
                    //Console.WriteLine(res2.ToString());
                    //Console.WriteLine(key.Length);
                    byte ch = data[i];
                    byte KeyChar = keyLength[res2];
                    ch = (byte)(ch - KeyChar);
                    result[i] = ch;
                }
                return Encoding.UTF8.GetString(result);
            }
}

Ideone

User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement