在NETMF上加密,在.NET上解密

时间:2012-01-25 09:35:37

标签: .net encryption .net-micro-framework

我试图使用博客文章Encryption Compatibility Between .NET Micro Framework and the Full .NET Framework中的代码在NETMF上使用XTEA加密。微框架上使用的代码如下。

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 Web服务。但是,我无法解密。我尝试了几种情况,但.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 long和key 8 long进行编码,现在两个系统上的结果相同。数据为“01234567”,键为“0x081632”,结果为base64“2BwR4Xe2sIk =”。

1 个答案:

答案 0 :(得分:1)

我使用加密方法的复制/粘贴创建了一个新的.NET微框架v4.1控制台应用程序。

在同一个解决方案中,我添加了一个新的.NET 4.0测试项目,它引用了博客中的示例Key_TinyEncryptionAlgorithm类。我使用了加密方法2BwR4Xe2sIk=中返回的值,并将其用作单元测试的测试数据,该测试将字符串成功解密回01234567

我认为你的传输机制导致了这个问题。线路上的消息正在被修改,因此到达您服务的内容并不等同于离开设备的内容。

也许只是一个典型的序列化问题......

所有x86和机器都是小端的。 .NET Micro Framework模拟器通过SystemInfo.IsBigEndian报告模拟环境也是小端的。

虽然通过网络以big-endian顺序传输数据是很常见的。如果要反转接收端的字节,以下方法应该为您翻转顺序。我将它放入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