Шифрование в NETMF, дешифрование в .NET - PullRequest
2 голосов
/ 25 января 2012

Я пытался использовать шифрование XTEA в NETMF с использованием кода из сообщения в блоге Совместимость шифрования между .NET Micro Framework и полной .NET Framework . Код, используемый на микро-фреймворке, следующий.

public static string Encrypt(string message)
{
    var key = "0x081632";
    var data = Encoding.UTF8.GetBytes(message);
    var xteaKey = Encoding.UTF8.GetBytes(key);
    var xtea = new Key_TinyEncryptionAlgorithm(xteaKey);
    var encryptedBytes = xtea.Encrypt(data, 0, data.Length, xteaKey);
    var encryptedString = ConvertBase64.ToBase64String(encryptedBytes);
    return encryptedString;
}

Результат Base64 отправляется веб-службе Azure. Однако я не могу расшифровать это. Я пробовал несколько ситуаций, но код .NET возвращает разные результаты для одного и того же ключа и сообщения в .NET и NETMF.

Есть ли решение для этой ситуации или любая другая схема шифрования, которую я могу использовать? Я предпочитаю не использовать RSA, так как это может сильно повлиять на производительность в NETMF.

Код расшифровки.

var k = Encoding.UTF8.GetBytes("0x081632");
message = message.Replace("!", "+").Replace("*", "/"); // base64 on .netmf is different
var m = Convert.FromBase64String(message);
var xteaNet = new Key_TinyEncryptionAlgorithm(k); // class from blog
var decBytes = xteaNet.Decrypt(m, 0, m.Length, k);
var decString = Encoding.UTF8.GetString(decBytes);

Это может быть небольшая / большая разница порядка байтов, но я не уверен, какие части кода нужно было бы изменить, чтобы учесть это.

Для тестирования я попытался закодировать данные длиной 8 и длиной ключа 8, и теперь результат в обеих системах одинаков. Данные "01234567", ключ "0x081632", результат после base64 "2BwR4Xe2sIk =".

1 Ответ

1 голос
/ 04 февраля 2012

Я создал новое консольное приложение .NET micro Framework v4.1, используя копирование / вставку метода шифрования.

В том же решении я добавил новый тестовый проект .NET 4.0, который ссылался на образецКласс Key_TinyEncryptionAlgorithm из блога.Я использовал возвращаемое значение из метода Encrypt 2BwR4Xe2sIk=, и оно использовалось в качестве тестовых данных для модульного теста, который успешно расшифровал строку обратно в 01234567.

Я предполагаю, что ваш транспортный механизм вызывает проблему.Сообщение по проводам изменяется, и то, что приходит к вам на службу, не эквивалентно тому, что осталось от устройства.

Возможно, просто классическая проблема сериализации ...

Все x86 и машины имеют младший порядок.Эмулятор .NET Micro Framework сообщает через SystemInfo.IsBigEndian, что эмулируемая среда также имеет порядок с прямым порядком байтов.

Однако обычно данные передаются по сети в порядке с прямым порядком байтов.Если вы хотите обратить байты на приемном конце, следующий метод должен перевернуть заказ для вас.Я помещаю это в класс Key_TinyEncryptionAlgorithm.

private static byte[] ReverseBytes(byte[] inArray)
{
  byte temp;
  int highCtr = inArray.Length - 1;

  for (int ctr = 0; ctr < inArray.Length / 2; ctr++)
  {
      temp = inArray[ctr];
      inArray[ctr] = inArray[highCtr];
      inArray[highCtr] = temp;
      highCtr -= 1;
   }
   return inArray;
}

И использование в методе расшифровки.

Console.WriteLine(BitConverter.ToString(m));
m = Key_TinyEncryptionAlgorithm.ReverseBytes(m);
Console.WriteLine(BitConverter.ToString(m));

Производит этот вывод

D8-1C-11-E1-77-B6-B0-89

89-B0-B6-77-E1-11-1C-D8

...