Синхропосылка:
Исходный текст:

=0;$i--){$N = base($N,$K32[$i]);} $N = substr($N,32).substr($N,0,32); return $N; } //цикл расшифрования function base_32r($N){ global $K32; for($i=0;$i<=7;$i++){$N = base($N,$K32[$i]);} for($k=1;$k<=3;$k++) for($i=7;$i>=0;$i--){ $N = base($N,$K32[$i]); } $N = substr($N,32).substr($N,0,32); return $N; } //цикл выработки имитовставки function base_16z($N){ for($k=1;$k<=2;$k++) for($i=0;$i<=7;$i++){ $N = base($N,$K32[$i]); } return $N; } // моя функция. для больших чисел function mod($a,$b=4294967296){ // 4294967296 == 2^32 while($c<$a){ $c_old=$c; $c+=$b; } return $a-$c_old; } // дополняем нулями function addzero($a,$b=4,$c=0){ // а - число которое дополняем, b - до скольки, с - слева=0/справа=1 while(strlen($a)<$b){ if(!$c){$a='0'.$a;}else{$a.='0';} } return $a; } //основной шаг криптопреобразования function base($N,$X){ /*N – преобразуемый 64-битовый блок данных, в ходе выполнения шага его младшая (N 1) и старшая (N 2) части обрабатываются как отдельные 32-битовые целые числа без знака. Таким образом, можно записать N=(N 1,N 2). X – 32-битовый элемент ключа;*/ $N = array(substr($N,0,32), substr($N,32)); $N[0] = base_convert($N[0],2,10); $X = base_convert($X,16,10); /* Шаг 1 Сложение с ключом. Младшая половина преобразуемого блока складывается по модулю 232 с используемым на шаге элементом ключа, результат передается на следующий шаг;*/ $tmp = mod(($N[0] + $X)); // , 4294967296 /* Шаг 2 Поблочная замена. 32-битовое значение, полученное на предыдущем шаге, интерпретируется как массив из восьми 4-битовых блоков кода: S=(S 0, S 1, S 2, S 3, S 4, S 5, S 6, S 7), причем S 0 содержит 4 самых младших, а S 7 – 4 самых старших бита S. Далее значение каждого из восьми блоков заменяется новым, которое выбирается по таблице замен следующим образом: значение блока Si меняется на Si -тый по порядку элемент (нумерация с нуля) i-того узла замены (т.е. i-той строки таблицы замен, нумерация также с нуля). Другими словами, в качестве замены для значения блока выбирается элемент из таблицы замен с номером строки, равным номеру заменяемого блока, и номером столбца, равным значению заменяемого блока как 4-битового целого неотрицательного числа. Отсюда становится понятным размер таблицы замен: число строк в ней равно числу 4-битовых элементов в 32-битовом блоке данных, то есть восьми, а число столбцов равно числу различных значений 4-битового блока данных, равному как известно 24, шестнадцати.*/ $tmp = base_convert($tmp,10,2); // дополняем нулями $tmp = addzero($tmp,32); $tmp = strrev($tmp); // чтобы получить обратный порядок в массиве $S = array(); for($i=0;$i<=7;$i++) $S[$i] = substr($tmp,4*$i,4); global $Sblock; // заменяем for($i=0;$i<=7;$i++){ $S[$i] = addzero( base_convert( $Sblock[$i][base_convert($S[$i],2,10)], 10, 2) ); } /* Шаг 3 Циклический сдвиг на 11 бит влево. Результат предыдущего шага сдвигается циклически на 11 бит в сторону старших разрядов и передается на следующий шаг. На схеме алгоритма символом обозначена функция циклического сдвига своего аргумента на 11 бит влево, т.е. в сторону старших разрядов.*/ $tmp = implode('', $S); // "сдвигаем" $S = substr($tmp,11).substr($tmp,0,11); /* Шаг 4 Побитовое сложение: значение, полученное на шаге 3, побитно складывается по модулю 2 со старшей половиной преобразуемого блока.*/ $tmp = ''; for($i=0;$i<32;$i++){ $tmp .= ($S[$i] + $N[1][$i]) % 2; } /* Шаг 5 Сдвиг по цепочке: младшая часть преобразуемого блока сдвигается на место старшей, а на ее место помещается результат выполнения предыдущего шага. */ $N = $tmp.addzero(base_convert($N[0],10,2), 32); /* Шаг 6 Полученное значение преобразуемого блока возвращается как результат выполнения алгоритма основного шага криптопреобразования.*/ return $N; } if(isset($_POST['go'])){ $text = $_POST['text']; echo "Длина исходного текста: ".strlen($text)."
"; // разбаваем текст на блоки по 8 байт $tmp_text = array(); while($pПростая замена:
"; $text = ''; $a = 0; while($a"; $text .= chr( base_convert( substr($cryptogram,$a,8), 2, 10) ); $a+=8; } echo $text; echo "
(длина: ".strlen($text).")"; echo "
"; // Расшифровываем! $text=''; $a = 0; while($a
Простая замена (расшифрованный):
"; $text=''; $a = 0; while($a"; $text .= chr( base_convert( substr($cryptogram,$a,8), 2, 10) ); $a+=8; } echo $text; echo "
(длина: ".strlen($text).")"; # Гамирование function gammirovanie($T,$S=false){ /* Шаг 0 Определяет исходные данные для основного шага криптопреобразования: T о(ш) – массив открытых (зашифрованных) данных произвольного размера, подвергаемый процедуре зашифрования (расшифрования), по ходу процедуры массив подвергается преобразованию порциями по 64 бита; S – синхропосылка , 64-битовый элемент данных, необходимый для инициализации генератора гаммы;*/ // разбаваем текст на блоки по 8 байт $tmp_text = array(); $p = 0; while($p"; /* Шаг 1 Начальное преобразование синхропосылки, выполняемое для ее «рандомизации», то есть для устранения статистических закономерностей, присутствующих в ней, результат используется как начальное заполнение РГПЧ;*/ // преобразуем в двоичное $tmp_text = ''; for($i=0;$i

Гаммирование, зашифрованный текст "; $T = gammirovanie($_POST['text'],$SS); echo "
"; // Перегоняем снова в текст! $text=''; $a = 0; while($a"; echo " длина: ".strlen($text); echo "
"; echo "
"; $T = $text; echo "
Гаммирование, расшифрованный текст "; $T = gammirovanie($T, $SS); echo "
"; // Перегоняем снова в текст! $text=''; $a = 0; while($a"; echo " длина: ".strlen($text); echo "
"; echo "
"; } ?>