我试图使用博客文章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 =”。
答案 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