【发布时间】:2021-11-03 23:50:39
【问题描述】:
我有这个功能可以解密一些东西。我想是某种密码反馈模式。
数组的第一个元素0 被异或并左移0xB
然后所有数组元素左移:
-
1变成0,
-
2 变成 1,
-
3 变成 2。
接下来是一些 XOR 操作,结果变成 Array 中的新元素 4。
等等。
uint Some_function(uint *Array) // *Array pointer to 4*4 bytes array
{
uint Temp_1;
uint Temp_2;
Temp_1 = *Array ^ *Array << 0xb; // Temp_1 = XOR Array[0],Array[0] LSL 0xB (multiply by 0x800)
*Array = Array[1]; // Move Array[1] to Array[0]
Array[1] = Array[2]; // Move Array[2] to Array[1]
Temp_2 = Array[3]; // Load Array[3] into Temp_2
Array[2] = Temp_2; // Move Array[3] to Array[2]
Temp_1 = Temp_2 ^ Temp_2 >> 0x13 ^ Temp_1 ^ Temp_1 >> 8; // Temp_1 = Temp_2 XOR (Temp_2 LSR 0x13) XOR Temp_1 XOR (Temp_1 LSR 0x8)
Array[3] = Temp_1; // Move Temp_1 to Array[3]
return Temp_1;
}
对于解密工作正常,但我不明白如何加密。
我有(我认为是 IV)用于加密,
开头是
array[] = {0x5E9094CA, 0xB2E34CBD, 0xF9ED0B7C, 0x577C17C1}
在第一步之后变成
array[] = {0x10BF5970, 0x5E9094CA, 0xB2E34CBD, 0xF9ED0B7C}
我想我必须对Array[3]做点什么
Move Array[2] to Array[3]
Move Array[1] to Array[2]
Move Array[0] to Array[1]
用Array[3] 和Array[2] 或Array[1] 的结果做点什么?然后将结果放入Array[0]?
听起来很简单,但我看不懂。
我是个新手,所以请简单解释一下这个函数的反函数是什么。
更新
我用这个代码
unsafe public uint Enc(ref uint[] Array)
{
uint[] TempArray;
TempArray = new uint[4];
uint current;
//uint Temp_1; not used
uint Temp_2;
uint term_0;
uint term_1;
uint term_2;
uint term_3;
uint shifted_bits;
uint byteMask;
uint encryptedByteMask;
TempArray[1] = Array[0];
TempArray[2] = Array[1];
TempArray[3] = Array[2];
term_3 = Array[3];
Temp_2 = Array[2];
term_2 = Temp_2 ^ Temp_2 >> 0x13;
term_1 = term_3 ^ term_2;
// Array[0] 0xCA94905E
// Array[1] 0xBD4CE3B2
// Array[2] 0x7C0BEDF9
// Array[3] 0xC1177C57
// term_1 0xBD1C9E2F
// term_2 0x7C0BE278
current = term_1;
for (int byteIndex = sizeof(uint) - 1 - 1; byteIndex >= 0; byteIndex--)
{
byteMask = (uint)(0xFF << (byteIndex * 8) + 8); //added cast, cannot implicitly convert int to uint
encryptedByteMask = current & byteMask;
current = current ^ (encryptedByteMask >> 8);
}
// current = 0xBD1C9E2F BD^1C = A1
// current = 0xBDA19E2F A1^9E = 3F
// current = 0xBDA13F2F 3F^2F = 10
// current = 0xBDA13F10
term_0 = current;
uint eleven_bit_mask = (1 << 12) - 1;
uint current_0 = term_0; // current_0 because current already defined on that scope
for (int msbit = 11; msbit < sizeof(uint) * 8; msbit += 11)
{
shifted_bits = (current_0 & eleven_bit_mask) << 11;
current_0 = current_0 ^ shifted_bits;
eleven_bit_mask <<= 11;
}
//current_0 = 0x7019BF10 but expected was 0x7059BF10
TempArray[0] = current_0;
Array[0] = TempArray[0];
Array[1] = TempArray[1];
Array[2] = TempArray[2];
Array[3] = TempArray[3];
return TempArray[0];
}
但我没有得到预期的结果。 结果值为 0x7019BF10
更新 用解决方案替换 las 部分 Simplify the inverse of Z = X ^ (X << Y) function 现在好了。
【问题讨论】:
-
我认为 start 和 end 的值是翻转的。我假设 Some_function 方法正在加密,因为反函数更复杂,需要更多时间来执行。通常加密应该比解密更快 - 以快速保护秘密 - 并减慢暴力攻击。而且我认为 Some_function 至少被调用了 4 次,以便对过度给定的数组中的 4 个 uint 值进行正确加密。我的哪些假设是正确的?
-
Some_function 用于解密。在其他函数中,返回值与 4 字节加密数据进行异或运算,结果解密 4 字节。然后在下一次调用中解密另外 4 个字节的加密数据。解密部分的时间很重要,Some_function 被调用超过 10000 次。
标签: encryption reverse xor