Intereting Posts
WordPress: как показать метабокс на любой странице администратора? PHP. Есть ли возможность запуска GUI-программы через exec ()? Не удалось достоверно определить полное доменное имя сервера для MacBook После изменения моего файла .htaccess, чтобы скрыть расширение .php из URL-адреса, некоторые элементы каталога не могут быть найдены В Laravel 5, почему Request :: root () отличается при вызове во время теста phpunit? @mysql_connect и mysql_connect Как отсортировать массив римских цифр? Хотите вручную отправить SYN ACK-пакеты для установления TCP-соединения (по возможности, в PHP) Есть ли способ в MySQL перевернуть логическое поле с одним запросом? Yii2 Session Storage в БД, слишком много строк? Представление? Как хранить европейскую валюту в MySQL? Скрытие URL изображения Как предотвратить появление странных символов на веб-страницах Проверка длины строки в PHP Синтаксическая ошибка SQL в mysql

Шифрование в PHP, расшифровка в C # (WP7 / Silverlight) с использованием AES / Rijndael

Я использовал службу REST, написанную на PHP в моем приложении для Android, без особых проблем. Теперь я пытаюсь использовать его в приложении Windows Phone, и я уже схожу с ума!

То, что я знаю до сих пор: Silverlight будет принимать только Aes в режиме CBC и PKCS7.

Что я получаю: исключение «Заполнение недопустимо и не может быть удалено» в (см. Полный код внизу):

plaintext = srDecrypt.ReadToEnd(); 

Если я склеил и расшифровал в C #, используя те же конфиги, он отлично работает. Когда я пытаюсь decript в C # из строки с зашифрованной PHP, он не работает с ошибкой, упомянутой выше.

Мой PHP-скрипт делает следующее:

     function encrypt128($message) { $vector = "DB96A56CCA7A69FC"; $key = "6DBC44F54CA3CFDEDDCA140CA46A99C1"; // PHP md5 function leaves it in lower case, so I just copied the key from C# debug. //PKCS7 Padding $block = mcrypt_get_block_size('rijndael_128', 'cbc'); $pad = $block - (strlen($message) % $block); $message.= str_repeat(chr($pad), $pad); $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', 'cbc', ''); mcrypt_generic_init($cipher, $key, $vector); $result = mcrypt_generic($cipher, $message); mcrypt_generic_deinit($cipher); return base64_encode($result); } 

    А в C # (Silverlight / Windows Phone 7) для дешифрования используется следующее:

     //Where buffer is the string data I got after calling the PHP REST service. DecryptStringFromBytes(Convert.FromBase64String(buffer), MD5Core.GetHash("7a272d3e41372c547a272d3e41372c54"), System.Text.Encoding.UTF8.GetBytes("DB96A56CCA7A69FC")); static string DecryptStringFromBytes(byte[] cipherText, byte[] Key, byte[] IV) { // Check arguments. if (cipherText == null || cipherText.Length <= 0) throw new ArgumentNullException("cipherText"); if (Key == null || Key.Length <= 0) throw new ArgumentNullException("Key"); if (IV == null || IV.Length <= 0) throw new ArgumentNullException("Key"); // Declare the string used to hold // the decrypted text. string plaintext = null; // Create an RijndaelManaged object // with the specified key and IV. using (AesManaged rijAlg = new AesManaged()) { rijAlg.Key = Key; rijAlg.IV = IV; // Create a decrytor to perform the stream transform. ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); // Create the streams used for decryption. using (MemoryStream msDecrypt = new MemoryStream(cipherText)) { using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) { using (StreamReader srDecrypt = new StreamReader(csDecrypt)) { // Read the decrypted bytes from the decrypting stream // and place them in a string. plaintext = srDecrypt.ReadToEnd(); } } } } return plaintext; } 

    Большой вопрос: что я делаю неправильно?

    Заранее спасибо!

    Related of "Шифрование в PHP, расшифровка в C # (WP7 / Silverlight) с использованием AES / Rijndael"

    Итак, вот ответ:

    Я бросил MD5 дерьмо из PHP и C #, и теперь они работают исправно.

    На всякий случай, когда вы упали сюда, ища тот же ответ, вот пример кода. Не забудьте сделать свой собственный ключ и iv (хотя они будут работать, не рекомендуется использовать!)

    PHP:

     function encrypt128($message) { $vector = "0000000000000000"; $key = "00000000000000000000000000000000"; $block = mcrypt_get_block_size('rijndael_128', 'cbc'); $pad = $block - (strlen($message) % $block); $message .= str_repeat(chr($pad), $pad); $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', 'cbc', ''); mcrypt_generic_init($cipher, $key, $vector); $result = mcrypt_generic($cipher, $message); mcrypt_generic_deinit($cipher); return base64_encode($result); } 

    C #:

     byte[] cripted = EncryptStringToBytes("Test", System.Text.Encoding.UTF8.GetBytes("00000000000000000000000000000000"), System.Text.Encoding.UTF8.GetBytes("0000000000000000")); 

    Шифрование / Расшифровка с помощью PHP:

     class Cipher { private $key, $iv; function __construct() { $this->key = "edrtjfjfjlldldld"; $this->iv = "56666852251557009888889955123458"; } function encrypt($text) { $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); $padding = $block - (strlen($text) % $block); $text .= str_repeat(chr($padding), $padding); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->key, $text, MCRYPT_MODE_CBC, $this->iv); return base64_encode($crypttext); } function decrypt($input) { $dectext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->key, base64_decode($input), MCRYPT_MODE_CBC, $this->iv); return $dectext; } } 

    Шифрование / Расшифровка с использованием C #:

     public class RijndaelSimple { const string iv = "56666852251557009888889955123458"; const string key = "edrtjfjfjlldldld"; static public String EncryptRJ256(string plainText) { var encoding = new UTF8Encoding(); var Key = encoding.GetBytes(key); var IV = encoding.GetBytes(iv); byte[] encrypted; using (var rj = new RijndaelManaged()) { try { rj.Padding = PaddingMode.PKCS7; rj.Mode = CipherMode.CBC; rj.KeySize = 256; rj.BlockSize = 256; rj.Key = Key; rj.IV = IV; var ms = new MemoryStream(); using (var cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) { using (var sr = new StreamWriter(cs)) { sr.Write(plainText); } encrypted = ms.ToArray(); } } finally { rj.Clear(); } } return Convert.ToBase64String(encrypted); } static public String DecryptRJ256(string input) { byte[] cypher = Convert.FromBase64String(input); var sRet = ""; var encoding = new UTF8Encoding(); var Key = encoding.GetBytes(key); var IV = encoding.GetBytes(iv); using (var rj = new RijndaelManaged()) { try { rj.Padding = PaddingMode.PKCS7; rj.Mode = CipherMode.CBC; rj.KeySize = 256; rj.BlockSize = 256; rj.Key = Key; rj.IV = IV; var ms = new MemoryStream(cypher); using (var cs = new CryptoStream(ms, rj.CreateDecryptor(Key, IV), CryptoStreamMode.Read)) { using (var sr = new StreamReader(cs)) { sRet = sr.ReadLine(); } } } finally { rj.Clear(); } } return sRet; } }