简体   繁体   English

转换 php 解密 function 为 C# 响应不同结果

[英]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.我创建了一个使用 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#.但是我在 PHP 中写的解密 function 在 C# 中的响应不同。 So my php Function:所以我的 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 #.现在我已经将上面的 function 转换为 C #。 The result is strange.结果很奇怪。 My C# code:我的 C# 代码:

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.不正确,您想直接处理字节,而不是将其转换为 utf-8 字符串。

In fact, the decoded base64 is not even a valid UTF-8 string.事实上,解码后的 base64 甚至不是一个有效的 UTF-8 字符串。

Working Python port:工作 Python 端口:

#!/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#更新: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爱迪生

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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