perlでシーザー暗号

/ Perl / Comment[0]
LPICの赤本についてきたiStudy LEのqdfファイルを開いてみたらSGML形式でした
$ file 117-201.qdf
117-201.qdf: exported SGML document, Non-ISO extended-ASCII text, with very long lines, with CRLF, NEL line terminators

エンコードしなおして開いてみると
$ nkf 117-201.qdf
:
<urnq>
<fglyr>
obql { sbag-fvmr: 11cg }
gq { sbag-fvmr: 11cg }
</fglyr>
</urnq>
<obql gbcznetva="1" yrsgznetva="1">
<!-- DF -->
惱昊羂晧竊ぎYvahkセーレヌぎワーエトンを嗄腱ぷみつ溲插、ぽぎYvahkェォュチ溘ぇ區えつてフケゴヌを朮淅べれぐよつぇべに。匱珱蜚か纐うくぞるフケゴヌ貍を姚殯ぷうはむふつ。<oe>
<oe>
<cer>
--------------------------
png /cebp/____________
--------------------------
</cer>
<oe>
<!-- DR -->
</obql>
:
どこか法則が見いだせそうな文字列ですね。
ぱっと見た瞬間にシーザーなんじゃないかなと思いました。根拠としては同じ文字の羅列の出現率です。
例えば”yrsgznetva”という文字列はファイル中に248個あります。
$ grep -c yrsgznetva 117-201.qdf
248

とりあえずシフトしてみた
$text = <STDIN>;
foreach $shift ( 1..25 ) {
print "$_:\t", caesar( $text, $shift );
}

sub caesar {
($text, $shift) = @_;
$table = 'abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz';
$strings = substr($table, $shift, length($table)/2);
$_ = $text;
eval "tr/$table/$strings/";
return $_;
}

1:	zsthaofuwb
2: atuibpgvxc
3: buvjcqhwyd
4: cvwkdrixze
5: dwxlesjyaf
6: exymftkzbg
7: fyzngulach
8: gzaohvmbdi
9: habpiwncej
10: ibcqjxodfk
11: jcdrkypegl
12: kdeslzqfhm
13: leftmargin
14: mfgunbshjo
15: nghvoctikp
16: ohiwpdujlq
17: pijxqevkmr
18: qjkyrfwlns
19: rklzsgxmot
20: slmathynpu
21: tmnbuizoqv
22: unocvjaprw
23: vopdwkbqsx
24: wpqexlcrty
25: xqrfymdsuz

13シフト:leftmargin明らかに読める文字が出現しました。
英数字は13シフトで平文、句読点や記号の場合はそのままのようです。
全角の部分もこんな感じにシフトすれば解読できそうな気がしますが面倒なのでやめておきます。

関連記事

コメント

:
:
:
:
:
管理人のみ表示を許可