【发布时间】:2011-01-27 20:34:31
【问题描述】:
我一直致力于将 C++ 加密方法转换为 C#。问题是,我无法让它按照我想要的方式加密/解密。
这个想法很简单,我捕获一个数据包,然后解密它。输出将是: 数据包大小 - 命令/操作 - 空(结束)
(解密器将前两个字节截掉)
C++ 代码是这样的:
// Crypt the packet with Xor operator
void cryptPacket(char *packet)
{
unsigned short paksize=(*((unsigned short*)&packet[0])) - 2;
for(int i=2; i<paksize; i++)
{
packet[i] = 0x61 ^ packet[i];
}
}
所以我认为如果我不想使用指针,这将在 C# 中工作:
public static char[] CryptPacket(char[] packet)
{
ushort paksize = (ushort) (packet.Length - 2);
for(int i=2; i<paksize; i++)
{
packet[i] = (char) (0x61 ^ packet[i]);
}
return packet;
}
-但它不是,返回的值只是另一行 rubish 而不是解密的值。给出的输出是:..O♦&/OOOe。
嗯.. 至少 '/' 出于某种原因在正确的位置。
更多信息:
- 我使用的测试包是这样的:
十六进制值:0C 00 E2 66 65 47 4E 09 04 13 65 00
纯文本:...feGN...e.
解密:XX/hereXX
X = 未知值,我不记得了,但没关系。
- 使用 Hex Workshop,您可以通过以下方式解密数据包:
- Special 将十六进制值粘贴为 CF_TEXT,确保选中“视为十六进制值”框。
- 然后,从您刚刚粘贴的十六进制值中选择所有内容,除了第一个和最后 2 个字节。
- 转到工具>操作>异或。
- 选择“将数据视为 8 位数据”并将值设置为“61”。
- 按“确定”,您就完成了。
这就是我目前所能提供的所有信息,因为我是在脑海中写下这些。
感谢您的宝贵时间。
如果您在此没有看到问题:
如果有人可以查看代码以了解其中有什么问题,或者是否有其他方法可以做到这一点,那就太好了。我正在转换这段代码,因为我不喜欢 C++,并且想用该代码创建一个 C# 应用程序。
Ps:代码标签之类的东西很痛苦,所以如果间距等有点混乱,我很抱歉。
【问题讨论】:
-
您只需将所有内容缩进 4 个空格,以指示 markdown 将其格式化为代码。您还可以选择整个代码块,然后单击工具栏中的“代码”按钮(带有花括号的那个)。它不应该像看起来那么困难。
-
这不是一个非常复杂的加密(XORing 每个字节与一个固定的常数)。事实上,它基本上与例如没有什么不同。烂13!使用 ASCII 图表(例如asciitable.com)作为参考,单步执行并查看它为什么不起作用应该非常简单。您已经从调试器和跟踪语句中学到了什么?
-
@Cody 这就是我所做的,但是标签出现在不同的地方,所以我尝试剪切/粘贴标签,但后来它们弄乱了一些行。 sigh @Oli 我了解到它按指示工作,但未按预期工作..
-
@Nick:当您逐步完成循环时,
packet[i]的每个值是您所期望的吗?每次异或运算的结果是否符合您的预期? -
正如 Massif 下面所说,使用
byte而不是char。此外,使用ushort代替int来代替paksize并没有太大的好处。
标签: c# c++ encryption xor