Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
14 / 14 / 0
Регистрация: 04.05.2016
Сообщений: 157

Разная кодировка PHP и C# при одинаковых вводных данных

29.01.2020, 01:03. Показов 2398. Ответов 6

Студворк — интернет-сервис помощи студентам
Добрый день/вечер. Проблема: при одних и тех же данных кодировка разная... Что можете посоветовать? Может какие то общие библиотеки и тд. Спасибо!

вот код для кодировки на php
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc");
$txt = 'test123';
$iv = '26dc7aeeff00aded26dc7aeeff00aded';
 
$key_size =  strlen($key);
echo "Длина ключа: ".$key_size."<pre>";
 
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $txt, MCRYPT_MODE_CBC, $iv);
//$ciphertext = $iv.$ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
echo  $ciphertext_base64;
?>
Вот на c#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static byte[] ToAes256(string src, byte[] Ekey, byte[] IV)
        {
            //Объявляем объект класса AES
            Aes aes = Aes.Create();
            byte[] encrypted;
            ICryptoTransform crypt = aes.CreateEncryptor(Ekey, IV);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cs))
                    {
                        sw.Write(src);
                    }
                }
                encrypted = ms.ToArray();
            }
            return encrypted;
        }
        static void Main(string[] args)
        {
            byte[] bytes = { 0xbc, 0xb0, 0x4b, 0x7e, 0x10, 0x3a, 0x0c, 0xd8, 0xb5, 0x47, 0x63, 0x05, 0x1c, 0xef, 0x08, 0xbc };
            byte[] SALT = new byte[] { 0x26, 0xdc, 0x7a, 0xee, 0xff, 0x00, 0xad, 0xed, 0x26, 0xdc, 0x7a, 0xee, 0xff, 0x00, 0xad, 0xed};
            string txt = "test123";
            string A = Convert.ToBase64String((ToAes256(txt, bytes, SALT)));
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.01.2020, 01:03
Ответы с готовыми решениями:

Разная ширина блоков при одинаковых параметрах
Делаю страничку. Ставлю ширину шапки 800px и под шапкой делаю место под верхнее меню тоже 800 px но при просмотре в браузере ширина...

Неправильная кодировка при ВВОДЕ данных в MySQL из PHP
Перерыл весь форум, но проблема так и не решилась. Дано: компьютер с Windows 7 и установленным Denwer3; компьютер с MacOS 10.9.5 и...

Вывод свойств согласно вводных данных
Добрый вечер! Сразу прошу прощения, так как эту среду только начал изучать) Вопрос в чем, есть табличная база со следующими данными: ...

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2020, 10:39
Лучший ответ Сообщение было отмечено DOKERcom как решение

Решение

Цитата Сообщение от DOKERcom Посмотреть сообщение
при одних и тех же данных
Данные и используемые алгоритмы — разные.

Перво-наперво, соль в версии PHP — 32-байтовая строка, а не 16-байтовый массив, как в варианте на шарпе — обратите внимание на отсутствие вызова pack в версии PHP.
В метод mcrypt_encrypt соль передается как есть, потому алгоритм использует ASCII-коды символов, а не их шестнадцатеричный аналог, как в случае с $key.

На шарпе аналогичная соль будет выглядеть так:
C#
1
byte[] SALT = Encoding.ASCII.GetBytes("26dc7aeeff00aded26dc7aeeff00aded");
Дальше, в PHP вы используете Rijndael-256, а Aes.Create на шарпе использует Rijndael-128.
Плюс нигде не устанавливается режим на CBC и padding.

Исправленный вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public static byte[] ToAes256(string src, byte[] Ekey, byte[] IV)
{
    using (var aes = Rijndael.Create())
    {
        aes.BlockSize = 256;
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.Zeros;
 
        using (var crypt = aes.CreateEncryptor(Ekey, IV))
        using (var ms = new MemoryStream())
        {
            using (var cs = new CryptoStream(ms, crypt, CryptoStreamMode.Write))
            using (var sw = new StreamWriter(cs, Encoding.ASCII))
                sw.Write(src);
 
            return ms.ToArray();
        }
    }
}
Учтите, правда, что в .NET Core из коробки используется только Rijndael-128, так что если приложение пишется под Core и вы хотите 256-битную версию, то придется подключать какую-нибудь стороннюю реализацию.
В противном случае на строке aes.BlockSize = 256; вылетит исключение о неподдерживаемом размере вектора инициализации.
1
14 / 14 / 0
Регистрация: 04.05.2016
Сообщений: 157
29.01.2020, 13:11  [ТС]
kolorotur, спасибо, я поменял строку на aes.BlockSize = 128; и всё равно сейчас вылетает ошибка, но уже на вот этой строке
C#
1
using (var crypt = aes.CreateEncryptor(Ekey, IV))
- System.ArgumentException: "Specified initialization vector (IV) does not match the block size for this algorithm. "
Соль теперь не принимает? (код поменял на ваш)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2020, 13:13
Цитата Сообщение от DOKERcom Посмотреть сообщение
я поменял строку на aes.BlockSize = 128
Но при этом продолжаете передавать 32-байтовую соль.

Цитата Сообщение от DOKERcom Посмотреть сообщение
Соль теперь не принимает?
Ага.

Только зачем менять? Вам же нужна была реализация, аналогичная PHP?
0
14 / 14 / 0
Регистрация: 04.05.2016
Сообщений: 157
29.01.2020, 13:19  [ТС]
kolorotur, Но если не перейти на 128 вы писали нужно добавлять другие библиотеки, и да с солью я разобрался) не сразу сообразил. Значит и в php переведу на 128 и тогда надеюсь кодировка совпадёт...
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.01.2020, 13:26
Лучший ответ Сообщение было отмечено DOKERcom как решение

Решение

Цитата Сообщение от DOKERcom Посмотреть сообщение
Но если не перейти на 128 вы писали нужно добавлять другие библиотеки
Вы приложение под .NET Core разрабатываете или под .NET Framework?
1
14 / 14 / 0
Регистрация: 04.05.2016
Сообщений: 157
29.01.2020, 13:53  [ТС]
kolorotur, У меня задача стояла просто сделать синхронную кодировку и декодировку на php и c# и всё, но на сколько я понял там программа на c# которая должна будет работать с сервером на php.

Добавлено через 2 минуты
Вот только как раскодировать обратно в c#
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        public static string FromAes256(byte[] shifr, byte[] Ekey, byte[] IV)
        {
            byte[] bytesIv = new byte[16];
            byte[] mess = new byte[shifr.Length - 16];
            for (int i = shifr.Length - 16, j = 0; i < shifr.Length; i++, j++)
                bytesIv[j] = shifr[i];
            for (int i = 0; i < shifr.Length - 16; i++)
                mess[i] = shifr[i];
            Aes aes = Aes.Create();
            string text = "";
            byte[] data = mess;
            ICryptoTransform crypt = aes.CreateDecryptor(Ekey, IV);
            using (MemoryStream ms = new MemoryStream(data))
            {
                using (CryptoStream cs = new CryptoStream(ms, crypt, CryptoStreamMode.Read))
                {
                    using (StreamReader sr = new StreamReader(cs))
                    {
                        //Результат записываем в переменную text в вие исходной строки
                        text = sr.ReadToEnd();
                    }
                }
            }
            return text;
        }
Я пока сам думаю, но может вы быстрее подскажите..

Добавлено через 4 минуты
Буду максимально благодарен, а то я борюсь с этими кодами давно... написал только сейчас на форум.

Добавлено через 15 минут
kolorotur, Всё уже не надо) сам разобрался, СПАСИБО ОГРОМНОЕ!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.01.2020, 13:53
Помогаю со студенческими работами здесь

MaskedTextBox - проверка вводных данных для времени
Создал на форме MaskedTextBox1 с маской времени (mask - Time): 00:00. Есть ли готовые решения подключить фильтр (??) на вводимые данные,...

Разная кодировка
Всем привет! в консоли есть очень хорошая команда mail спомощью которой можно отправлять почту А, можно ли как то указать кодировку...

Как сделать, чтобы при разных условиях появлялась разная кнопка php?
Что-то типо этого, только тут не верно:) мне нужно, чтобы работало так: если новость с таким именем есть , то кнопка редактировать, если...

Разная кодировка в файлах dfm
Ведь такого не должно быть? Оно собственно и ругается... Как можно в читабельный вид привести?

Разная производительность одинаковых видеокарт
Добрый день, форумчане. У меня и у моего близкого друга одинаковые видеокарты (GeForce GT 640 2GB DDR3), но с разной производительностью....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Номеклатура. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru