Метод Openssl_Decrypt в .net не работает как в PHP - PullRequest
0 голосов
/ 09 июля 2019

У меня есть пример кода PHP, показывающий, как расшифровать определенное сообщение.Я пытаюсь расшифровать это сообщение, используя C #, но пока не получилось.

Вот что я пытаюсь:

public static string AesDecrypt(byte[] dataToDecrypt, byte[] key, byte[] iv)
    {
        using (var aes = new AesCryptoServiceProvider())
        {
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.None;
            //aes.KeySize = 256;

            aes.Key = key;
            aes.IV = iv;

            using (var memoryStream = new MemoryStream(dataToDecrypt))
            {
                var cryptoStream = new CryptoStream(memoryStream, aes.CreateDecryptor(key, iv), CryptoStreamMode.Read);

                using (var reader = new StreamReader(cryptoStream))
                {
                    return reader.ReadToEnd();
                }
            }
        }

    }

Вот как я вызываю метод:

        var aesKey = GenerateSha256Hash(Encoding.ASCII.GetBytes("t-3zafRa"));

        var aesIv = GenerateSha256Hash(Encoding.ASCII.GetBytes("St@cE4eZ"));
        var ivString = ConvertByteArrayToSring(aesIv).Substring(0, 16);

        // I'm getting a 24 byte array here, but message needs to be multiple of 16, isn't it?
        var encryptedText = Convert.FromBase64String("RmVpUjU4VjJlcXp2dkN5UlhUODQzUT09");


        var aesDecryptedBytes = AesDecrypt(encryptedText, aesKey, Encoding.ASCII.GetBytes(ivString));

Вот пользовательские методы сверху:

public static byte[] GenerateSha256Hash(byte[] toBeHashed)
    {
        using (var sha256 = SHA256.Create())
        {
            return sha256.ComputeHash(toBeHashed);
        }
    }

    public static string ConvertByteArrayToSring(byte[] bytes)
    {
        var builder = new StringBuilder();
        foreach (var t in bytes)
        {
            builder.Append(t.ToString("x2"));
        }
        return builder.ToString();
    }

Пример кода PHP, который у меня есть, приведен ниже:

php > $secret_key = "t-3zafRa";
$secret_iv = "St@cE4eZ";
php > $encrypted_txt = "RmVpUjU4VjJlcXp2dkN5UlhUODQzUT09";
php > $encrypt_method = "AES-256-CBC";
php > $key = hash('sha256', $secret_key);
php > $iv = substr(hash('sha256', $secret_iv), 0, 16);
php > echo openssl_decrypt(base64_decode($encrypted_txt), $encrypt_method, $key, 0, $iv);

Я получаю правильныйзначение для Key, IV и даже сообщение, когда я конвертирую его из base64String, но последний вызов Openssl_Decrypt, похоже, не работает для меня.

Я получаю сообщение об ошибке «Входные данные не полны»block ", что, как и ожидалось, я пытался удалить из сообщения первый и последний 8 байт как IV, чтобы сделать его 16-байтовым, но я все еще получаю дрянь.

Чего мне здесь не хватает?Благодарю.

...