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
European CommissionExecutive branch of the European UnionThe EconomistBritish news and current affairs journalTertiary sectorService sectorEconomistProfessional in the discipline of economicsSecondary sectorManufacturing and construction industriesEconomic developmentProcess and policies to improve economic well-being

