Расшифровать токен доступа с помощью PHP для шифрования C #

Символьный класс в регулярных выражениях, обозначаемый синтаксисом [...], определяет правила, соответствующие одному символу на входе. Таким образом, все, что вы пишете между скобками, указывает, как сопоставить один символ .

Таким образом, ваш шаблон [01-12] разбит следующим образом:

  • 0 - соответствует одиночной цифре 0
  • или, 1-1, соответствует одной цифре в диапазоне от 1 до 1
  • или, 2, соответствует одной цифре 2

Итак, в основном все, что вам нужно, это 0, 1 или 2.

Чтобы выполнить нужный вам совпадение, сопоставляя две цифры, начиная с 01- 12 как числа, вам нужно подумать о том, как они будут выглядеть как текст.

У вас есть:

  • 01-09 (т.е. первая цифра равна 0, вторая цифра равна 1-9)
  • 10-12 (т.е. первая цифра равна 1, вторая цифра равна 0-2)

Затем вам нужно будет написать регулярное выражение для это может выглядеть так:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |
<-+--> <-+-->
0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

Обратите внимание, что попытка комбинировать их для получения более короткого выражения не удастся, предоставив ложные положительные совпадения для недопустимого ввода.

Например, шаблон [0-1][0-9] будет в основном соответствовать номерам 00-19, что немного больше, чем вы хотите.

Я попытался найти определенный источник для получения дополнительной информации о классах символов, но на данный момент все, что я могу вам дать, - это Google Query for Классы символов регулярных выражений . Надеюсь, вы сможете найти там больше информации, чтобы помочь вам.

1
задан Joseph_J 16 January 2019 в 08:29
поделиться

2 ответа

$xXml = openssl_decrypt(
   $Output, #openssl_decrypt works with base64 encoded data
   'AES-256-CBC',
   base64_decode("QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE"), #key
   OPENSSL_RAW_DATA,
   base64_decode("hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=") #IV
);

Теперь $xXml - это двоичная форма входной строки в кодировке UTF-8.

И убедитесь, что openssl включен в вашу сборку PHP.

0
ответ дан shingo 16 January 2019 в 08:29
поделиться

Вы не предоставили мне зашифрованный текст, чтобы можно было это проверить.

Вот что я думаю вам нужно сделать:

В вашем коде C # вам нужно изменить размер блока на 128 бит:

aes.BlockSize = 128;

[ 1110] В вашем коде C # ваш IV должен иметь длину 128 бит или 16 байтов. Он должен соответствовать выбранному размеру блока.

Итак, пока это должен быть ваш IV:

IV = HWeR102dxMjRHZlxTqL2aA==

Ваш ключ настроен на 256 бит: Итак, вот ключ на 256 бит:

Key = aZUEBKSsYRKA6CGQbwFwvIS8rUnW7YA2hVMNHnnf844=

В C # есть функции, которые автоматически генерируют криптографически стойкую строку для вас определенной длины. Я предлагаю вам найти эти функции и научиться их использовать, чтобы вы могли создавать свои собственные ключи и IV.

Теперь для части PHP.

Вы должны использовать библиотеку OpenSSL вместо библиотеки Mcrypt. Mcrypt устарела и больше не поддерживается. Итак, вот решение OpenSSL.

Поскольку размер блока теперь составляет 128 битов, а размер ключа - 256 битов, теперь он будет совместим с функцией AES-256-CBC библиотеки openssl.

$key = 'aZUEBKSsYRKA6CGQbwFwvIS8rUnW7YA2hVMNHnnf844='; //256 bit key.  
$iv = 'HWeR102dxMjRHZlxTqL2aA=='; //128 bit IV length.  The same as the block size that is set in the C#.

function decrypt($string, $key, $iv){

  $cipherText = base64_decode($string);  //We are going to use raw data.
  return openssl_decrypt($cipherText, 'AES-256-CBC', base64_decode($key), OPENSSL_RAW_DATA, base64_decode($iv));
  //Note that I did not specify no padding in the function.  By default it is PKCS#7 which is what is set in the C# code.
}

Лучшее, что я могу сказать, должно работать на вас. Это предположение основано на том факте, что ваш AES_encrypt() работает правильно и что на вашей машине установлен OpenSSL. Что вы, вероятно, делаете.

Надеюсь, это поможет!

0
ответ дан Joseph_J 16 January 2019 в 08:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: