Home > Enterprise >  Convert php decryption function to C# responds differently result
Convert php decryption function to C# responds differently result

Time:01-16

Sorry in advance if the question is unclear or duplicate! I could not find a specific answer from google.

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":"[email protected]","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":"[email protected]","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 like this

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

it returnes:

?"??????":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? Thanks!

CodePudding user response:

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

  •  Tags:  
  • Related