だいこんの日々2

軸足をtwitterとfacebookに移しつつも、技術的な話はここに書いていきます。

DVDの解読プログラム

#!/usr/bin/perl -w
# 526-byte qrpff Keith Winstein and Marc Horowitz
# MPEG 2 PS VOB file on stdin -> descrambled output on stdout
# arguments: title key bytes in least to most-significant order
$_='while(read+STDIN$_2048){$a=29;$c=142;if>8^($f=($t=255)&($d>>12^$d>>4^$d^$d/8">*1<<17$e=$e>>8^($t&($g=($q=$e>>14&7^$e)^$q*8^$q<<6))<<9
$_=(map{$_%16or$t^=$c^=($m=(11101161001112220100)[$_/16%8])&110;$t
^=(72@z=(6472$a^=12*($_%16-2?0:$m&17))$b^=$_%64?12:0@z)[$_%8]}(16..271))
[$_]^*2for@a[128..$#a]}print+x"C*"@a}';s/x/pack+/g;eval

たった7行のPerlコードで解読できるなんて・・・。
DVDの暗号が脆いのはいいとして、Perlのすごさに恐れ入りました。
昔、MSX-FANで1画面プログラムとかあったけど、それを思い出しました。
3Dのレーシングゲームとかあったよなぁ・・・。全部マシン語だったけど。

*1:@a=unx"C*"$_)[20]&48){$h=5;
$_=unxb24join""@b=map{xB8unxb8chr($_^$a[--$h+84])}@ARGV;s/...$/1$&/;$d=
unxVxb25$_;$b=73;$e=256|(ord$b[4])<<9|ord$b[3];$d=$d>>8^($f=($t=255)&($d
>>12^$d>>4^$d^$d/8

*2:$h>>=8)+=$f+(~$g&$t