Lably
Skip to content

Qrpff

  • 3 min read
  • 1 chapters

Related on Lably

Through Algorithm

In fact, two versions of qrpff exist: a short version (6 lines) and a fast version (7 lines). Both appear below.

Short:

<span id="mwEw"></span><span class="ch" id="mwFA">#!/usr/bin/perl</span> <span class="c1" id="mwFQ"># 472-byte qrpff, Keith Winstein and Marc Horowitz <[email protected]></span> <span class="c1" id="mwFg"># MPEG 2 PS VOB file -> descrambled output on stdout.</span> <span class="c1" id="mwFw"># usage: perl -I <k1>:<k2>:<k3>:<k4>:<k5> qrpff</span> <span class="c1" id="mwGA"># where k1..k5 are the title key bytes in least to most-significant order</span> <span class="n" id="mwGQ">s</span><span class="s" id="mwGg">''</span><span class="vg" id="mwGw">$/</span><span class="o" id="mwHA">=\</span><span class="mi" id="mwHQ">2048</span><span class="p" id="mwHg">;</span><span class="k" id="mwHw">while</span><span class="p" id="mwIA">(</span><span class="o" id="mwIQ"><></span><span class="p" id="mwIg">){</span><span class="n" id="mwIw">G</span><span class="o" id="mwJA">=</span><span class="mi" id="mwJQ">29</span><span class="p" id="mwJg">;</span><span class="n" id="mwJw">R</span><span class="o" id="mwKA">=</span><span class="mi" id="mwKQ">142</span><span class="p" id="mwKg">;</span><span class="k" id="mwKw">if</span><span class="p" id="mwLA">((</span><span class="nv" id="mwLQ">@a</span><span class="o" id="mwLg">=</span><span class="n" id="mwLw">unqT</span><span class="o" id="mwMA">=</span><span class="s" id="mwMQ">"C*"</span><span class="p" id="mwMg">,</span><span class="n" id="mwMw">_</span><span class="p" id="mwNA">)[</span><span class="mi" id="mwNQ">20</span><span class="p" id="mwNg">]</span><span class="o" id="mwNw">&</span><span class="mi" id="mwOA">48</span><span class="p" id="mwOQ">){</span><span class="n" id="mwOg">D</span><span class="o" id="mwOw">=</span><span class="mi" id="mwPA">89</span><span class="p" id="mwPQ">;</span><span class="n" id="mwPg">_</span><span class="o" id="mwPw">=</span><span class="n" id="mwQA">unqb24</span><span class="p" id="mwQQ">,</span><span class="n" id="mwQg">qT</span><span class="p" id="mwQw">,</span><span class="nv" id="mwRA">@</span> <span class="nv" id="mwRQ">b</span><span class="o" id="mwRg">=</span><span class="nb" id="mwRw">map</span><span class="p" id="mwSA">{</span><span class="nb" id="mwSQ">ord</span><span class="w" id="mwSg"> </span><span class="n" id="mwSw">qB8</span><span class="p" id="mwTA">,</span><span class="n" id="mwTQ">unqb8</span><span class="p" id="mwTg">,</span><span class="n" id="mwTw">qT</span><span class="p" id="mwUA">,</span><span class="n" id="mwUQ">_</span><span class="o" id="mwUg">^</span><span class="nv" id="mwUw">$a</span><span class="p" id="mwVA">[</span><span class="o" id="mwVQ">--</span><span class="n" id="mwVg">D</span><span class="p" id="mwVw">]}</span><span class="nv" id="mwWA">@INC</span><span class="p" id="mwWQ">;</span><span class="sr" id="mwWg">s/...$/1$&/</span><span class="p" id="mwWw">;</span><span class="n" id="mwXA">Q</span><span class="o" id="mwXQ">=</span><span class="n" id="mwXg">unqV</span><span class="p" id="mwXw">,</span><span class="n" id="mwYA">qb25</span><span class="p" id="mwYQ">,</span><span class="n" id="mwYg">_</span><span class="p" id="mwYw">;</span><span class="n" id="mwZA">H</span><span class="o" id="mwZQ">=</span><span class="mi" id="mwZg">73</span><span class="p" id="mwZw">;</span><span class="n" id="mwaA">O</span><span class="o" id="mwaQ">=</span><span class="nv" id="mwag">$b</span><span class="p" id="mwaw">[</span><span class="mi" id="mwbA">4</span><span class="p" id="mwbQ">]</span><span class="o" id="mwbg"><<</span><span class="mi" id="mwbw">9</span> <span class="o" id="mwcA">|</span><span class="mi" id="mwcQ">256</span><span class="o" id="mwcg">|</span><span class="nv" id="mwcw">$b</span><span class="p" id="mwdA">[</span><span class="mi" id="mwdQ">3</span><span class="p" id="mwdg">];</span><span class="n" id="mwdw">Q</span><span class="o" id="mweA">=</span><span class="n" id="mweQ">Q</span><span class="o" id="mweg">>></span><span class="mi" id="mwew">8</span><span class="o" id="mwfA">^</span><span class="p" id="mwfQ">(</span><span class="n" id="mwfg">P</span><span class="o" id="mwfw">=</span><span class="p" id="mwgA">(</span><span class="n" id="mwgQ">E</span><span class="o" id="mwgg">=</span><span class="mi" id="mwgw">255</span><span class="p" id="mwhA">)</span><span class="o" id="mwhQ">&</span><span class="p" id="mwhg">(</span><span class="n" id="mwhw">Q</span><span class="o" id="mwiA">>></span><span class="mi" id="mwiQ">12</span><span class="o" id="mwig">^</span><span class="n" id="mwiw">Q</span><span class="o" id="mwjA">>></span><span class="mi" id="mwjQ">4</span><span class="o" id="mwjg">^</span><span class="n" id="mwjw">Q</span><span class="o" id="mwkA">/</span><span class="mi" id="mwkQ">8</span><span class="o" id="mwkg">^</span><span class="n" id="mwkw">Q</span><span class="p" id="mwlA">))</span><span class="sr" id="mwlQ"><<17,O=O></span><span class="o" id="mwlg">></span><span class="mi" id="mwlw">8</span><span class="o" id="mwmA">^</span><span class="p" id="mwmQ">(</span><span class="n" id="mwmg">E</span><span class="o" id="mwmw">&</span><span class="p" id="mwnA">(</span><span class="n" id="mwnQ">F</span><span class="o" id="mwng">=</span><span class="p" id="mwnw">(</span><span class="n" id="mwoA">S</span><span class="o" id="mwoQ">=</span><span class="n" id="mwog">O</span><span class="o" id="mwow">>></span><span class="mi" id="mwpA">14</span><span class="o" id="mwpQ">&</span><span class="mi" id="mwpg">7</span><span class="o" id="mwpw">^</span><span class="n" id="mwqA">O</span><span class="p" id="mwqQ">)</span> <span class="o" id="mwqg">^</span><span class="n" id="mwqw">S</span><span class="o" id="mwrA">*</span><span class="mi" id="mwrQ">8</span><span class="o" id="mwrg">^</span><span class="n" id="mwrw">S</span><span class="o" id="mwsA"><<</span><span class="mi" id="mwsQ">6</span><span class="p" id="mwsg">))</span><span class="o" id="mwsw"><<</span><span class="mi" id="mwtA">9</span><span class="p" id="mwtQ">,</span><span class="n" id="mwtg">_</span><span class="o" id="mwtw">=</span><span class="p" id="mwuA">(</span><span class="nb" id="mwuQ">map</span><span class="p" id="mwug">{</span><span class="n" id="mwuw">U</span><span class="o" id="mwvA">=</span><span class="n" id="mwvQ">_</span><span class="nv" id="mwvg">%16orE</span><span class="o" id="mwvw">^=</span><span class="n" id="mwwA">R</span><span class="o" id="mwwQ">^=</span><span class="mi" id="mwwg">110</span><span class="o" id="mwww">&</span><span class="p" id="mwxA">(</span><span class="n" id="mwxQ">S</span><span class="o" id="mwxg">=</span><span class="p" id="mwxw">(</span><span class="n" id="mwyA">unqT</span><span class="p" id="mwyQ">,</span><span class="s" id="mwyg">"\xb\ntd\xbz\x14d"</span><span class="p" id="mwyw">)[</span><span class="n" id="mwzA">_</span><span class="o" id="mwzQ">/</span><span class="mi" id="mwzg">16</span><span class="nv" id="mwzw">%8</span><span class="p" id="mw0A">]);</span><span class="n" id="mw0Q">E</span> <span class="o" id="mw0g">^=</span><span class="p" id="mw0w">(</span><span class="mi" id="mw1A">72</span><span class="p" id="mw1Q">,</span><span class="nv" id="mw1g">@z</span><span class="o" id="mw1w">=</span><span class="p" id="mw2A">(</span><span class="mi" id="mw2Q">64</span><span class="p" id="mw2g">,</span><span class="mi" id="mw2w">72</span><span class="p" id="mw3A">,</span><span class="n" id="mw3Q">G</span><span class="o" id="mw3g">^=</span><span class="mi" id="mw3w">12</span><span class="o" id="mw4A">*</span><span class="p" id="mw4Q">(</span><span class="n" id="mw4g">U</span><span class="o" id="mw4w">-</span><span class="mi" id="mw5A">2</span><span class="p" id="mw5Q">?</span><span class="mi" id="mw5g">0</span><span class="p" id="mw5w">:</span><span class="n" id="mw6A">S</span><span class="o" id="mw6Q">&</span><span class="mi" id="mw6g">17</span><span class="p" id="mw6w">)),</span><span class="n" id="mw7A">H</span><span class="o" id="mw7Q">^=</span><span class="n" id="mw7g">_</span><span class="nv" id="mw7w">%64</span><span class="p" id="mw8A">?</span><span class="mi" id="mw8Q">12</span><span class="p" id="mw8g">:</span><span class="mi" id="mw8w">0</span><span class="p" id="mw9A">,</span><span class="nv" id="mw9Q">@z</span><span class="p" id="mw9g">)[</span><span class="n" id="mw9w">_</span><span class="nv" id="mw-A">%8</span><span class="p" id="mw-Q">]}(</span><span class="mi" id="mw-g">16</span><span class="o" id="mw-w">..</span><span class="mi" id="mw_A">271</span><span class="p" id="mw_Q">))[</span><span class="n" id="mw_g">_</span><span class="p" id="mw_w">]</span><span class="o" id="mwAQA">^</span><span class="p" id="mwAQE">((</span><span class="n" id="mwAQI">D</span><span class="o" id="mwAQM">>>=</span><span class="mi" id="mwAQQ">8</span> <span class="p" id="mwAQU">)</span><span class="o" id="mwAQY">+=</span><span class="n" id="mwAQc">P</span><span class="o" id="mwAQg">+</span><span class="p" id="mwAQk">(</span><span class="o" id="mwAQo">~</span><span class="n" id="mwAQs">F</span><span class="o" id="mwAQw">&</span><span class="n" id="mwAQ0">E</span><span class="p" id="mwAQ4">))</span><span class="k" id="mwAQ8">for</span><span class="nv" id="mwARA">@a</span><span class="p" id="mwARE">[</span><span class="mi" id="mwARI">128</span><span class="o" id="mwARM">..</span><span class="nv" id="mwARQ">$#a</span><span class="p" id="mwARU">]}</span><span class="k" id="mwARY">print</span><span class="o" id="mwARc">+</span><span class="n" id="mwARg">qT</span><span class="p" id="mwARk">,</span><span class="nv" id="mwARo">@a</span><span class="p" id="mwARs">}</span><span class="err" id="mwARw">'</span><span class="p" id="mwAR0">;</span><span class="sr" id="mwAR4">s/[D-HO-U_]/\$$&/g</span><span class="p" id="mwAR8">;</span><span class="sr" id="mwASA">s/q/pack+/g</span><span class="p" id="mwASE">;</span><span class="nb" id="mwASI">eval</span>

Fast:

<span id="mwASY"></span><span class="ch" id="mwASc">#!/usr/bin/perl -w</span> <span class="c1" id="mwASg"># 531-byte qrpff-fast, Keith Winstein and Marc Horowitz <[email protected]></span> <span class="c1" id="mwASk"># MPEG 2 PS VOB file on stdin -> descrambled output on stdout</span> <span class="c1" id="mwASo"># arguments: title key bytes in least to most-significant order</span> <span class="nv" id="mwASs">$_</span><span class="o" id="mwASw">=</span><span class="s" id="mwAS0">'while(read+STDIN,$_,2048){$a=29;$b=73;$c=142;$t=255;@t=map{$_%16or$t^=$c^=(</span> <span class="s" id="mwAS4">$m=(11,10,116,100,11,122,20,100)[$_/16%8])&110;$t^=(72,@z=(64,72,$a^=12*($_%16</span> <span class="s" id="mwAS8">-2?0:$m&17)),$b^=$_%64?12:0,@z)[$_%8]}(16..271);if((@a=unx"C*",$_)[20]&48){$h</span> <span class="s" id="mwATA">=5;$_=unxb24,join"",@b=map{xB8,unxb8,chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$</span> <span class="s" id="mwATE">d=unxV,xb25,$_;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=$t&($d>>12^$d>>4^</span> <span class="s" id="mwATI">$d^$d/8))<<17,$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9,$_=$t[$_]^</span> <span class="s" id="mwATM">(($h>>=8)+=$f+(~$g&$t))for@a[128..$#a]}print+x"C*",@a}'</span><span class="p" id="mwATQ">;</span><span class="sr" id="mwATU">s/x/pack+/g</span><span class="p" id="mwATY">;</span><span class="nb" id="mwATc">eval</span>

The fast version is actually fast enough to decode a movie in real-time.

qrpff and related memorabilia was sold for $2,500 at The Algorithm Auction, the world's first auction of computer algorithms.

More in Economics