Я расшифровываю данные, используя PHP с этим кодом:
$content="1234";
$cp = mcrypt_module_open('rijndael-128', '', 'cbc', '');
$iv = mcrypt_create_iv(16, MCRYPT_RAND);
$key = pack("H*",md5('a'));
mcrypt_generic_init($cp, $key, $iv);
$encrypted = mcrypt_generic($cp, $content);
echo base64_encode($key)."\n";
echo base64_encode($iv)."\n";
echo base64_encode($encrypted)."\n";
mcrypt_generic_deinit($cp);
mcrypt_module_close($cp);
$ iv и $ encrypted затем сохраняются в файл и читаются в примере приложения C #:
var iv=...;
var encrypted=...;
var md5 = new MD5CryptoServiceProvider();
var key = md5.ComputeHash(Encoding.Default.GetBytes("a"));
md5.Clear();
Console.WriteLine(Convert.ToBase64String(key));
Console.WriteLine(Convert.ToBase64String(iv));
Console.WriteLine(Convert.ToBase64String(encrypted));
Вывод здесь точно такой же, как и вывод PHP, поэтому я могу убедиться, что между ними нет ошибок кодирования.
var rd = new RijndaelManaged {
Key = key,
IV = iv,
Mode = CipherMode.CBC,
KeySize = 128,
Padding = PaddingMode.Zeros
};
var buffer = new byte[encrypted.Length];
using(var ms = new MemoryStream(buffer)) {
using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Write)) {
cs.Write(encrypted, 0, encrypted.Length);
ms.Read(buffer, 0, buffer.Length);
Console.WriteLine(Encoding.Default.GetString(buffer));
}
}
rd.Clear();
Результат дешифрования меняется при каждом запуске программы, даже при одинаковых входных данных:
Первый запуск:
DMF1ucDxtqgxw5niaXcmYQ == <-Key <br>
GoCeRkrL / EMKNH / BYeLsqQ == <-IV <br>
UBE3DkgbJgj1K / TISugLxA == <-зашифрованный <br>
OlOB99yiCYRDoLx + 0xxZxQ == <- "Расшифровано" </p>
Второй запуск:
DMF1ucDxtqgxw5niaXcmYQ == <-Key <br>
GoCeRkrL / EMKNH / BYeLsqQ == <-IV <br>
UBE3DkgbJgj1K / TISugLxA == <-зашифрованный <br>
w5fcY5Fbb9KRgoHfhqAztA == <- "Расшифровано" </p>
Ключ, IV, Зашифрованные данные идентичны, но, тем не менее, дата расшифровки меняется и всегда неверна. буфер должен содержать «1234» или «1234» плюс 12 конечных нулей.
Я не понимаю, почему результаты меняются, а что не работает, но я уже несколько часов смотрю на этот чертов кусок кода и, вероятно, пропускаю очевидную ошибку ...
Такое изменение CryptoStream приводит к тождественно неправильным результатам:
using(var ms = new MemoryStream(encrypted)) {
using(var cs = new CryptoStream(ms, rd.CreateDecryptor(), CryptoStreamMode.Read)) {
cs.Read(buffer, 0, buffer.Length);
Console.WriteLine(Convert.ToBase64String(buffer));
}
}
Помощь?
Спасибо!
Александр