У меня есть 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()
функция и все, что выходит вставить в следующую строку.
зашифрованный текст = поместите зашифрованный текст здесь.
$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.
Вы не предоставили мне зашифрованный текст, чтобы можно было это проверить.
Вот что я думаю вам нужно сделать:
В вашем коде 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 битов, он теперь будет совместим с библиотекой openssl. AES-256-CBC
функция.
$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 на вашем компьютере. Что вы, вероятно, делаете.
Надеюсь, поможет!