Как поменять это уравнение? - PullRequest
0 голосов
/ 11 декабря 2018

Следующая строка кода находится внутри цикла for, где j увеличивается, а ansString представляет собой строку символов ASCII, например 000\Qg$M!*P000\gQYA+ h000\M|$skd 000\Qo}plsd000\.

ansString[j] = ((char)(paramString[j] >> j % 8 ^ paramString[j]));

У меня возникли проблемыс выяснением, как получить XOR и все другие операторы, чтобы найти paramString.Ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если j - текущий индекс, вы будете знать величину сдвига в каждой итерации.При этом вы можете найти префикс и расшифровать строку.

например, для j = 2 (0..7 - битовые позиции, двойные цифры - биты XOR, x - 0):

Original:   0  1  2  3  4  5  6  7
Shifted:    x  x  0  1  2  3  4  5
Encrypted:  0  1 02 13 24 35 46 57 

Как видите, первые 2 цифры остаются нетронутыми.И эти 2 цифры используются для шифрования следующих двух и т. Д.

Таким образом, для дешифрования с j = 2 вы найдете двухзначный префикс в незашифрованном виде.Это может использоваться для дешифрования следующих 2 бит (02 и 13):

Encrypted:  0  1 02 13 24 35 46 57 
Shift-Mask: x  x  0  1  x  x  x  x
Temp1:      0  1  2  3 24 35 46 57

Теперь мы знаем первые 4 цифры, а также биты дешифрования для следующих 2:

Temp1:      0  1  2  3 24 35 46 57
Shift-Mask: x  x  x  x  2  3  x  x
Temp2:      0  1  2  3  4  5 46 57

И снова:

Temp2:       0  1  2  3  4  5 46 57
Shift-Mask3: x  x  x  x  x  x  4  5
Decrypted3:  0  1  2  3  4  5  6  7 <- Original string

На основе этой идеи вы можете построить алгоритм расшифровки

0 голосов
/ 11 декабря 2018

Правое смещение битов (>>) и по модулю (%) являются необратимыми операциями:

В случае правильного смещения битов потерянные биты теряются, поэтому при обращении a >> b вы получите 2 ^ bразличные возможные результаты.

Для оператора по модулю в x % 8 = y есть 32 возможных значения для x, предполагая, что его максимальная длина составляет 8 бит.(Это будет каждый x * 8 + y, который умещается в 8 битах)

Операция xor является единственной обратимой.Если у вас есть

a ^ b = c

, тогда

c ^ b = a

Таким образом, для более чем одного входа у вас будет одинаковый выход.Например, давайте рассмотрим случай, когда j = 0

j % 8 = 0 % 8 = 0

paramString[j] >> (j % 8) = paramString[0] >> 0 = paramString[0]

paramString[0] ^ paramString[j] = paramString[0] ^ paramString[0] = 0

Это означает, что для вашего первого символа и каждого восьмого последующего символа (это каждый символ, индекс которого j кратен 8, поэтому j % 8 = 0) результат будет равен 0, в зависимости от того, каким был исходный символ (как вы можете видеть в выходной строке вашего примера).

Вот почему, даже если вы переборщили все возможные входные данные (всего 256 *n возможных строк ввода (длина строки n), вы никогда не можете быть уверены в том, что было исходным входом, так как многие входы дают одинаковый результат.

...