Почему xor результаты разные, 0 становится 1 - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу создать программу, подобную следующей: pic1 enter image description here

, и это мой код

<?php

 $iv = 0;
 $Kunci = "U";

 $key =  dechex(ord($Kunci));
 $k =  sprintf("%08d",decbin(hexdec($key)));

 $c0 = sprintf("%08d", decbin($iv));
 $Cip= "0C52CCD7EDB3";
 $Cbs = array();
 $Cbs[0]= $c0;

 $Plaintext = array();
 $Cas = array();
 $P = array();  
 $m= 1;
 $n=1;

//$Cbs= 
$Csplit = str_split($Cip, 2);
$Cas= str_split($Cip,2);

        for ($i=0; $i<count($Csplit); $i++) { 

            $Cbs[$m] = sprintf("%08d",decbin(hexdec($Csplit[$i])));
            $m++;

        }



        for($i=0; $i < count($Cas); $i++){
            $Cas[$i] = sprintf("%08d",decbin(hexdec($Cas[$i])));
            $Cas[$i]=bindec($Cas[$i])>>1;
            if($Cas[$i] % 2 <> 0)$Cas[$i]+=128;
            $Cas[$i]=sprintf("%08d", decbin($Cas[$i]));

        }


 foreach($Cas as $cas_item) {
$prev_c = $Cbs[$n-1];    

$P[$n] = _xor($cas_item, $k);

 $P[$n] = _xor($P[$n], $prev_c);


$Plaintext[$n] = chr(bindec($P[$n]));

 $n++; 
 }

function _xor($text,$key){
for($i=0; $i<strlen($text); $i++){
  $text[$i] = intval($text[$i])^intval($key[$i]);

}
  return $text;
}

print_r($Csplit);
echo "<br/>";
print_r($Cbs);
echo "<br/>";
print_r($Cas);
echo "<br/>";
print_r($P);
echo "<br/>";
print_r($Plaintext);

?>

Cbs = до сменного бина Cas = после сменного бина, и это выходит, программный код работает, но массив 2 и массив 5 неверны. двоичный двоичный код впереди должен быть 0, а не 1. Вывод: enter image description here

массив 2 должен быть 01110000 вместо 11110000, а массив 5 должен быть 01110100, но результат равен 11110100. почему 0 перед 1?

1 Ответ

1 голос
/ 21 апреля 2020

При смещении вправо остерегайтесь разницы между знаковым и беззнаковым смещением. (также называемое арифметическим c или логическим сдвигом)

8-битное значение 11101000 со смещением вправо и со знаком будет 11110100.

Дело в том, что если вы смещаете значение со знаком вправо, самый старший бит дублируется в новые движущиеся биты. Если вы сдвигаете значения без знака, самые верхние биты перемещаются в нули.

Языки, в которых отсутствуют целочисленные типы данных без знака, имеют еще один оператор сдвига вправо >>>, указывающий, что подразумевается беззнаковый (или «логический») сдвиг. Это имеет место в PHP и в Java.

Это относится только к сдвигам вправо. Никогда не уйти. Дело в том, что сдвиг вправо приведет к поведению деления на два.

...