Преобразование функции шифрования C# AES в PHPC#

Место общения программистов C#
Ответить
Anonymous
 Преобразование функции шифрования C# AES в PHP

Сообщение Anonymous »

Я пытаюсь преобразовать функцию шифрования C# в php, но подозреваю, что возникла проблема с кодировкой или неправильное генерирование IV.
Это для отправки зашифрованного текста в API, и в настоящее время я пытался принудительно использовать utf8, но строки в кодировке Base64 всегда отличаются от тех, которые я получаю при запуске функции C#. Я также не могу найти точный способ генерации IV в C#.
К сожалению, я не могу изменить способ расшифровки API, и я вынужден шифровать его таким образом.
Функция C#
public void EncryptStringToBytes(string plaintext) {
string key = DateTime.UtcNow.ToShortDateString();
HashAlgorithm algorithm = SHA256.Create();
byte[] bytekey = algorithm.ComputeHash(Encoding.UTF8.GetBytes(key));

using (Aes myAes = Aes.Create()) {
myAes.Key = bytekey;
// Encrypt the string to an array of bytes.
byte[] encrypted = null;

// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = myAes.CreateEncryptor(myAes.Key, myAes.IV);

// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream()) {
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt)) {
//Write all data to the stream.
swEncrypt.Write(plaintext);
}
encrypted = msEncrypt.ToArray();
}
}
Console.WriteLine(Convert.ToBase64String(encrypted));
Console.WriteLine(Convert.ToBase64String(myAes.IV));
}
}

Функция PHP
date_default_timezone_set("UTC");

function encrypt($string) {
// Generate key based on current time
$secret_key = utf8_encode(date('Y-m-d'));
// Hash the key with SHA256
$key = hash('sha256', $secret_key);
// Use AES 128 w/ CBC as encryption method
$encrypt_method = "AES-128-CBC";
// Get cipher length based on encryption method
$cypher_length = openssl_cipher_iv_length($encrypt_method);
// Generate IV -- possible issue
$iv = openssl_random_pseudo_bytes($cypher_length);
// Encrypt input string with the given method, key and IV
$output = openssl_encrypt($string, $encrypt_method, $key, OPENSSL_RAW_DATA , $iv);

$debug_info = [ 'date' => $secret_key, 'key' => $key, 'method' => $encrypt_method, 'cypher_len' => $cypher_length, 'iv' => $iv, 'output' => $output];
return [base64_encode($output), base64_encode($iv), $debug_info];
}


Подробнее здесь: https://stackoverflow.com/questions/546 ... ion-to-php
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»