2013-12-11 3 views
0

Я рассмотрел некоторые примеры XOR и не смог найти ответ.Способ вокруг моего XOR Шифрование, требующий размер открытого текста

Это код, я использую для PHP:

for($i=0;$i<strlen($text);) 
{ 
    for($j=0;($j<strlen($key) && $i<strlen($text));$j++,$i++) 
    { 
     $outText .= $text{$i}^$key{$j}; 
     //echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging 
    } 
} 

И полученный код дешифровки в C++:

for (int i = 0; i < original.size();) 
{ 
    for (int j = 0; (j < key.size() && i < original.size()); j++, i++) 
    { 
     decrypted += encrypted[i]^key[j]; 
    } 
} 

У меня возникли проблемы при получении вокруг необходимости открытого текста ых size (std :: string original в этом случае).

Без, мы надеемся, кардинально изменим способ, которым я выполняю алгоритм, есть ли способ обойти это?

Заранее благодарен!

+1

Поскольку шифрование XOR выполняется на границах octect/byte, len (input) = len (output) - или что-то не так. – user2864740

+1

Обычный старый C++ будет делать то, что вы сказали, но я ожидаю, что PHP может подумать, что он лучше знает, что вы имели в виду. Если действительно 'len (input)! = Len (output)', то я бы ожидал, что PHP делает некоторые преобразования кодировки (однобайтовые для некоторого unicode, возможно?) –

ответ

2

Зашифрованный текст и открытый текст имеют одинаковую длину. Так что любой размер будет делать.

Вам также не нужны два уровня петлевого гнезда для этого в PHP или C++.

Ваш код должен выглядеть следующим образом:

$textlen = strlen($text); 
$keylen = strlen($key); 
for ($i = 0; $i < $textlen; $i++) 
{ 
    $outText .= chr(ord($text{$i})^ord ($key{$i % $keylen})); 
} 

Я ответил на другой вопрос о шифровании XOR here,, так как он, кажется, весь гнев в эти дни.

BTW, если вы попытаетесь вернуть этот код PHP обратно на C++, имейте в виду, что (в отличие от PHP) strlen останавливается в NULS ASCII и не будет делать то, что вы хотите. Вам лучше использовать либо std::string, либо vector<char> для версии C++. (См. Ссылку выше для моего кода на C++.)

+0

Не совсем уверен, как я этого не заметил, ну, теперь я по крайней мере, лучше понять это! Спасибо за ответ! – Jon

Смежные вопросы