看了一上午没找出来的算法错误

kafly 2011-06-21 11:32:16

byte[] aArr = { 113, 76, 155, 186, 152, 127, 248, 183 };
byte[] bArr = new byte[8];

byte[] key = { 0, 0, 0, 0, 0, 0, 0, 0 };


for (int i = 0; i < 8; i++)
{
if (i > 0)
{
key[i % 8] = (byte)(key[i % 8] + aArr[i - 1] ^ (byte)i);
bArr[i] = (byte)(aArr[i] - aArr[i - 1] ^ key[i % 8]);
}
else
{
bArr[i] = (byte)(aArr[i] ^ key[0]);
}
}

Log(aArr, " aArr ");
Log(bArr, " bArr ");

key = new byte[8];

for (int i = 0; i < 8; i++)
{
if (i > 0)
{
key[i % 8] = (byte)((aArr[i] - bArr[i]) ^ aArr[i - 1]);
key[i % 8] = (byte)(key[i % 8] - aArr[i - 1] ^ (byte)i);
}
else
{
key[0] = (byte)(aArr[i] ^ bArr[i]);
}
}
Log(key, "CalcKey");



输出结果:
[ aArr ] 71 4C 9B BA 98 7F F8 B7
[ bArr ] 71 AB 01 87 60 7A 00 40
[CalcKey] 00 5E 88 0E CC 00 0E 90


为什么逆推出来的Key不是8个0呢~~ 100分求教

...全文
249 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
csproj 2011-06-21
  • 打赏
  • 举报
回复
好像byte默认无符号,sbyte才是有符号

和int uint正好相反
kafly 2011-06-21
  • 打赏
  • 举报
回复
天哪,我搞错运算顺序。+-在前,异或在后
kafly 2011-06-21
  • 打赏
  • 举报
回复
re: 看看反算时,aArr[i] - bArr[i]是个整体

运算符号优先顺序我应该没搞错`

看起来问题应该是出在负数上,但又没一点头绪,正算时不是也有负数情况么

减运算符结果 -1 转到 byte 是不是变成了 255

kafly 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bdmh 的回复:]
bArr[i] = (byte)(aArr[i] - aArr[i - 1] ^ key[i % 8]);
正算时,aArr[i] - bArr[i]是分开的

key[i % 8] = (byte)((aArr[i] - bArr[i]) ^ aArr[i - 1]);
看看反算时,aArr[i] - bArr[i]是个整体

而且你这个运算过程中,又出现负数的情况,byte是整数,……
[/Quote]

谢谢bdmh指导


学校的东西忘光了,负数情况要如何处理?
bdmh 2011-06-21
  • 打赏
  • 举报
回复
bArr[i] = (byte)(aArr[i] - aArr[i - 1] ^ key[i % 8]);
正算时,aArr[i] - bArr[i]是分开的

key[i % 8] = (byte)((aArr[i] - bArr[i]) ^ aArr[i - 1]);
看看反算时,aArr[i] - bArr[i]是个整体

而且你这个运算过程中,又出现负数的情况,byte是整数,没有负数,所以你这个要考虑
tashiwoweiyi 2011-06-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 jshzp 的回复:]
使用f10单步调试,很容易找到问题所在.
[/Quote]

确实。
jshzp 2011-06-21
  • 打赏
  • 举报
回复
使用f10单步调试,很容易找到问题所在.
kafly 2011-06-21
  • 打赏
  • 举报
回复
已解决,不用考虑负数情况



byte[] aArr = { 113, 76, 155, 186, 152, 127, 248, 183 };
byte[] bArr = new byte[8];

byte[] key = { 0, 0, 0, 0, 0, 0, 0, 0 };


for (int i = 0; i < 8; i++)
{
if (i > 0)
{
key[i % 8] = (byte)(key[i % 8] + aArr[i - 1] ^ (byte)i);
bArr[i] = (byte)(aArr[i] - aArr[i - 1] ^ key[i % 8]);
}
else
{
bArr[i] = (byte)(aArr[i] ^ key[0]);
}
}

Log(aArr, " aArr ");
Log(bArr, " bArr ");
Log(key, " Key ");

key = new byte[8];

for (int i = 0; i < 8; i++)
{
if (i > 0)
{
key[i % 8] = (byte)(aArr[i] - aArr[i - 1] ^ bArr[i]);
key[i % 8] = (byte)((byte)(key[i % 8] ^ (byte)i) - aArr[i - 1]);
}
else
{
key[0] = (byte)(aArr[i] ^ bArr[i]);
}
}
Log(key, "CalcKey");


[2011-6-21 12:22:25]:[ aArr ] 71 4C 9B BA 98 7F F8 B7
[2011-6-21 12:22:25]:[ bArr ] 71 AB 01 87 60 7A 00 40
[2011-6-21 12:22:25]:[ Key ] 00 70 4E 98 BE 9D 79 FF
[2011-6-21 12:22:25]:[CalcKey] 00 00 00 00 00 00 00 00


CSDN这个设置不好,,,自己不能编辑和回帖。。可以了,结帖`

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧