Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Шифрование на C# с последующей дешифровкой на PHP

26K
14 марта 2010 года
3D-GRAF
41 / / 28.06.2008
Здравствуйте. Требуется зашифровать данные в файле, используя ключ шифрования и потом расшифровать этот файл на PHP. Так как языком C# владею пока что не очень, возникла проблема: файл не дешифруется. Знаю, что ошибка моя, но найти в чем не получается. Уже весь гугл обыскал в поисках примеров, но проблему устранить не удалось.

Шифрую на C#
Код:
byte[] Key = Encoding.Default.GetBytes("key12345678");
byte[] IV = Encoding.Default.GetBytes("key12345678");

RijndaelManaged RMCrypto = new RijndaelManaged();
RMCrypto.Mode = CipherMode.ECB;
RMCrypto.Padding = PaddingMode.Zeros;
RMCrypto.KeySize = 256;

ICryptoTransform Encryptor = RMCrypto.CreateEncryptor(Key, IV);
CryptoStream Crypt = new CryptoStream(fs, Encryptor, CryptoStreamMode.Write);

using (StreamWriter sw = new StreamWriter(Crypt))
{
     sw.Write("Recording data");
     sw.Flush();
}


Расшифровываю на PHP
 
Код:
$data = file_get_contents("data.txt");
echo mcrypt_decrypt(MCRYPT_RIJNDAEL_256, "key12345678", $data, MCRYPT_MODE_ECB, "key12345678");


Подскажите, где копать :)
Заранее спасибо
8.2K
14 марта 2010 года
bagie2
299 / / 26.10.2008
для начала это
Цитата:
Encoding.Default


по поводу функи mcrypt_decrypt ничего сказать не могу. но она все равно как то текстовый ключ переводит в ключ из 32 байт (может быть хэш какой-то иди просто паддинг текста и в какой кодировке?). скорее всего из-за этого и не расшифровывает правильно.

26K
14 марта 2010 года
3D-GRAF
41 / / 28.06.2008
надо Encoding.ASCII?
Если зашифровывать средствами PHP, то всё дешифруется нормально. Значит в C# коде я накосячил. Не очень понял, для чего нужен IV и нужен ли он?
8.2K
14 марта 2010 года
bagie2
299 / / 26.10.2008
попробуйте
 
Код:
Array.Resize(ref Key, 32);
            Array.Resize(ref IV, 16);


перед строчкой RijndaelManaged RMCrypto = new RijndaelManaged();

Цитата:
Не очень понял, для чего нужен IV и нужен ли он?


вектор инициализации. как он будет использоваться зависит от режима шифрования. его можно использовать как расширение для ключа.

кстати режим ECB лучше не использовать. и в этом режиме IV не используется. каждый блок данных шифруется ключем а в самом конце дополняется.

26K
14 марта 2010 года
3D-GRAF
41 / / 28.06.2008
Результат поменялся, но по прежнему не читабелен. Может по другому-то как-то надо ключ переводить?
8.2K
14 марта 2010 года
bagie2
299 / / 26.10.2008
Я проверил и обнаружил интересный факт. С AES-128 всё работает ок. только Array.Resize не забыть добавить. ну и заместо IV в режиме ECB можно null подставить

Зато вот с 256 не хочет и не знаю баг это или нет

mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
вернет 32, когда размер блока должен быть равен 16. тут косяк в PHP он неправильно (де)шифрует с MCRYPT_RIJNDAEL_256

нашел:
Цитата:

Understanding PHP AES Encryption

You would think that MCRYPT_RIJNDAEL_256 specifies 256-bit encryption,
but that is wrong. The three choices specify the block-size to be used
with Rijndael encryption. They say nothing about the key size (i.e. strength)
of the encryption.
Thus, if you specify MCRYPT_RIJNDAEL_256, your encrypted output will always
be a multiple of 32 bytes (i.e. 256 bits). If you specify MCRYPT_RIJNDAEL_128,
your encrypted output will always be a multiple of 16 bytes.
Note: Strictly speaking, AES is not precisely Rijndael (although in practice
they are used interchangeably) as Rijndael supports a larger range of block
and key sizes; AES has a fixed block size of 128 bits and a key size of
128, 192, or 256 bits, whereas Rijndael can be specified with key and block
sizes in any multiple of 32 bits, with a minimum of 128 bits and a maximum of
256 bits.
In summary: If you want to be AES compliant, always choose MCRYPT_RIJNDAEL_128.

26K
15 марта 2010 года
3D-GRAF
41 / / 28.06.2008
То ли лыжи не едут, то ли я.. Видимо сказывается кривота рук, но не получается все равно :)

C#
Код:
...
byte[] Key = Encoding.Default.GetBytes("key12345678");
byte[] IV = null;

Array.Resize(ref Key, 32);
Array.Resize(ref IV, 32);

RijndaelManaged RMCrypto = new RijndaelManaged();
RMCrypto.Mode = CipherMode.ECB;
RMCrypto.Padding = PaddingMode.Zeros;
RMCrypto.KeySize = 128;

ICryptoTransform Encryptor = RMCrypto.CreateEncryptor(Key, IV);
...


PHP
 
Код:
$data = file_get_contents("filename");
echo mcrypt_decrypt(MCRYPT_RIJNDAEL_128, "key12345678", $data, MCRYPT_MODE_ECB);


Выдает бяку опять
8.2K
15 марта 2010 года
bagie2
299 / / 26.10.2008
Код:
byte[] Key = Encoding.Default.GetBytes("key12345678");

Array.Resize(ref Key, 16); // Array.Resize(ref Key, RMCrypto.KeySize >> 3);

RijndaelManaged RMCrypto = new RijndaelManaged();
RMCrypto.Mode = CipherMode.ECB;
RMCrypto.Padding = PaddingMode.Zeros;
RMCrypto.KeySize = 128;
RMCrypto.Key = Key;

ICryptoTransform Encryptor = RMCrypto.CreateEncryptor();


И вообще Encoding.Default лучше заменить на явное указание какой-нибудь кодировки. Например UTF8, только конечно в PHP эту кодировку надо учитывать. UTF8 хороша тем, что если набор символов будет только ASCII, то она их представит как есть.
И в представлении ключа как массива байтов и в
Цитата:
new StreamWriter(Crypt, Encoding.x)

26K
15 марта 2010 года
3D-GRAF
41 / / 28.06.2008
Огромное спасибо :) Теперь всё работает как надо
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог