もっともこっそり
xxxxxxxxxx
#include<stdio.h>
typedef unsigned int _;_ d,b,
#define i(I1,Il,lI)if(Il){lI;}else{I1;}
I[256], n,y,a,r,u,k,o
,L,l[ 256],O,K[
/**/ #define\
q(g) g char\
*C, *Q,c[\
]= "KfW"\
"" "Ww|"\
/* 'UU!\
% NYA!\
*/ "Z}"\
";fRo?JtJaV<x4@*?R?&JV1" ".s"\
"{Fyj2_;khB1xQ5oxm~mS@B|(pa>oRU" "Ro"\
"nB}h@o?)d.X)NSTIUCz7@%",*s[]={c,"#en" "di"\
"f/*}||1;\n__DATA__\40*/\n\n#ifndef\40q\n#d" "ef"\
"ine\x20q\n#include<stdio.h>\ntypedef\40unsign" "e"\
"d\x20int\x20_;_\x20K[]={\n#include\40__FILE__\n#u" "n"\
"def q","0},L,O,l[256],I[256],n,y,a,r,u,k,o;"#g"char" "*"\
"S,s[]=\"",c,c,"\";int main(){X();for(S=s+*K;*S>37;){for" "(o"\
"=0;o<5;o++)r=r*85+(83+*S++)%89;r","^=*x();for(o=0;o<4;o++" ")"\
"{s[O++]=r&255;r>>=8;}}return!fwrite(s,O-*S%5,1,stdout);}\n" "#"\
"endif",c},S[256]="#ifdef/*\n'true'\40or\40q{\nexec\40head\40" "-"\
"8\40$0\n};for(open$O,$0;<$O>;print\40if$f){$f|=/^$/;}q{*/q",/* */z;
256];q(_*x(){if(!L--){y+=++a;for(o=0;o<256;y=l[o++]=I[255&(k>>10 )]+u
){n^=(o&1)?n>>(( o& 2)?16:6):n<<((o&2)?2:13);u=I[o];k=I[o]=I[255& (u>>
2)]+(n+=I[(o+128) & 255]) +y;}L=255;}return&l[L];}_*X(){for(O=0 ;256
>O;I[O++]=0);for(O = 0; sizeof(K)/sizeof( _)> O;O++)I[O&255] ^=K[
O];for(n=y=a=L=O=0 ;O<1<<24;++ O)x( );r=O=0x0; return&O;})int/*^^*/ main
(int p,char**P){FILE* Z=fopen(p> (+ 1)?P[01 ] :"/dev/urandom", "rb"
);i(;,Z,O=fread(K,256 ,4,Z);/*P */ fclose(Z))X();for(p=b=d =O=
0;O<256;K[O++]=0)*K=+ 86;for(O =1;12> O;K[O++]=*x());X(); for
(C=Q=S;r-8;){i(*C++=34, (r-4&&r -5)||C- S ,;)z=Q[p++];i(;,z !=
32||r-3,i(i(C+=sprintf(( C), "%uU" ",",K[b++]);i(d=1;C =S
;i(d=02,b-12,;),b%6,;),r-1 ,i(b= fread(c,1,4,stdin);i (p
=O=0,b,for(d=O=0;O<04;O++)d +=(c[O]&255)<<(8*O);d ^=
*x();for(p=5;p;c[--p]=O<32?O+ 95:O+6){O=d%85;d/=85;} O=
5)i(d=0,b<4,c[O++]=b?b-1?b-2?36: 37:33:35 ;d=2)c[O]=0,r-4,i(i (d= 2
|d,C!=S+6,*C++=(*x()%34)+93;p--),r -5,*s= C;d|=2) )),z ,i(*C++ =92 ,
z-63||C [-1]-63||C>S+76,;)*C++=z))i( ;,d>1,d= d-2 ;Q=s[r] ;i( ;
,r<3|| r>5,d=1;i(;,r-1, *C=0)C=S) i(;, r-4, p=0)++ r) i(*(C++ )=
34,r <4||r>5|| C<S+ 78,;)i (*C++=0;d=1; C=S ,r<3 || r>
5 ||C<S+ 79,; )i(;,d, puts (
S); d=0 )} return
0;}
引用元:https://www.ioccc.org/2012/omoikane/nyaruko.c
審査員・作者による説明:https://www.ioccc.org/2012/omoikane/hint.html
入力データを暗号化するツール。
“Hello, world!”を暗号化する。
$ gcc -o nyaruko nyaruko.c
$ echo "Hello, world!" | ./nyaruko
#ifdef/*
'true' or q{
exec head -8 $0
};for(open$O,$0;<$O>;print if$f){$f|=/^$/;}q{*/q
86U,790209315U,1074616390U,4163682830U,1210174169U,3105916746U,
425026959U,2820849411U,9834884U,2559977918U,973842364U,1231255554U,
#endif/*}||1;
__DATA__ */
#ifndef q
#define q
#include<stdio.h>
typedef unsigned int _;_ K[]={
#include __FILE__
#undef q
0},L,O,l[256],I[256],n,y,a,r,u,k,o;_*x(){if(!L--){y+=++a;for(o=0;o<256;y=l[o++]
=I[255&(k>>10)]+u){n^=(o&1)?n>>((o&2)?16:6):n<<((o&2)?2:13);u=I[o];k=I[o]=I[255
&(u>>2)]+(n+=I[(o+128)&255])+y;}L=255;}return&l[L];}_*X(){for(O=0;256>O;I[O++]=
0);for(O=0;sizeof(K)/sizeof(_)>O;O++)I[O&255]^=K[O];for(n=y=a=L=O=0;O<1<<24;++O
)x();r=O=0x0;return&O;}char*S,s[]="KfWWw|Z};fRo?JtJaV<x4@*?R?&JV1.s{Fyj2_;khB1"
"xQ5oxm~mS@B|(pa>oRURonB}h@o?)d.X)NSTIUCz7@%z*0wS*bRReOv(i-/RFPc%tnjnulyaqnxec"
"x_lu`";int main(){X();for(S=s+*K;*S>37;){for(o=0;o<5;o++)r=r*85+(83+*S++)%89;r
^=*x();for(o=0;o<4;o++){s[O++]=r&255;r>>=8;}}return!fwrite(s,O-*S%5,1,stdout);}
#endif
コードのようなものが出てきて、これに元テキストが暗号化されている。 空行の前半がキーで、後半がデータ。 エディタで切り分けてもよいが、次のようにするとキーとデータが取り出せるようになっている。
$ echo "Hello, world!" | ./nyaruko > output.c
$ bash output.c > key.c
$ perl output.c > data.c
復号するには、key.cとdata.cを結合してコンパイル・実行する。 結合順序はどちらでも良い。
$ cat data.c key.c > decode.c
$ gcc -o decode decode.c
$ ./decode
Hello, world!
なお、data.cは単体で実行できるが、その場合はダミーのメッセージが出てくる。
$ gcc -o data data.c
$ ./data
The chaos that always crawls up to you with a smile, Nyarlathotep
また、nyarukoの第1引数にシードファイルを与えることで、動作を決定的にできる(指定しない場合/dev/urandomを使用する)。
任意の入力データを80カラムのテキストに変換する。特徴は次の通り。
元ファイルの形状は『這いよれ! ニャル子さん』のキャラクター、ニャル子。 クトゥルフ神話を元ネタとしたライトノベルで、ニャル子はニャルラトホテプとなっている。
ニャルラトホテプは「這い寄る混沌 (The Crawling Chaos)」と呼ばれる。 混沌といえば乱数生成器。 乱数生成器といえばワンタイムパッド暗号化、とのこと。
data.c単体で実行したときのメッセージはニャル子のキャッチフレーズ「いつもニコニコあなたの隣に這いよる混沌、ニャルラトホテプ、です!」の英訳。
spoiler.html.gzが添付されており、開くと開発の様子のスクリーンキャストが再生される。 一旦きれいなコードで書いてから、難読化してアスキーアート化するまで3時間半の動画。 一発でアスキーアートに収まるとは思えないので、実際の編集を録画しただけのものなのかは真偽不明だが、単純に面白い。 こういう形式でネタバレが添付された事例は初。
IOCCCは匿名審査だが、作風から作者は明らか(アニメキャラのコード形状や、プログラムをキャラ名で呼ぶ作者コメントなど)なので、それでも採択されるのは採択せざるを得ないクオリティであるということで、これをコンスタントに出せるのはすごい。