#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 в качестве возможного улучшения безопасности.