Как преобразовать управляемое rijndael шифрование AES 256 с C# в PHP с помощью openssl_encrypt

#c# #php #encryption #openssl

#c# #php #шифрование #openssl

Вопрос:

Мне нужно интегрировать API, встроенный в C#, в мое PHP-приложение. Мне был приведен пример того, как зашифровать токен для отправки через заголовок авторизации, однако у меня возникли трудности с преобразованием кода C# в PHP. Любая помощь будет признательна. Я пытаюсь использовать openssl_encrypt, так как mcrypt устарел. Пример кода C# ниже:

 public static string EncryptData(string textData, string Encryptionkey) {  RijndaelManaged objrij = new RijndaelManaged();  //set the mode for operation of the algorithm  objrij.Mode = CipherMode.CBC;  //set the padding mode used in the algorithm.  objrij.Padding = PaddingMode.PKCS7;  //set the size, in bits, for the secret key.  objrij.KeySize = 0x80;  //set the block size in bits for the cryptographic operation.  objrij.BlockSize = 0x80;  //set the symmetric key that is used for encryption amp; decryption.  byte[] passBytes = Encoding.UTF8.GetBytes(Encryptionkey);  //set the initialization vector (IV) for the symmetric algorithm  byte[] EncryptionkeyBytes = new byte[] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };   int len = passBytes.Length;  if (len gt; EncryptionkeyBytes.Length)  {  len = EncryptionkeyBytes.Length;  }  Array.Copy(passBytes, EncryptionkeyBytes, len);   objrij.Key = EncryptionkeyBytes;  objrij.IV = EncryptionkeyBytes;   //Creates a symmetric AES object with the current key and initialization vector IV.  ICryptoTransform objtransform = objrij.CreateEncryptor();  byte[] textDataByte = Encoding.UTF8.GetBytes(textData);  //Final transform the test string.  return Convert.ToBase64String(objtransform.TransformFinalBlock(textDataByte, 0, textDataByte.Length)); }  

Я пробовал несколько различных подходов, но в качестве базовой точки это то, что у меня есть в настоящее время:

 // Encryption key provided is 44 bytes/characters: $key = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'; // Data/Header to encrypt: $dataToEncrypt = $user . $datetime; // IV for AES-256-CBC is 16 bytes/characters: $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('AES-256-CBC')); // Encrypt token: $token = openssl_encrypt($dataToEncrypt, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv); // Base 64 encode: $token = base64_encode($iv . $token);  

Комментарии:

1. Код C# использует ключ размером 16 байт (и урезает более длинные ключи). Поэтому PHP — код должен соответственно использовать AES-128. Кроме того, код C# также использует ключ в качестве IV (что, как правило, небезопасно). В PHP-коде используется случайно сгенерированный IV и добавляется к зашифрованному тексту, что на самом деле является более безопасным способом, но просто не соответствует коду C#.

2. @Topaco Спасибо за ваш ответ. Я понял это из твоего комментария. Если вы хотите отправить ответ, я с радостью отмечу его как правильный. Я действительно задавался вопросом, почему IV соответствует ключу, я перешлю эту заметку команде разработчиков, которая следит за API в качестве возможного улучшения безопасности.