简体   繁体   中英

Convert php decryption function to C# responds differently result

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM