【问题标题】:Encrypting on NETMF, decrypting on .NET在 NETMF 上加密,在 .NET 上解密
【发布时间】:2012-01-25 09:35:37
【问题描述】:

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

【问题讨论】:

  • 你能告诉我们:1)解密代码2)最短的message你会发现出错了,a)消息本身,b)base64传输的数据,c)它是什么解密为。这会有所帮助。
  • 在 .NetMF 上加密的任何消息都与在 .Net 上类似的加密代码不同(所以 2b 和 2c 无关紧要)。
  • 我仍然认为显示由八个空格组成的消息的加密输出会有所帮助(因为根据链接代码,我们至少需要八个字节)。以及该输出解密的内容。

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


【解决方案1】:

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

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

我认为是您的传输机制导致了问题。网络上的消息正在被修改,因此到达您服务的信息与离开设备的信息不同。

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

所有 x86 和机器都是 little-endian。 .NET Micro Framework 模拟器通过 SystemInfo.IsBigEndian 报告模拟环境也是 little-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

【讨论】:

  • 谢谢。下周我的同事回来了,所以我可以和他讨论这个问题。感谢您的尝试。我会回来提供任何新结果。
  • 我还不能测试新代码,但我很确定这可以解决手头的问题,所以接受了。
猜你喜欢
  • 1970-01-01
  • 2019-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多