Broadband Watch logo
バックナンバー

その116「DLNAの仕組み」
[2007/03/26]
その115「ドメインとActive Directory」
[2007/03/19]
その114「ワークグループができること」
[2007/03/12]
その113「WPSの仕組み」
[2007/03/05]
その112「Gopherの生い立ちと現在」
[2007/02/26]
その111「Wikiの使われ方」
[2007/02/19]
その110「文字コードとは」
[2007/02/05]
その109「IISの生い立ち」
[2007/01/29]
その108「NASの登場と一般への普及」
[2007/01/22]
その107「HomePNAのいろいろ」
[2007/01/15]
その106「Ogg Vorbisの成り立ち」
[2006/12/25]
その105「MIDIの原理とSMFの構造」
[2006/12/18]
その104「AIFFの構造」
[2006/12/11]
その103「WAVの構造と現状」
[2006/12/04]
その102「WMAの歴史」
[2006/11/27]
その101「AACの特徴」
[2006/11/20]
その100「MP3/MPEG Audioの仕組み」
[2006/11/13]
その99「HSDPAの仕組み」
[2006/11/06]
その98「H.264・MPEG-4 AVCの特徴」
[2006/10/30]
その97「IEEE 802.16e(モバイルWiMAX)の特徴」
[2006/10/23]
その96「TIFFの特徴」
[2006/10/16]
その95「PNGの現状と今後」
[2006/10/02]
その94「GIFの構造」
[2006/09/25]
その93「10GBASEの種類(2)」
[2006/09/11]
その92「10GBASEの種類」
[2006/09/04]
その91「GbEのいろいろ」
[2006/08/28]
その90「JPEGの特徴」
[2006/08/21]
その89「DivXの広がり」
[2006/08/07]
その88「MPEGの仕組み」
[2006/07/31]
その87「WMVのこれまで」
[2006/07/24]
その86「AVIの生い立ちとそのコーデック」
[2006/07/10]
その85「QuickTimeの変遷」
[2006/07/03]
その84「Realのこれまでと今後」
[2006/06/26]
その83「ShareとWinny」
[2006/06/19]
その82「DOCSISの仕組み」
[2006/06/12]
その81「SQLインジェクションの流れ」
[2006/06/05]
その80「RSSの動作」
[2006/05/29]
その79「Skypeの仕組み」
[2006/05/22]
その78「BitTorrentの特徴と今後」
[2006/05/15]
その77「Winnyの仕組みと現状」
[2006/05/08]
その76「WinMXの特徴」
[2006/04/24]
その75「Gnutellaの歴史と構造」
[2006/04/17]
その74「Napsterの歴史」
[2006/04/10]
その73「P2Pのいろいろ」
[2006/04/03]
その72「IEEE 802.11nの動向」
[2006/03/27]
その71「ActiveX Scriptingの動作」
[2006/03/20]
その70「Ajaxの仕組み」
[2006/03/13]
その69「DHTMLの動作」
[2006/03/06]
その68「Scriptの定義」
[2006/02/27]
その67「JavaScriptの仕組み」
[2006/02/20]
その66「Javaの動作」
[2006/02/13]
その65「RFCのプロセス」
[2006/02/06]
その64「ActiveX DocumentとActiveX Controlの違いと共通点」
[2006/01/30]
その63「ActiveX Controlの機能」
[2006/01/23]
その62「ActiveXを構成するもの」
[2006/01/16]
その61「Cookieの仕組みと用途」
[2005/12/26]
その60「malwareとその分類」
[2005/12/19]
その59「rootkitの動作」
[2005/12/12]
その58「CSSの役割」
[2005/12/05]
その57「HTMLの変遷」
[2005/11/28]
その56「PONとその種類」
[2005/11/21]
その55「FWAの仕組み」
[2005/11/14]
その54「DoSとDDoS」
[2005/11/07]
その53「SNMPとMIBの動作」
[2005/10/03]
その52「Jumbo Frameとフレームサイズ」
[2005/09/12]
その51「WPA2の仕組み」
[2005/09/05]
その50「WPAとWPA-PSKの違い」
[2005/08/29]
その49「WPAの仕組み」
[2005/08/22]
その48「WebDAVの動作」
[2005/08/08]
その47「OFDMAの仕組みとOFDMとの違い」
[2005/08/01]
その46「OFDMの仕組み」
[2005/07/25]
その45「WiMAXの特徴」
[2005/07/11]
その44「Wi-Fiの役割」
[2005/07/04]
その43「FTPの目的と動作」
[2005/06/27]
その42「UPnPの動作」
[2005/06/20]
その41「ネットマスクの仕組み」
[2005/06/13]
その40「ARPの機能」
[2005/06/06]
その39「DNSの原理」
[2005/05/30]
その38「デフォルトゲートウェイの役割」
[2005/05/23]
その37「MACアドレスの仕組み」
[2005/05/16]
その36「スイッチとその進化」
[2005/05/09]
その35「ルータによるメリット」
[2005/04/25]
その34「ブリッジの原理」
[2005/04/18]
その33「リピータの機能」
[2005/04/11]
その32「IPアドレスのクラス」
[2005/04/04]
その31「ブロードキャスト/マルチキャスト/ユニキャスト」
[2005/03/28]
その30「SMTP AUTHと認証の種類」
[2005/03/14]
その29「Submissionポートとスパムメール対策」
[2005/03/07]
その28「Outbound Port25 Blockingとは」
[2005/02/28]
その27「PGPの仕組み」
[2005/02/21]
その26「PKIと認証局」
[2005/02/14]
その25「公開鍵暗号方式とは」
[2005/02/07]
その24「共通鍵暗号とは」
[2005/01/31]
その23「SSHの仕組みと応用」
[2005/01/24]
その22「SSLの役割」
[2005/01/17]
その21「POP3とIMAP4の違い」
[2004/12/27]
その20「POP3の役割と機能」
[2004/12/20]
その19「SMTPの機能と問題点」
[2004/12/13]
その18「SPIとパケットフィルタリング」
[2004/12/06]
その17「LANの概念とその広がり」
[2004/11/29]
その16「SIPの役割」
[2004/11/15]
その15「プロキシの利用」
[2004/11/08]
その14「VoIPの仕組み」
[2004/11/01]
その13「イーサネットとは」
[2004/10/25]
その12「IP/TCP/UDP/ICMPとは」
[2004/10/18]
その11「DHCPの役割」
[2004/10/04]
その10「MIMOとは」
[2004/09/27]
その9「DMZとその効果」
[2004/09/13]
その8「ファイアウォールとは」
[2004/09/06]
その7「NATとNAPTの違いとIPマスカレード」
[2004/08/30]
その6「VPNとVPNパススルーの仕組み」
[2004/08/23]
その5「無線LANの問題とWEP」
[2004/08/09]
その4「IEEE 802.11a/b/gって何を意味しているの?」
[2004/08/02]
その3「ダイナミックDNSって?」
[2004/07/26]
その2「グローバルIPアドレスとプライベートIPアドレス」
[2004/07/12]
その1「PPPoEって何だろう?」
[2004/07/05]

その24「共通鍵暗号とは」


暗号とは

 暗号、というもの自体には説明は不要かもしれません。広義の暗号には、「符丁」の類も含まれるでしょうし、日常会話でも煩雑に暗号もどきが出現します。例えば、「あれやっといて」などというものも、広い範囲では暗号になるでしょう。

 その内容は「流しに焦げついたお鍋があるから、クレンザーで焦げつきを削って洗っておいて」だったり、「作りかけのパズルが居間にあるから、完成させといて」だったりと、考えられるケースはさまざまで、当事者同士でしか意味が通じないからです。

 もちろん主要な目的は「いちいち説明するのが面倒」だったりするケースが多いわけで、その意味では「第三者に内容を理解できないようにする」という暗号の本質的な目的からは外れていますが、結果としてその会話を傍らで聞いていても全然わからないので、暗号の一種といえないわけではありません。


 符丁はもう少し複雑です。例えば、青果商のセリ市で用いられる符丁では、市場によって1のことを「ピン」、2のことを「メノジ」、3のことを「ダイク」と言うそうです。これはセリの様子を外部の人間が見てもわからないように、という動機がきっかけで発生したらしいのですが、青果商に限らず、ちょっと古めの業界だと必ずといって良いほどこうした符丁があります。

 変わったところでは証券取引所でも、手サインなる独特の符丁がありました。立会場での取引の連絡に使うもので、最近ではコンピュータ化されているので不要なのですが、以前は外部(立会場の上にある見学エリア)と頻繁に連絡する必要がありました。

 ここで携帯電話などは立会場で使えない状態にあるというのは、かつての立会の様子を見たことがある人にはおわかりかもしれません。なにしろ狭いエリアに数千人、東京証券取引所の場合、ピーク時は3,000人前後の人間がひしめいていたそうで、各々が大声で売買をしているわけですから、手サインは必須だったわけです。ただし、ここには「暗号」の要素はあまり含まれていませんが、業界に無関係な人間にはまったくわからないという意味では、間違いなく暗号です。


 もう少し暗号らしいものとなると、政治・軍事が絡んだものが数多く出てきます。例えば、太平洋戦争時の「ニイタカヤマノボレ」や、日米交渉に絡んだ「マリコ」暗号は有名ですからご存じの方も多いでしょう。

 ただ、暗号の観点から見るとこの2つはかなり異なります。前者は1度きりしか使われない、専門的に言えば「ワンタイムパッド(One Time Pad)」と呼ばれる極めて安全な暗号方式で、後者は置換暗号と呼ばれる、比較的原始的な暗号化方式です。

 前者の場合、「真珠湾攻撃実施」を意味するもので利用されたのは1回だけでした。ですので、仮にこれを傍聴しても「さてこれは何のことだ?」ということになり、、真珠湾が攻撃されたあとで初めて「そうか、あの暗号は真珠湾攻撃の意味だったか」と理解できたわけです。

 これに対し、「マリコ」の方は開戦直前の寺崎英成氏(当時アメリカの日本大使館の一等書記官)と、兄の太郎氏(当時外務省のアメリカ局長)の電話連絡で頻繁に使われました。この場合「マリコ」は「日米関係」の意味だったわけですが、頻繁に使われた結果、この電話を傍受していたFBIは簡単にその意味を推察することができ、結果として暗号の意味をなしていませんでした。

 ただ、ここで挙げた例は比較的理解しやすいのですが、一般に使うにはちょっと難しい面があります。例えば、ニイタカヤマノボレにしても、もし「攻撃」ではなく「真珠湾に停泊して、現地の人からレイを10本貰って帰って来い」という命令をしようとした場合、「ニイタカヤマノボラズテイハクしてレイヲ10ホンモラッテカエッテコイ」と送ったところで、攻撃部隊は困ってしまったでしょう。そんな暗号は決まってないからです。

 あるいは「マリコ」暗号にしても、懸念すべき相手国がアメリカだけではなく、世界に100カ国もあったら、親類縁者の子どもの名前を総動員しても足りないかもしれません。従って、普通の文章を暗号化し、それを復号化する一般的な方法が必要になります。

 この「一般的な暗号」に関して残されているものは、遠くシーザーの時代までさかのぼります。シーザー暗号あるいはカエサル暗号と呼ばれる方法は、単純な置換による暗号化でした。これに転置と呼ばれる技法を組み合わせた暗号化は、その後も広く使われ続けました。こうした方式の1つの頂点は、第二次世界大戦でドイツが使ったエニグマ暗号機と呼ばれるものが生成した暗号ですが、これすらも最終的にはポーランドの暗号解読チームによって破られてしまいました。


コンピュータにおける暗号

 コンピュータが出現するまでの間、暗号とは基本的に文字からなる文章をいかに隠すかという話でしたから、置換と転置以上のアルゴリズムはなかなか出てきませんでした。ところが、コンピュータが登場し、文字もデータとして扱うようになると、従来の文字変換ではなく数学的な変換が可能になりました。

 これもさまざまな方式が存在するのですが、もっとも有名なのはDES(Data Encryption Standard)と呼ばれるものです。これは1977年に米国の連邦規格として採用され、政府が行なう機密保持が必要なデータ通信に使われるようになりました。

 この規格は、その後ANSIでも標準化されたことで、広く一般にも利用されるようになりました。ただ、当時は冷戦真っ只中の時期だっただけに、この技術が当時の共産圏に流れることを恐れ、DESの一般の利用に関してはさまざまな制限が付きました。特に米国外への輸出に関しては厳しく取り締まられており、この結果アメリカ国内では安全性の高い(鍵の長さが長い:後述)方式が使えても、アメリカ国外では安全性に劣る(鍵の長さが短い)ものしか利用できないといった制限が長らく続きました。

 さてこのDESですが、内部のアルゴリズムはデータを64bitごとに区切った上で、転置を基本とした操作を複数回(標準では16回)繰り返すことになっています。この転置を行なう際に重要なのが、「鍵」と呼ばれるデータ列です。

 DESは、元のデータと鍵を複雑に組み合わせながら転置を行ない、元のデータをわからなくするという技術です。この暗号化されたデータは同じ「鍵」と組み合わせて、大まかには暗号化の逆順の処理を行なうことで元のデータを復元することができるようになっています。

 このDESという暗号化方式は、すでに登場してから20年近く経過していますが、それでも未だに利用されている方式なのは、暗号化/復号化の処理が簡単なわりに、破られにくかったからです。マリコ暗号ではありませんが、どんな暗号化を行なっても、それを反復して利用する限りいつかは破られる運命にあります。DESの場合も、鍵がまったくわからないとしても、総当り処理を行なうことでいつかは暗号化を破ることが可能になります。

 ただ、従来はコンピュータの能力が余りに低かったために、現実問題としては十分に強いと見られていました。しかし、最近では大幅にコンピュータの性能が上がり、また差分暗号分析と呼ばれる技術が1990年に開発されたことで、解析効率も大幅に上がりました。これらの結果、今ではオリジナルのDESでは十分な強さがあるとは考えられなくなっています。従って、比較的重要度の低い暗号に使うか、もしくはDESを3回かけることで暗号化の強度を上げる3DES(Triple DES)などといった方策が採られるのが一般的です。


図1:DESの場合の通信手順

共通鍵暗号とは

 さて、前置きが大変長くなりましたが本題に移りましょう。最初に述べたマリコ暗号や、上で述べたDESに共通するのは、暗号化と復号化に同じ「鍵」が利用されることです。

 DESの場合を例に取れば、図1のような手順で通信が行なわれることになります。ここで問題になるのは、両方で同じ「鍵」を持たなければならないことです。こうした方式、つまり暗号化と復号化に同じ「鍵」を使う暗号化の方法を共通鍵暗号と呼びますが、インターネットで広く暗号化通信を行なう場合には、「鍵をいかに受け渡すか」が大問題になってきます。

 代表的な例が、22回目にお話した「SSL」での方式です。SSLの場合、共通鍵を両方で共有するために、公開鍵暗号を使って共通鍵を送る(第22回図4での3番目の手順)という面倒なことを行なっています。共通鍵暗号を鍵付きで送ってしまったら、受け取った側ではそれを使うことができませんし、かといって鍵なしで送ってしまってそれを傍受されたら、いくら暗号化しても意味がありません。これが共通鍵暗号の最大の問題というわけです。

 この問題を解決したのが公開鍵暗号という方式ですが、これは次回にお話します。





2005/01/31 10:55

槻ノ木 隆
 国内某メーカーのネットワーク関係「エンジニア」から「元エンジニア」に限りなく近いところに流れてきてしまった。ここ2年ほどは、企画とか教育、営業に近いことばかりやっており、まもなく肩書きは「退役エンジニア」になると思われる。(イラスト:Mikebow)
Broadband Watch ホームページ
Copyright (c) 2005 Impress Corporation, an Impress Group company. All rights reserved.