Криптономикон

22
18
20
22
24
26
28
30

Рэнди надевает пиджак и галстук. Годятся любые предлоги, чтобы оттянуть время, поэтому он проверяет почту.

Кому: [email protected]

От: [email protected]

Тема: Трансформация «Понтифик», как обещано

Рэнди.

Разумеется, Вы правы — как немцы убедились на горьком опыте, ни одной криптосистеме нельзя доверять, пока она не обнародована, чтобы люди вроде Ваших друзей попытались ее взломать. Буду очень признателен, если Вы сделаете это с «Понтификом».

В «Понтифик» заложены некоторые асимметрии и особые операторы выбора, которые трудно выразить в нескольких элегантных математических строчках. Он почти просится, чтобы его записали псевдокодом. Но зачем сочинять псевдо, если можно написать настоящий? Ниже прилагается программа «Понтифика» на языке Perl. Переменная $D содержит 54-элементную перестановку. Подпрограмма е генерирует следующий элемент ключевого потока, изменяя этим $D.

#!/usr/bin/perl — s

$f=$d? — 1:1;$D=pack(‘C*’.33..86);$p=shift;

$p=~y/a-z/A-Z/;$U=’$D=~s/(.*)U$/U$1/;

$D=~s/U(.)/$1U/;’;($V=$U)=~s/U/V/g;

$p=~s/[A-Z]/$k=ord($&)-64,&e/eg;$k=0;

while(<>){y/a-z/A-Z/; y/A-Z//dc;$o.=$_}$o.=’X’

while length ($o)%5&&!$d;

$o=~s/./chr(($f*&e+ord($&)-l3)%26+65)/eg;

$o=~s/X*$// if $d;$o=~s/.{5}/$& /g;

print"$o "; sub v{$v=ord(substr($D,$_[0]))-32;

$v>53?53:$v}

sub w{$D=~s/(.{$_[0]})(.*)(.)/$2$1$3/}

sub e{eval"$U$V$V";$D=~s/(.*)([UV].*[UV])(.*)/$3$2$l/;