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

在NETMF上加密,在.NET上解密,.net,encryption,.net-micro-framework,.net,Encryption,.net Micro 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_TinyEncryptionAl

我试图使用博客文章中的代码在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长的数据和8长的键进行编码,现在两个系统上的结果是相同的。数据为“01234567”,密钥为“0x081632”,base64“2BwR4Xe2sIk=”之后的结果。

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

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

我想是你的运输机制造成了这个问题。通过有线传输的信息正在被修改,因此到达您的服务的内容与离开设备的内容并不相等

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

所有x86和机器都是little endian。.NET Micro Framework emulator通过
SystemInfo.IsBigEndian
报告模拟环境也是little-endian

不过,在网络上以大端顺序传输数据是很常见的。如果要反转接收端上的字节,则以下方法应为您翻转顺序。我把这个放进了KeyTinyEncryptionalGorithm类

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;
}
生成此输出

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

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


你能给我们看一下:1)解密代码2)对于最短的
消息
,你可以发现它出错了,a)消息本身,b)base64传输的数据,c)它解密到什么。这会有帮助。在.NetMF上加密的任何消息都不同于.Net上类似的加密代码(因此2b和2c无关紧要)。我仍然认为,显示由八个空格组成的消息的加密输出会有所帮助(因为根据链接的代码,我们至少需要八个字节)。以及输出的解密结果。谢谢。下周我的同事回来了,所以我可以和他讨论这个问题。谢谢你的努力。我会得到任何新的结果。我还没有能够测试新的代码,但我确信这解决了手头的问题,所以被接受。
Console.WriteLine(BitConverter.ToString(m));
m = Key_TinyEncryptionAlgorithm.ReverseBytes(m);
Console.WriteLine(BitConverter.ToString(m));