/ / XOR дешифриране на две низове от чист текст - java, криптиране, двоичен, xor

XOR дешифриране на две низове от незабележим текст - java, криптиране, двоичен, xor

Бях назначен в моя клас Java Java за декриптиране на следното: umzDlBF8aFix

със следния ключ: oE2dpffzEiFD

Единственият проблем е, че не знам как да направя XOR, за да ги декриптирам. Аз стигнах до превръщането им в двоичен:

ключ: 101000 | 000100 | 110110 | 011101 | 101001 | 011111 | 110011 | 000100 | 100010 | 000101 | 000011

ciphertext: 110110 | 100110 | 110011 | 100101 | 000001 | 111100 | 011010 | 000101 | 100011 | 110001

но не знам какво да правя с това. Ако можеш да ми помогнеш с това, това би било чудесно! Кодът също би бил хубав, но не е нужен.

Благодаря милион!

Отговори:

0 за отговор № 1

Не е необходимо да ги превръщате в двоични. XOR е битова операция, така че можете да XOR два байта заедно и ще бъде като XORing всеки бит от един байт със съответния бит на другия байт.

Просто напишете цикъл от нула до (и изключвайки)дължината на шифъра, в която четете всеки символ от шифъра, XOR го със съответния символ от ключа и добавяте резултата към StringBuilder. След това извикайте .toString() на StringBuilder, за да получите вашия резултат.

Ако вашият компилатор се оплаква, че не може да XOR символи, след това подайте всеки char до a byte, изпълнете XOR между байтовете и след това хвърлете резултата на a char.

Най- String класът има charAt() метод, който ви позволява да получите персонаж от aспецифичен индекс в низ. Като алтернатива можете да започнете с получаване на съдържанието на всеки низ като char масив. (Има още една функция за това.)

Като бонус можете да го направите така, че ключът да го направине трябва да е със същата дължина като шифъра. Можете да поддържате отделни символи за адресиране на индекса на шифъра и когато този индекс достигне дължината на шифъра, можете да го върнете обратно на нула, като по този начин започнете да четете шифъра отначало.


0 за отговор № 2

Операторът XOR има свойството, че T XOR KXOR K == T, така че ако искате да шифровате открит текст T с ключ K, приложите операцията C = T XOR K и за да декриптирате текста, просто трябва отново да приложите същата операция (T = C XOR K). Можете да приложите операцията XOR към всеки байт в безпроблемния текст, като използвате loop или функционална карта за програмиране.

EDIT: в случай, че имате нужда, операторът XOR в езиците за програмиране е представен от символа "^", така че A ^ B означава A XOR B.

EDIT2: просто доказателство, че T XOR K XOR K == T, просто така, че не трябва да го приемате като магия:

  • K XOR K ясно е равно на 0
  • T XOR 0 ясно е равно на T
  • Тъй като операторът XOR е асоциативен заедно с двоични числа, можем да запишем T XOR K XOR K като T XOR (K XOR K) == T XOR 0 == T

0 за отговор № 3

Както отбелязват другите, „xor“ е прекрасенмеханизъм за криптиране, защото криптирането и декриптирането са точно една и съща операция. Ако използвате всяка част от ключа само веднъж, имате възможно най-сигурния алгоритъм за криптиране.

Ако използвате повторно някоя част от ключа, той се превръща в един от най-лошите механизми за криптиране, защото това го прави лесно да се напука.

Проблемът, който имате тук, е - как вървитеот символите до стойността, която искате да шифровате. Можете да вземете символните стойности на Unicode, но ще получите фалшиви резултати с вашия шифротекст и ключ. Проблемът с използването на Unicode като е също е, че можете да получите непринтируеми символи след криптиране / дешифриране, което обикновено не е проблем, но в примери за учебник е трудно да се отпечатват непринтируеми знаци.

За да дешифрирам вашия текст, направих предположението, че преводът на герои работи така.

  • A - Z => 0 - 25
  • a - z => 26 - 51
  • 0 - 9 => 52 - 61

(Не трябваше да предполагам какво би било 62/63, но място и точка биха били добри предположения).

Използвайки това предположение и xor, вземам вашия шифротекст umzDlBF8aFix и вашия ключ oE2dpffzEiFD и завършвам с очевидния текст GiFeMeaPenny.

Тъй като това е четим английски - "Дай ми стотинка"- изглежда, че предположенията по-горе са правдоподобни.