ROT13(またはROT-13)は、シーザー
暗号の一種で、アルファベットを13
文字分ずらす換字式
暗号です。例えば、AはNに、BはOに変換されます。この名前は「Rotate by 13 places」の略で、主にインターネットの掲示板やフォーラムで、冗談のオチやネタバレ情報を隠す目的で利用されます。ROT13の大きな特徴は、
暗号化と復号化に全く同じ処理を用いる点です。ただし、現代の
暗号技術から見ると、ROT13は実質的に「
暗号」とは言えないほど単純なものです。
概要
ROT13は、
1980年代初頭にUsenetで広く使われるようになり、事実上の標準となりました。
英語アルファベットの26
文字のちょうど半分である13
文字をずらすというシンプルな仕組みです。
暗号としては非常に脆弱で、アルファベット以外の
文字を変換することはできません。より広い範囲の
文字を扱うためには、他の
暗号化手法が必要です。
方法
ROT13は、テキスト中の各
文字を
アルファベット順に13
文字後の
文字に置き換えます。Zを超えた場合はAに戻って数えます。大
文字と小
文字は区別して変換されることが一般的です。例えば、aはnに、BはOに変換され、ZはMになります。数字や記号は変換されずにそのまま残されます。ラテンアルファベットは26
文字(2 × 13)なので、ROT13変換を2回行うと元のテキストに戻ります。つまり、ROT13を関数とみなすと、自分自身の逆関数となります。
ROT13(ROT13(x)) = ROT26(x) = x
この性質は数学では
対合と呼ばれます。
実装方法
ROT13は、ルックアップテーブルを用いることで簡単に実装できます。例えば、以下のようなテキストをROT13で変換すると:
How can you tell an extrovert from an
introvert at NSA? In the elevators,
the extroverts look at the OTHER guy's shoes.
このテキストは、ROT13によって以下のようになります。
Ubj pna lbh gryy na rkgebireg sebz na
vagebireg ng AFN? Va gur ryringbef,
gur rkgebiregf ybbx ng gur BGURE thl'f fubrf.
もう一度ROT13を適用すれば、元のテキストに戻ります。
歴史
ROT13は、
1980年代初めにネットニュースのグループnet.jokesで生まれました。一部の購読者にとって不快な
ジョークを隠したり、
ジョークのオチをうっかり読まれないようにするために、自発的に使われ始めました。当初、不快な
ジョークを特定のグループに隔離する試みもなされましたが、管理者によって却下されました。ROT13は、単純さゆえに有効な解決策となりました。
ROT13は、アルファベットのみを他のアルファベットに置き換えるため、ニュースリーダーで誤動作を引き起こすこともありませんでした。13という数字が選ばれたのは、エンコードとデコードを同じ方法で行える唯一の数だからです。これは、26
文字のアルファベットを持つ言語のみに有効です。例えば、ポーランド語のように26
文字を超える言語や、ハワイ語のように26
文字未満の言語では条件が異なります。
ROT13は手動でも実行できますが、コンピュータプログラムで行う方が便利です。
UNIXには`tr`というユーティリティがあり、これを使用すると簡単にROT13エンコードができます。
ニュースリーダーにはすぐに自動復号機能が組み込まれました。1990年代初めには
FidoNetのフォーラムでも使用されるようになり、
FidoNetのメールソフトにはROT13の自動
暗号化/復号化機能が搭載されるようになりました。
暗号技術としてのROT13
ROT13は、古典的な
暗号であるシーザー
暗号の一種です。しかし、セキュリティを求める場合には利用できません。固定のシフト値(13)を使用するため、鍵なしで簡単に解読できます。ROT13が使用されていることが分かれば、簡単に解読できます。また、ROT13が使われていることを知らなくても、頻度分析やパターン認識によって解読可能です。
ROT13の主な効果は、読者が自覚的に復号化操作を行わないと読めないようにすることです。情報の機密性を保護するのではなく、誤って内容が読まれることを防ぐためのものです。例えば、書籍や映画のネタバレ批評などに利用されます。
セキュリティ用途には不向きなため、ROT13は弱い
暗号の代名詞として使われます。「今日の56ビットDESはROT13と同程度」といった
表現もされます。「二重ROT13」や「ROT26」という用語も、ユーモラスな意味で使われます。贋学術論文の作成者まで現れました。ROT26は、アメリカの
デジタルミレニアム著作権法(DMCA)をからかうためにも使われました。例えば、「この
文章はROT26で
暗号化されています。回避操作は訴訟の対象となります」という警告文が用いられました。
豆知識
ROT13は、単語遊びの素材としても利用できます。変換後の単語が意味を持つことがあります。例えば、
英語では最長の例として、7
文字の「abjurer」と「nowhere」、「chechen」と「purpura」の組み合わせが知られています。また、ROT13変換で綴りが逆転する例もあり、「ravine」を変換すると「enivar」になります。意味は変わらないが、同義語になる例もあり、「vex」は「irk」になります。
1989年のInternational Obfuscated C Code Contest(国際難読化Cコードコンテスト)では、ROT13変換しても正常にコンパイルできるソースコードが受賞しました。さらに、生成されたオブジェクトコードはROT13変換または入力を逆順にするプログラムとして動作しました。
ニュースグループalt.folklore.urbanは、「furrfu」という単語を生み出しました。これは、よく使われる「sheesh」という言葉をROT13変換したものです。
変法
ROT13に似た方法として、ROT47やmemfrob()関数があります。
ROT47
ROT47はROT13の変種で、アルファベットだけでなく、数字や記号も変換します。ASCIIコードの範囲を広げ、!から~までの範囲を47
文字ずらします。これにより、ROT13よりもさらに読みにくくなります。例えば、先の例をROT47で変換すると:
w@H 42? J@F E6== 2? 6IEC@G6CE 7C@> 2?
:?EC@G6CE 2E }$pn x? E96 6=6G2E@CD[
E96 6IEC@G6CED =@@< 2E E96 ~%wt# 8FJVD D9@6D]
となります。
memfrob()
GNU Cライブラリには、`memfrob()`関数があります。これはROT13と同じ目的で使用されますが、任意の二進データに利用できます。この関数は、データの各バイトを二進数の00101010(10進数で42)との間で
排他的論理和(XOR)演算を行います。この手法は単純なXOR
暗号であり、ROT13と同様に弱いものです。再度適用すると、元のデータが得られます。
脚注
GoogleのUSENETアーカイブでは、初期のROT13の使用例として、1982年10月8日に投稿されたものが確認できます。
参考文献
Eric S. Raymond (Editor), the Jargon File
ブルース・シュナイアー著,
山形浩生監訳,『
暗号技術大全』,ソフトバンク,2003年6月6日
関連項目
シーザー
暗号
暗号解読
外部リンク
Google online ROT13 encoder/decoder
Words with interesting properties under ROT13
Online ROT13 encoder
Another online ROT13 encoder/decoder in JavaScript
Bilingual (Portuguese/English) page with explanations, links and software information
ROT13 Bookmarklet
Software for ROT13 in a large number of languages
A description of ROT13
ROT47 encoding/decoding
ROT47 and ROT13 encoding/decoding
This Firefox extension supports ROT13 conversions and typing