Расшифровать токен доступа с помощью PHP для шифрования C # - PullRequest
0 голосов
/ 16 января 2019

У меня есть URL-адрес API с определенным токеном доступа, который был зашифрован с помощью C # (код ниже), и я хочу расшифровать его с помощью пост-запроса PHP, передав токен доступа параметрам. Может кто-нибудь помочь мне решить эту проблему.

Заранее спасибо !!

C # Код для шифрования:

private String AES_encrypt(String Input)
   {
   var aes = new RijndaelManaged();
   aes.KeySize = 256;
   aes.BlockSize = 256;
   aes.Padding = PaddingMode.PKCS7;
   aes.Key =Convert.FromBase64String("QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE");
   aes.IV = Convert.FromBase64String("hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=");
   var encrypt = aes.CreateEncryptor(aes.Key, aes.IV);
   byte[] xBuff = null;
   using (var ms = new MemoryStream())
   {
   using (var cs = new CryptoStream(ms, encrypt, CryptoStreamMode.Write))
   {
     byte[] xXml = Encoding.UTF8.GetBytes(Input);
     cs.Write(xXml, 0, xXml.Length);
   }
     xBuff = ms.ToArray();
   }
     String Output = Convert.ToBase64String(xBuff);
     return Output;
   }

Пока я пытался расшифровать его с помощью кода ниже

function strippadding($string)
    {
        $slast = ord(substr($string, -1));
        $slastc = chr($slast);
        $pcheck = substr($string, -$slast);
        if(preg_match("/$slastc{".$slast."}/", $string)){
        $string = substr($string, 0, strlen($string)-$slast);
            return $string;
        } else {
            return false;
        }
   }
function decrypt($string)
    {
        $key = base64_decode("DZR");
        $iv = base64_decode("Shravan");
        $string = base64_decode($string);
        return strippadding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $string, MCRYPT_MODE_CBC, $iv));
    }

Заполните следующие пункты:

Используйте эту клавишу и iv ниже.

key = QdZx1B0ZIcLK7DPNRK09wc/rjP4WnxtE

iv= hBSE4tn6e/5c3YVKFZ54Iisi4MiDyCO0HJO+WZBeXoY=

Выполните некоторый текст через функцию AES_encrypt(), и все, что получится, вставьте в следующую строку.

зашифрованный текст = поместите зашифрованный текст здесь.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

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

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

aes.BlockSize = 128;

В вашем коде 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 голосов
/ 16 января 2019
$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.

...