簡體   English   中英

轉換 php 解密 function 為 C# 響應不同結果

[英]Convert php decryption function to C# responds differently result

如果問題不清楚或重復,請提前道歉。 我找不到谷歌的具體答案。

我創建了一個使用 PHP 加密和存儲密鑰的服務。 服務向客戶端返回加密響應。 客戶端程序將需要解密加密數據。 但是我在 PHP 中寫的解密 function 在 C# 中的響應不同。 所以我的 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;
?>

它返回:

{"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"}

現在我已經將上面的 function 轉換為 C #。 結果很奇怪。 我的 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;
        }
    }

它返回:

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

我不明白我在哪里犯了錯誤。 字母完全不同。 如果我喜歡這個

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

它返回:

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

任何人都可以幫助解決這個問題嗎? 謝謝!

該行:

key = Encoding.UTF8.GetString(data);

不正確,您想直接處理字節,而不是將其轉換為 utf-8 字符串。

事實上,解碼后的 base64 甚至不是一個有效的 UTF-8 字符串。

工作 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)

更新: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);
            }
}

愛迪生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM