Помогите разобраться!!! Алгоритм RC4

helloamigo

Новичок
Помогите разобраться!!! Алгоритм RC4

Всем привет!
Столкнулся с такой задачей! По заданному ключу надо расшифровать шифр текст!
Реализация на PHP, но результат желаемый не достигнут....
Что не так????????????
Помогите знанием, люди добрые =)))
код ниже:
PHP:
$key = $_POST['secretkey'];
$CONTENT =  $_POST['text'];
$ct = $CONTENT;


function rc4Encrypt($key, $pt) {
   $s = array();
   for ($i=0; $i<256; $i++) {
      $s[$i] = $i;
   }
   $j = 0;
   $x;
   for ($i=0; $i<256; $i++) {
      $j = ($j + $s[$i] + ord($key[$i % strlen($key)])) % 256;
      $x = $s[$i];
      $s[$i] = $s[$j];
      $s[$j] = $x;
   }
   $i = 0;
   $j = 0;
   $ct = '';
   $y;
   for ($y=0; $y<strlen($pt); $y++) {
      $i = ($i + 1) % 256;
      $j = ($j + $s[$i]) % 256;
      $x = $s[$i];
      $s[$i] = $s[$j];
      $s[$j] = $x;
      $ct .= $pt[$y] ^ chr($s[($s[$i] + $s[$j]) % 256]);
   }
   return $ct;
}


function rc4Decrypt($key, $ct) {
   return rc4Encrypt($key, $ct);
}


function bin2asc($in)
{ $out = ''; for ($i = 0, $len = strlen($in); $i < $len; $i += 8)
{ $out .= chr(bindec(substr($in,$i,8))); }
return $out; }






echo "
<html>
  <body>
    <head>
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
     <title>пример</title>
    </head>
<h1>Расшифровка шифр текста алгоритм RC4</h1><br>
<form method = 'post' action = '{$_SERVER['PHP_SELF']}'>
Введите секретный ключ: <input type='text' name='secretkey' value='231'>
<br><br><br>
Введите шифртекст:<br> <TEXTAREA NAME='text' ROWS=17 COLS=50>
45 9 8 29 15 26 20 225 243 216 14 209 162 176 152 139 110 83 80 95 42 204 235 163 205 179 151 110 68 86 28 209 219 178 130 124 83 78 32 218 132 100 96 223 25 208 203 148 231 119 204 164 255 107 197 188 147 172 244 49 110 3 157 225 203 105 194 199 31 235 96 156 7 214 0 62 121 106 204 254 38 181 70 142 165 183 255 37 236 33 77 129 98 25 247 142 121 84 242 216 96 248 244 21 7 173 123 159 165 203 85 50 52 60 42 169 94 238 171 17 15 229 210 255 218 117 33 90 100 31 127 20 149 121 42 103 253 144 248 197 251 160 239 72 188 111 88 251 17 120 91 195 58 248 55 60 6 5 168 42 68 137 143 27 85 12 193 32 173 238 65 66 19 158 254 27 7 185 226 196 175 147 142 132 56 160 15 58 102 244 212 76 151 43 180 117 200 176 222 248 34 86 238 226 146 64 13 25 205 58 177 180 122 186 58 89 116 138 254 230 222 50 210 129 234 22 35 38 120 227 43 94 219 156 132
</TEXTAREA><br>
<input type='submit' value='Дешифровать'>
</form>
</body>
</html>";


$data =     rc4Decrypt($key, $CONTENT);
echo bin2asc($data);
 

helloamigo

Новичок
Автор оригинала: fixxxer
а ты сам понимаешь что этот код делает?
С трудом... Понимал бы, не обращался за советом... Но знаю одно делает он примерно следующее (см здесь
) начала нет, но все равно смысл понятен)
 

AmdY

Пью пиво
Команда форума
напиши где именно у тебя ошибка, её помогут исправить. потому что без твоего желания сделать самому, тебе помогать не будут. а это пока больше походит на "сделйте вместо меня".
 

helloamigo

Новичок
так в этом и вопрос! Теоретически все должно работать... Но не работает...
Вот еще вариант:
PHP:
/**
 * Class RC4
 *
 * @category Crypt
 * @author   Rafael M. Salvioni
 */

/**
 * Class RC4
 *
 * Implements the encrypt algorithm RC4.
 *
 * @category Crypt
 * @author   Rafael M. Salvioni
 * @see      [url]http://pt.wikipedia.org/wiki/RC4[/url]
 */
class RC4
{
    /**
     * Store the permutation vectors
     *
     * @var array
     */
    private static $S = array();
    
    /**
     * Swaps values on the permutation vector.
     *
     * @param int $v1 Value 1
     * @param int $v2 Value 2
     */
    private static function swap(&$v1, &$v2)
    {
        $v1 = $v1 ^ $v2;
        $v2 = $v1 ^ $v2;
        $v1 = $v1 ^ $v2;
    }
    
    /**
     * Make, store and returns the permutation vector about the key.
     *
     * @param string $key Key
     * @return array
     */
    private static function KSA($key)
    {
        $idx = crc32($key);
        if (!isset(self::$S[$idx])) {
            $S   = range(0, 255);
            $j   = 0;
            $n   = strlen($key);
            for ($i = 0; $i < 255; $i++) {
                $char  = ord($key{$i % $n});
                $j     = ($j + $S[$i] + $char) % 256;
                self::swap($S[$i], $S[$j]);
            }
            self::$S[$idx] = $S;
        }
        return self::$S[$idx];
    }
    
    /**
     * Encrypt the data.
     *
     * @param string $key Key
     * @param string $data Data string
     * @return string
     */
    public static function encrypt($key, $data)
    {
        $S    = self::KSA($key);
        $n    = strlen($data);
        $i    = $j = 0;
        $data = str_split($data, 1);
        for ($m = 0; $m < $n; $m++) {
            $i        = ($i + 1) % 256;
            $j        = ($j + $S[$i]) % 256;
            self::swap($S[$i], $S[$j]);
            $char     = ord($data{$m});
            $char     = $S[($S[$i] + $S[$j]) % 256] ^ $char;
            $data[$m] = chr($char);
        }
        $data = implode('', $data);
        return $data;
    }
    
    /**
     * Decrypts the data.
     *
     * @param string $key Key
     * @param string $data Encripted data
     * @return string
     */
    public static function decrypt($key, $data)
    {
        return self::encrypt($key, $data);
    }
}

$key = $_POST['secretkey'];
$CONTENT =  $_POST['text'];
$ct = $CONTENT;




function bin2asc($in)
{ $out = ''; for ($i = 0, $len = strlen($in); $i < $len; $i += 8) 
{ $out .= chr(bindec(substr($in,$i,8))); } 
return $out; }






echo "
<html>
  <body>
    <head>
     <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
     <title>пример</title>
    </head>
<h1>Расшифровка шифр текста алгоритм RC4</h1><br>
<form method = 'post' action = '{$_SERVER['PHP_SELF']}'>
Введите секретный ключ: <input type='text' name='secretkey' value='231'>
<br><br><br>
Введите шифртекст:<br> <TEXTAREA NAME='text' ROWS=17 COLS=50>
45 9 8 29 15 26 20 225 243 216 14 209 162 176 152 139 110 83 80 95 42 204 235 163 205 179 151 110 68 86 28 209 219 178 130 124 83 78 32 218 132 100 96 223 25 208 203 148 231 119 204 164 255 107 197 188 147 172 244 49 110 3 157 225 203 105 194 199 31 235 96 156 7 214 0 62 121 106 204 254 38 181 70 142 165 183 255 37 236 33 77 129 98 25 247 142 121 84 242 216 96 248 244 21 7 173 123 159 165 203 85 50 52 60 42 169 94 238 171 17 15 229 210 255 218 117 33 90 100 31 127 20 149 121 42 103 253 144 248 197 251 160 239 72 188 111 88 251 17 120 91 195 58 248 55 60 6 5 168 42 68 137 143 27 85 12 193 32 173 238 65 66 19 158 254 27 7 185 226 196 175 147 142 132 56 160 15 58 102 244 212 76 151 43 180 117 200 176 222 248 34 86 238 226 146 64 13 25 205 58 177 180 122 186 58 89 116 138 254 230 222 50 210 129 234 22 35 38 120 227 43 94 219 156 132 
</TEXTAREA><br>
<input type='submit' value='Дешифровать'>
</form>
</body>
</html>";

/*

$data =     rc4Decrypt($key, $CONTENT);


echo bin2asc($data);
*/


$dcrypt = RC4::decrypt($key, $ct);
echo "$dcrypt";
p.s. Здесь больше похоже на правду...
 

fixxxer

К.О.
Партнер клуба
если предполагать, что код ты взял рабочий, то скорее всего ты его запускаешь на 64 битной платформе. запускай тогда на 32 битной)
 

fixxxer

К.О.
Партнер клуба
ну тогда разбирайся в алгоритме и отлаживай пошагово.
понимаю что непросто но думаю желающих это сделать за тебя тут не найдется.
 

helloamigo

Новичок
Автор оригинала: fixxxer
ну тогда разбирайся в алгоритме и отлаживай пошагово.
понимаю что непросто но думаю желающих это сделать за тебя тут не найдется.
В чем суть тогда форума???? Просто бесполезно сотрясать воздух в бесполезных высказываниях и суждениях! На мой взгляд, лучше оказать реальную помощь, чем писать нотации ( усилия прилагаемые одни и те же) но у последних кпд нулевой ;)

Вот все работает! Проблема решилась сама собой! =) запустите, не поленитесь =)
PHP:
class RC4
{
    
    private static $S = array();
    
    
    private static function swap(&$v1, &$v2)
    {
        $v1 = $v1 ^ $v2;
        $v2 = $v1 ^ $v2;
        $v1 = $v1 ^ $v2;
    }
    
  
    private static function KSA($key)
    {
        if (count(self::$S)==0) {
            self::$S = range(0, 255);
        }
        return self::$S;
    }
   
   
   
    public static function encrypt($key, $data)
    {
        $S    = self::KSA($key);
        $i    = 0;
	$j    = intval($key);
        $data = str_split($data, 1);
	$n    = count($data);

        for ($m = 0; $m < $n; $m++) {
            $i        = ($i + 1) % 256;
            $j        = ($j + $S[$i]) % 256;
            self::swap($S[$i], $S[$j]);
            $char     = ord($data[$m]);
            $char     = $S[($S[$i] + $S[$j]) % 256] ^ $char;
            $data[$m] = chr($char);
        }
        $data = implode('', $data);
        return $data;
    }
   
  
    public static function decrypt($key, $data)
    {
        return self::encrypt($key, $data);
    }

    public static function prepare($data) {
        $data = explode(" ", $data);
        $result = "";
        for ($i = 0; $i < count($data); $i++) {
            $result.=chr($data[$i]);
        }
        return $result;
    }
}


$key = $_POST['secretkey'];
$CONTENT =  $_POST['text'];
$ct = $CONTENT;




function bin2asc($in) {
  $out = '';
  for ($i = 0, $len = strlen($in); $i < $len; $i += 8) {
    $out .= chr(bindec(substr($in,$i,8)));
  } 
  return $out;
}






echo "
<html>
  <body>
    <head>
     <meta http-equiv='Content-Type' content='text/html; charset=windows-1251'>
     <title>пример</title>
    </head>
<h1>Расшифровка шифр текста алгоритм RC4</h1>
<form method = 'post' action = '{$_SERVER['PHP_SELF']}'>
Введите секретный ключ: <input type='text' name='secretkey' value='231'>
<br><br><br>
Введите шифртекст:<br> <TEXTAREA NAME='text' ROWS=17 COLS=50>
45 9 8 29 15 26 20 225 243 216 14 209 162 176 152 139 110 83 80 95 42 204 235 163 205 179 151 110 68 86 28 209 219 178 130 124 83 78 32 218 132 100 96 223 25 208 203 148 231 119 204 164 255 107 197 188 147 172 244 49 110 3 157 225 203 105 194 199 31 235 96 156 7 214 0 62 121 106 204 254 38 181 70 142 165 183 255 37 236 33 77 129 98 25 247 142 121 84 242 216 96 248 244 21 7 173 123 159 165 203 85 50 52 60 42 169 94 238 171 17 15 229 210 255 218 117 33 90 100 31 127 20 149 121 42 103 253 144 248 197 251 160 239 72 188 111 88 251 17 120 91 195 58 248 55 60 6 5 68 42 68 137 143 27 85 12 193 32 173 238 65 66 19 158 254 27 7 185 226 196 175 147 142 132 56 160 15 58 102 244 212 76 151 43 180 117 200 176 222 248 34 86 238 226 146 64 13 25 205 58 177 180 122 186 58 89 116 138 254 230 222 50 210 129 234 22 35 38 120 227 43 94 219 156 132
</TEXTAREA><br>
<input type='submit' value='Дешифровать'>
</form>
";


$dcrypt = RC4::decrypt($key, RC4::prepare($ct));
echo "
<h2>Результат:</h2>
$dcrypt
</body>
</html>";
 

x-yuri

Новичок
В чем суть тогда форума???? Просто бесполезно сотрясать воздух в бесполезных высказываниях и суждениях! На мой взгляд, лучше оказать реальную помощь, чем писать нотации ( усилия прилагаемые одни и те же) но у последних кпд нулевой ;)
как раз не нулевой, ты либо отлаживать научился, либо с алгоритмом разобрался (хотя есть еще вариант, что ты подогнал алгоритм под свои данные)
http://phpclub.ru/faq/WhyForum
 
Сверху