能力值:
( LV2,RANK:10 )
|
-
-
2 楼
经过分析,该加密算法是可逆的,可以由密文解8次线性方程组逆推出明文。
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
帅哥能帮忙给个方向不!听不太懂,求大神解救
|
能力值:
( LV4,RANK:50 )
|
-
-
4 楼
最好能给出明确的算法,
data2[1] =
data1[1] xor (data2[1] + data2[1]) xor (data3[1] + data3[1]) xor data3[1] xor data4[1]
这个data1[1] 是第一步(data1[1] + data1[1]) xor data2[1] xor (data2[1] + data2[1]) xor data3[1] xor data4[1]
计算的结果呢?还是明文data1[1]。
如果是代码就直接贴代码好了
|
能力值:
( LV4,RANK:50 )
|
-
-
5 楼
若计算式是: Out[0] = (In[0] + In[0]) ^ In[1] ^ (In[1] + In[1]) ^ In[2] ^ In[3];
Out[1] = In[0] ^ (In[1] + In[1]) ^ (In[2] + In[2]) ^ In[2] ^ In[3];
Out[2] = In[0] ^ In[1] ^ (In[2] + In[2]) ^ (In[3] + In[3]) ^ In[3];
Out[3] = (In[0] + In[0]) ^ In[0] ^ In[1] ^ In[2] ^ (In[3] + In[3]);
那是可逆的,并且也可以计算
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
[QUOTE=lingyu;1224780]若计算式是: Out[0] = (In[0] + In[0]) ^ In[1] ^ (In[1] + In[1]) ^ In[2] ^ In[3];
Out[1] = In[0] ^ (In[1] + In[1]) ^ (In[2] + In[2]) ^ In[2] ^ In[...[/QUOTE]
帅哥有什么办法,教下!非常感激
|
能力值:
( LV4,RANK:50 )
|
-
-
7 楼
#include <stdio.h>
void Decode(const unsigned char *Out, unsigned char *In)
{
unsigned char data1 = 0;
unsigned char data2 = 0;
unsigned char data3 = 0;
unsigned char data4 = 0;
int i;
for(i = 0; i < 8; i ++)
{
data4 = Out[0] ^ Out[1] ^ Out[2] ^ (data1 + data1) ^ (data4 + data4);
data1 = Out[0] ^ Out[3] ^ (data2 + data2) ^ data4 ^ (data4 + data4);
data2 = Out[0] ^ Out[1] ^ (data1 + data1) ^ data1 ^ (data3 + data3);
data3 = Out[1] ^ Out[2] ^ (data2 + data2) ^ data2 ^ (data4 + data4);
}
In[0] = data1;
In[1] = data2;
In[2] = data3;
In[3] = data4;
return;
}
int main()
{
unsigned char In[4] = {0};//{0x63, 0x43, 0xc9, 0x55};
unsigned char Out[4] = {0};
Out[0] = 0x9f, Out[1] = 0xeb, Out[2] = 0x4d, Out[3] = 0x85;
Decode(Out, In);
printf("In[0] = %02x, ", In[0]);
printf("In[1] = %02x, ", In[1]);
printf("In[2] = %02x, ", In[2]);
printf("In[3] = %02x.\n", In[3]);
if( Out[0] == (unsigned char)((In[0] + In[0]) ^ In[1] ^ (In[1] + In[1]) ^ In[2] ^ In[3]) && \
Out[1] == (unsigned char)(In[0] ^ (In[1] + In[1]) ^ (In[2] + In[2]) ^ In[2] ^ In[3]) && \
Out[2] == (unsigned char)(In[0] ^ In[1] ^ (In[2] + In[2]) ^ (In[3] + In[3]) ^ In[3]) && \
Out[3] == (unsigned char)((In[0] + In[0]) ^ In[0] ^ In[1] ^ In[2] ^ (In[3] + In[3])) )
printf("Ok.\n");
else
printf("Err!!!\n");
printf("Out[0] = %02x, ", Out[0]);
printf("Out[1] = %02x, ", Out[1]);
printf("Out[2] = %02x, ", Out[2]);
printf("Out[3] = %02x.\n", Out[3]);
return 0;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
最好是给LZ讲讲简单的分析思路和解题原理,这样感觉更好。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
多谢大神,已经搞定了!
|
|
|