Расшифровывать возвращаемые ненужные данные

1

Я получил алгоритм шифрования, который работал нормально и оставил его один на несколько месяцев. Сегодня мне нужно было снова использовать его, и как-то он сломался. Некоторое время я толкал его и не мог понять, в чем проблема. Ошибок нет, он просто возвращает ненужные данные.

Настройка: PHP-скрипт (который долгое время работал в производстве) шифрует некоторую строку, используя:

function hexstr($hexstr) 
{
  // return pack('H*', $hexstr); also works but it much harder to understand.
  $return = '';
  for ($i = 0; $i < strlen($hexstr); $i+=2) {
    $return .= chr(hexdec($hexstr[$i] . $hexstr[$i+1]));
  }
  return $return;
}

function encrypt($str, $key)
{
    $key = hexstr($key);
    $size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
    $iv = mcrypt_create_iv($size, MCRYPT_RAND);
    return $iv . mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_CBC,$iv);
}

Если я расшифрую это на стороне php, он отлично работает.

Затем строка кодируется base64:

$encoded = base64_encode($encrypted);

Наконец, программа С# удерживает ее и делает следующее:

....
byte[] decoded = Convert.FromBase64String(myWebText);
Decrypt(decoded)
.....


public static byte[] Decrypt(byte[] p)
{
    RijndaelManaged aes128 = new RijndaelManaged();
    aes128.KeySize = 128;
    //aes128.BlockSize = 
    aes128.Padding = PaddingMode.Zeros;
    aes128.Mode = CipherMode.CBC;
    aes128.Key = StringToByteArray("SOMEHEXSTRING");
    //pull the iv off the front of the byte array
    if (p.Length <= 16)
    {
        Utils.ReportError("byte array too short");
        return null;
    }
    byte[] iv = new byte[16];
    Array.Copy(p, 0, iv, 0, 16);
    aes128.IV = iv;
    ICryptoTransform transform = aes128.CreateDecryptor();
    byte[] result = transform.TransformFinalBlock(p, 16, p.Length - 16);

    Debug.Log("If this encrypted stuff was text it would be:"+System.Text.Encoding.UTF8.GetString(result));
    return result;
}


public static byte[] StringToByteArray(string hex)
{
    if (hex.Length % 2 == 1)
        throw new Exception("The binary key cannot have an odd number of digits");

    byte[] arr = new byte[hex.Length >> 1];

    for (int i = 0; i < hex.Length >> 1; ++i)
    {
        arr[i] = (byte)((GetHexVal(hex[i << 1]) << 4) + (GetHexVal(hex[(i << 1) + 1])));
    }

    return arr;
}

Кто-нибудь знает, что это может не работать? Это должно быть очень близко, потому что я уверен, что это сработало в какой-то момент. Обновление: я выполнил двоичное сравнение, когда я С# encode\decode и php encode декодируют. PHP-кодированный Hello World не совпадает с миром С# Hello при использовании того же IV. возможно ли это или это указывает на то, что они каким-то образом не используют одну и ту же конфигурацию.

Теги:
encryption

2 ответа

1
Лучший ответ

Оказывается, я изменил ключ, чтобы иметь буквы верхнего регистра, и моя функция GetHexVal, показанная там, принимала только буквы верхнего регистра... Ouch

0

IDEA: ключ дешифрования изменился.

Очень неприятно, когда это происходит. Вы используете файл конфигурации с ключом дешифрования? Если нет Что используется decryptionKey? Это изменилось?

Если вы используете localApp.config или ROOT.config а ключ был изменен, вы можете обойти все резервные копии, чтобы получить ключ.

 <machineKey decryptionKey="SomeHexValueHere" validationKey="SomeveryLongHexvalueHere" />

Но если ваша PHP-версия работает, ключ должен быть "известным",

  • 0
    Да. У меня есть ключ. Я попробовал другое решение, которое нашел здесь. stackoverflow.com/questions/165808/… . Я могу зашифровать и расшифровать на стороне c #, но я получаю ту же проблему при переходе с php на c #. Просто ненужные символы в качестве вывода. Я попытался добавить заполнение и использовать PKCS7, но я получил: CryptographicException: Bad PKCS7 padding. Недопустимая длина 197. Я передаю криптографический материал ровно 16 байтов, поэтому я не уверен, откуда взялась эта цифра.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню