Кросс-платформенное (php to C # .NET) шифрование / дешифрование с помощью Rijndael, часть 2

<Оригинальный код отсюда>

Я наткнулся на эту тему во время поиска в Google. Однако, после того, как я попробовал это и внес коррективы, я столкнулся с препятствием, надеюсь, кто-нибудь мне поможет.

  1. Приведенный выше код подходит, но поскольку алгоритм не очень полезен без внесения изменений IV каждый раз, я пытался использовать следующий код для генерации iv, но он постоянно повторял: «Указанный ключ не является допустимым размером для этого алгоритма». в моем C # отладчике.

  2. Я также попытался вывести IV из кода C #, после декодирования строки base 64 длина строки изменяется от 30 31 2X ==> в основном просто колеблется по какой-то причине.

  3. Я также хотел бы изменить KEY, но не смог по тем же причинам, что и проблема IV, так что, надеюсь, кто-нибудь может мне помочь с этим?

(Я пробовал следующее из http://php.net/manual/en/function.mcrypt-encrypt.php, не могу заставить его работать в гармонии с C #, может быть, как только я исправлю проблему IV, я смогу это исправить?

  $key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3"); )

PHP ========================

<?php
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
//$iv = "45287112549354892144548565456541";
$key = "anjueolkdiwpoida";

$text = "This is my encrypted message";
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);
$crypttext = urlencode($crypttext);
$crypttext64=base64_encode($crypttext);
print($crypttext64) . "\n<br/>";
print(base64encode($iv)) . "\n<br/>";
?>

C # ========================

string iv = Encoding.UTF8.GetString(Convert.FromBase64String("SOME IV STRING I COPY FROM BROSWER WITH ABOVE PHP LOADED"));
string kyy = "anjueolkdiwpoida";
//ciphertext is also SOME TXT STRING I COPIED FROM BROWSER WITH ABOVE PHP LOADED
string plainText = ValidationControls.DecryptRJ256(cipherText, kyy, iv);public byte[] Decode(string str)
{
var decbuff = Convert.FromBase64String(str);
return decbuff;
}

static public String DecryptRJ256(byte[] cypher, string KeyString, string IVString)
{
var sRet = "";

var encoding = new UTF8Encoding();
var Key = encoding.GetBytes(KeyString);
var IV = encoding.GetBytes(IVString);

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();
}
}
}
catch (Exception exc) { Console.WriteLine(exc.Message); App.Current.Shutdown(); }
finally
{
rj.Clear();
}
}

return sRet;
}

1

Решение

  1. Я понял, что декодирование .NET для строки Base 64 действительно странно. Когда я вызвал DecryptRJ256 (), я отправлял ключ и IV, которые я получил из кода php, путем серии преобразований base64_string -> byte -> utf8_string, прежде чем отправлять оба в функцию. Решение этой проблемы — просто отправить байтовый массив напрямую и позволить DecryptRJ256 () работать с ним напрямую.

  2. После выполнения вышеизложенного проблема с автоматическим генерированием ключей и IV становится очевидной и больше не является проблемой.

Код изменен из вопроса:

PHP

$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
$text = "This is my encrypted message";

$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_CBC, $iv);

$crypttext = base64_encode($crypttext);
$key= base64_encode($key);
$iv = base64_encode($iv);

C #

string plainText = ValidationControls.DecryptRJ256(Convert.FromBase64String("/*$CRYPTTEXT STRING FROM PHP*/"), Convert.FromBase64String("/*$KEY STRING FROM PHP*/"), Convert.FromBase64String("/*$ STRING FROM PHP*/"));

static public String DecryptRJ256(byte[] cypher, byte[] KeyString, byte[] IVString)
{
...
var Key = KeyString;
//var Key = encoding.GetBytes(KeyString);
var IV = IVString;
//var IV = encoding.GetBytes(IVString);
...
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]