шифрование текст

fiberaxe

Новичок
Приветствую... в общем возникла кое-какая проблема в шифровании текста.
Принцип шифрования следующий:
Берется первый символ текста который надо зашифровать, берется первый символ ключа, с помощью функции ord() я получаю аски коды этих символов, затем их складываю и получаю аски код нового символа, который я на экран я и вывожу.Знаю, что этот принцип оригинальностью не блещет, но все же...

Проблема в следующем...когда ключ состоит из одного символа, то весь текст шифруется легко, как только там больше одного символа текст шифруется не правильно (получается больше символов чем надо и тп...)А мне нужно чтобы ключ мог состоять из нескольких символов

Собственно сам скрипт:
PHP:
<?php
$cryptkey = 'я'; //ключ
if ($_SERVER['REQUEST_METHOD']=='POST') {
    $cryptstring = $_POST['cryptstring'];
    $length = strlen($cryptstring);
    $count = 0;
    $i = 0;

        while ($count<$length) {
            while ($i< strlen($cryptkey)) {
                $ascii=ord($cryptkey[$i]);
                $ascii2 = ord($cryptstring[$count]);
                $wtecho = $ascii+$ascii2;
                echo chr($wtecho);
                $i++;
                         }
            $i = 0;
        $count++;}
    }
?>

<form method="POST">
<input type="text" name="cryptstring" />
<input type="submit" />
</form>
Заранее спасибо
 

Вурдалак

Продвинутый новичок
Но при таком алгоритме стойкость не будет зависеть от длины ключа (достаточно угадать одно из 256-ти значений). Если нужно что-то простое, то используй XOR-шифрование.
 

fiberaxe

Новичок
тут смысл не в том что я хочу защитить текст от кого-то, или то, что это не надежное шифрование, а в том что я не могу написать скрипт)
 

Вурдалак

Продвинутый новичок
Тогда вычисли сумму ASCII кодов «ключа» заранее и прибавляй к каждому символу исходного сообщения.

По-индусски:
PHP:
$x = array_map('ord', str_split($cryptkey));
$sum = array_sum($x);
$encrypted = implode(array_map(function($c) use ($sum) { return chr($c + $sum);  }, str_split($cryptstring)));
Но я повторюсь: это глупый алгоритм.
 

fiberaxe

Новичок
Возможно он и глупый, но с высшей математикой я плохо знаком, поэтому довольствуюсь тем что есть, спасибо.
 

fixxxer

К.О.
Партнер клуба
Замени сложение на xor и всё ;) ну еще по смещению можно дополнительно.

Я сегодня что то добрый, даже код дам тупой, валяется тут.

PHP:
    function xor($s, $secret) {
        $mask = (crc32($secret) % 256);
        $len = strlen($s);
        for ($i=0; $i<$len; ++$i) {
            $s{$i} = chr(ord($s{$i}) ^ $mask ^ (~$i));
        }
        return $s;
    }
 

antson

Новичок
Партнер клуба
Код Цезаря.
Битовый хор или сложение по модулю 256 символов ключа и текста.
Криптоскойкость низкая.
Проблема с нултерминайтед стринг, т.е. в зашифрованном тексте могут появиться значимые chr(0) в середине строки.
Взламывается частотным анализом. Также слабое место повторящиеся подряд символы текста.
Н-р
--------------------------------------------------------------------
выделенный отбивкой
-------------------------------------------------------------------
сразу вычисляется длина ключа, да и вариантов остается всего несколько (пробел, chr(0), - , * , =)
 

fixxxer

К.О.
Партнер клуба
Именно :) Цель таких "шифров" - примитивная обфускация, не более.
 
Сверху