ОБНОВЛЕНО
Я внес изменения в код C #, поэтому он использует размер блока 256. Но теперь мир привет выглядит как этот http://pastebin.com/5sXhMV11, и я не могу понять, что я должен использовать с rtrim (), чтобы получить Поездка беспорядка в конце.
Также, когда вы говорите, что IV должно быть случайным, этим вы имеете в виду, что не используйте тот же IV больше, чем один раз, или это то, как я закодировал это неправильно?
Еще раз спасибо!
Здравствуй,
Я пытаюсь расшифровать строку с PHP, которая была зашифрована на C #. Я не могу заставить PHP расшифровать его с помощью mcrypt и, возможно, с некоторой помощью справится. Я получаю следующую ошибку с php, поэтому я предполагаю, что я не правильно устанавливаю IV.
Ошибка: параметр IV должен быть до тех пор, пока размер блока
Обе функции используют один и тот же шифр, ключ, IV и устанавливают режим CBC:
зашифрованный текст из c # = UmzUCnAzThH0nMkIuMisqg ==
ключ 32 long = qwertyuiopasdfghjklzxcvbnmqwerty
iv 16 long = 1234567890123456
C #
public static string EncryptString(string message, string KeyString, string IVString) { byte[] Key = ASCIIEncoding.UTF8.GetBytes(KeyString); byte[] IV = ASCIIEncoding.UTF8.GetBytes(IVString); string encrypted = null; RijndaelManaged rj = new RijndaelManaged(); rj.Key = Key; rj.IV = IV; rj.Mode = CipherMode.CBC; try { MemoryStream ms = new MemoryStream(); using (CryptoStream cs = new CryptoStream(ms, rj.CreateEncryptor(Key, IV), CryptoStreamMode.Write)) { using (StreamWriter sw = new StreamWriter(cs)) { sw.Write(message); sw.Close(); } cs.Close(); } byte[] encoded = ms.ToArray(); encrypted = Convert.ToBase64String(encoded); ms.Close(); } catch (CryptographicException e) { Console.WriteLine("A Cryptographic error occurred: {0}", e.Message); return null; } catch (UnauthorizedAccessException e) { Console.WriteLine("A file error occurred: {0}", e.Message); return null; } catch (Exception e) { Console.WriteLine("An error occurred: {0}", e.Message); } finally { rj.Clear(); } return encrypted; }
PHP
var $mcrypt_cipher = MCRYPT_RIJNDAEL_256; var $mcrypt_mode = MCRYPT_MODE_CBC; function decrypt($key, $iv, $encrypted) { $encrypted = base64_decode($encrypted); $decrypted = rtrim(mcrypt_decrypt($this->mcrypt_cipher, $key, $encrypted, $this->mcrypt_mode, $iv), "\0");; return $decrypted; }
благодаря
Если вы хотите использовать Rijndael256 в своем приложении C #, вам нужно установить BlockSize на 256.
RijndaelManaged rj = new RijndaelManaged(); rj.BlockSize = 256;
И тогда ваш iv должен также иметь длину в 256 бит.
см. свойство SymmetricAlgorithm.BlockSize
Или наоборот: В настоящее время ваше приложение C # использует Rijndael128, поэтому должен быть ваш php-скрипт.
<?php class Foo { protected $mcrypt_cipher = MCRYPT_RIJNDAEL_128; protected $mcrypt_mode = MCRYPT_MODE_CBC; public function decrypt($key, $iv, $encrypted) { $iv_utf = mb_convert_encoding($iv, 'UTF-8'); return mcrypt_decrypt($this->mcrypt_cipher, $key, base64_decode($encrypted), $this->mcrypt_mode, $iv_utf); } } $encrypted = "UmzUCnAzThH0nMkIuMisqg=="; $key = "qwertyuiopasdfghjklzxcvbnmqwerty"; $iv = "1234567890123456"; $foo = new Foo; echo $foo->decrypt($key, $iv, $encrypted);
печатает hello world
Шифрование с использованием PHP;
/Generate public key for encrytion $path = "keys/"; $crt = openssl_x509_read(file_get_contents($path."cert.crt")); $publickey = openssl_get_publickey($crt); //Encrypt using public key openssl_public_encrypt($source, $crypted, $publickey); //openssl_private_encrypt($source, $crypted, $privkey); echo base64_encode($crypted);
Расшифровывать с помощью C #
X509Certificate2 x509cert = new X509Certificate2(pKeyFilename); RSACryptoServiceProvider.UseMachineKeyStore = false; RSACryptoServiceProvider crypt = (RSACryptoServiceProvider)x509cert.PrivateKey; byte[] decrypted = crypt.Decrypt(Convert.FromBase64String(data), false); return ASCIIEncoding.UTF8.GetString(decrypted);
где pKeyFilename – это файл личной информации, созданный с помощью файла сертификата cert.crt. В этих примерах используется шифрование AES-256.