[-]=======================================================================[-] Wizard Bible vol.47 (2009,7,10) [-]=======================================================================[-] x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ---- 第0章:目次 --- x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ○第1章: マニアックJavaプログラミング第11回: 〜 しぶといアプリに仕上げよう 〜 金床 著 ○第2章: 難読化ツールを作ろう 前編:VC++のプロジェクト変更の自動化 suma 著 ○第3章: ハニーポットを作ろう vol.0 〜ハニーポットってなぁに?〜 黒崎ゆうき 著 ○第4章: 浮気のススメ 理事長 著 ○第5章: 基礎暗号学講座・第22回 〜ガウスの和と平方剰余の相互法則〜 IPUSIRON 著 ○第6章: お知らせ ○第7章: 著者プロフィール x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第1章: マニアックJavaプログラミング第11回: 〜 しぶといアプリに仕上げよう 〜 --- 著者:金床 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  今回は、主にサーバーアプリやウェブアプリのように、長時間安定した稼働を期待される アプリケーションを作る際のテクニックをいくつか紹介する。どれも特に技術的に高度な ものではないが、読者の発想の転換や視点の変更に一役買うことができれば本望 である。 ■0x02.) TCP接続のエラーを許容する  プロキシサーバーなどを作る場合、SocketクラスやSSLSocketクラスを使って新 しいTCP接続を生成するという処理がひっきりなしに発生する。アクセスの多いサ ーバーであれば数分で万単位、一日では百万単位の接続処理が行われることもあ る。  ご存じの通りインターネットというのはそれほど安定したネットワークではな いので、パケットの損失などはちっとも珍しくない。数万回も接続処理を繰り返 すと、特にサーバーが落ちているわけではないのに、クライアント側からの接続 が失敗するということが起こる。もちろんOSカーネル内部のTCPスタックが、少し のパケット損失ならば(SYN再送などで)カバーしてくれるのだが、それでもダメ な場合にアプリケーション層に失敗が通知される。  このような場合に処理をすぐにあきらめてエラーとしてしまうのではなく、も う一回(あるいはさらに数回)接続を試みさせてみるという考え方がある。これ は以下のようなコードで実現できる。 ----- public static Socket connect( String host, int port, int connectTimeOut ) throws IOException { IOException ex = null; Socket socket = null; SocketAddress sockAddr = new InetSocketAddress( host, port ); for( int i = 0; i < 3; ++i ) { try { socket = new Socket(); socket.connect( sockAddr, connectTimeOut ); return socket; } catch( IOException e ) { ex = e; } } throw ex; } -----  この関数は最大で3回ほど接続を試してみるコードとなっている。3回のconnect がすべて失敗したときには例外が送出される。  connectはブロッキング処理となる。サーバー側の反応が悪いときには、関数が 戻るまでに時間が数秒から数十秒かかることもある。ここでは接続を3回試すため、 この待ち時間も通常の3倍になってしまう。そのため短くしたい場合には3番目の 引数であるconnectTimeOutを適切な値に設定するとよいだろう。  ウェブブラウザの多くはこれに似た考え方のもとに実装されている。一度接続 が失敗しただけではエラーとせず、数回接続を試みるものが多い。  また、上の関数では接続の失敗をログに記録していないが、後でどの程度の接 続が失敗しているのかを確認したい場合には、catchブロック内にロギングのコー ドを入れておくとよいだろう。 ■0x03.) DBにしぶとく接続する  RDBMSに接続するアプリケーションにも前項と同じ考え方が適用できる(ちなみ にコネクションプールを使う場合は何度も接続を繰り返す必要はないのだが、コ ネクションプールにはそれとは別に色々と問題があったりするのでここでは触れ ない)。  DBとデータをやりとりする度に新規にConnectionオブジェクトを生成するよう なコーディングをしている場合を考える。この場合、前項で説明したのと同じ理 由で、ごくまれに接続が失敗することがある。たいていの場合はTCPの接続の失敗 が原因となり、JDBCドライバ内から例外として送出される。このような場合、以 下のようなコードを書いておくとたまに起こるエラーをカバーすることができる。 ----- public static Connection getConnection( String dbmsUrl, String dbmsUser, String dbmsPass ) throws SQLException { Connection conn = null; int count = 0; while( true ) { try { conn = DriverManager.getConnection( dbmsUrl, dbmsUser, dbmsPass ); executeQuery( conn, "select count(*) from pg_user" ); return conn; } catch( SQLException e ) { ++count; if( conn != null ) { closeConnection( conn ); } if( count == 3 ) { throw e; } } } } -----  (「2009年になってこんな原始的なコードを…」というツッコミは却下する。 このような部分は、別にイマドキの新しい記述にしなくても、動けばよいのであ る。というかむしろ1.6系や1.7系のJREに変なバグがある場合に1.4系のJREでも動 かせるように、下位互換性を確保したいのである。)  上記のコードは単一のDBサーバーに対する接続においてのエラーをカバーする ものだ。最近では高性能なサーバーの価格が下落しつつ、かつパーツ等の信頼性 は昔と変わらず低いという現状がある。そのため複数の物理的なサーバーを用意 し、システム全体の冗長性を上げるというアプローチが採られる場面が増えてい る。  筆者もいくつかのシステムで、PostgreSQLとpgpool IIを組み合わせたマルチマ スタのレプリケーション構成を使用している。このときPostgreSQLのダウンはpg poolがカバーしてくれるのだが、pgpool自体が落ちたらどうするの?という問題 がある。そこで複数のサーバーでpgpoolを起動しておき、アプリケーションは1つ めのpgpoolに接続できなかったら次のpgpoolに接続する…という動きをさせる。 これによってpgpoolのダウンすらもカバーすることができる。  つまり、アプリケーションの設定ファイルには、以下のように接続先のDBサー バー(実態はpgpool)として複数のDBMSのURLを記述しておく。ここではカンマ区 切りで記述している。 ----- dbmsUrl=jdbc:postgresql://192.168.1.1:9999/kntk,jdbc:postgresql://192.168.1.2:9999/kntk,jdbc:postgresql://192.168.1.3:9999/kntk -----  アプリケーションは1つめへの接続に失敗したら2つめに、それでもダメなら3つ めに…としぶとく動作する。これによりハードウェア障害などによってpgpoolや PostgreSQLを載せたサーバーがダウンしていてもシステム全体は稼働し続けるこ とができるのだ。  ちなみにpgpool IIは複数同時稼働を想定されていないため、オンラインリカバ リ時には1つのインスタンスを残して他を落としておく必要がある(上のようなア プリケーションの作りにしておけば、1つのインスタンスだけ残っていればシステ ム全体は動作を続けることができる)。 ■0x04.) エラーを分類し許容する  アプリケーションがしぶとく動作を続けるためには、多少のエラーにはびくつ かないようにする必要がある。  まず、どのようなエラーが発生しうるかを事前にできるだけ想像しておく。0x 02項で紹介した「TCPの接続がたまに失敗する」などは典型的なものだ。他には例 えば「DBに接続できない」「DBが途中から反応しない」「ディスク容量が足りな い等の理由でファイルが保存できない」「メモリが足りない」「ファイルディス クリプタが足りない」「負荷が高すぎる」「ぬるぽ」「やる気がしない」「眠い」 などが考えられる。  次に、これらのエラーのうち、どれをどこまで許容するかを考える。DBに接続 できなかったらそこでおしまいなのか?ファイルが保存できなかったらそこであ きらめるのか?  安西先生… コーディングが… したいです…  えーと、何の話だっけ。ということでどのエラーをどこまで許可する(あるい は、あきらめてアプリケーションを終了する)かを決定する。また同時に、これ らのエラーが発生したことを(または、発生していないことを)を把握するため に、ログファイルに記録したり、外部からエラーの発生状況をリアルタイムで取 得するためのインターフェースを用意したりする。 ■0x05.) 機能を分類する  0x04項と内容がかぶる部分があるが、アプリケーションが持つ機能のうち、重 要なものとそうでないものを分ける。そして、重要でない部分でエラーが発生し た場合には、その影響がアプリケーション全体に及ばないようにする。  例えばJRobinなどを使って、アクセス状況を5分ごとに画像ファイルとして出力 する機能をもったプロキシサーバーがあるとする。このプロキシサーバーの核と なる機能は、いうまでもなくネットワークアプリケーションとしての動作だ。ア プリケーションの作者にとって、グラフを描く機能は追加的なものにすぎない。  しかし実際に実行されるコード(ライブラリ内部など、作者が自身で書いてい ない部分)の量としては、ネットワークの部分よりもグラフの部分の方が多くな ることも充分考えられる。そのため、充分に枯れているライブラリならばよいが、 グラフを描く部分でNullPointerException等の例外が発生する可能性も考えるよ うにする。そして、グラフの描画処理が何度もエラーを出したりする場合には、 それを検知し、以降グラフを描かずに、核となるプロキシサーバーの機能に専念 するようにアプリケーションを作っておく。このようにすることで、万が一の場 合にもサービス断という事態を避けることができるかもしれない。  また、アプリケーションが充分に枯れた後に、新しい機能を追加する場合につ いても同様である。新しいコードにはバグが潜んでいる可能性が高いので、そこ で発生したエラーがアプリケーション全体に及ばないようにしておく。充分なテ スト期間が過ぎたら、より適切なエラー処理へと変更する。  さらに別のアプローチとして、アプリケーションを分けてしまうというアプロ ーチもある。djbによるqmailなどに代表される考え方だ。アプリケーション全体 を、シンプルな機能を持つ複数のプロセスに分ける。そしてプロセス間通信によ ってサービス全体が実現されるようにする。あるプロセスが死んでしまった場合 などでも、サービス全体には影響を及ぼさないようにする。前述の例で言えば、 グラフを描くアプリケーションは独立させ、cronなどから呼び出してもよいだろ う。 ■0x06.) おしまい  今回は、筆者の長いJava開発の経験に基づくひとつのアプローチを紹介した。 TCP接続やDB接続の失敗を許容するコードでは、再試行の前にsleepするのもよい かもしれない。例えば最大で30秒間のDBサーバーのダウンを許容するような作り にしておけば、何かの設定変更などでDBサーバーを再起動したい!というような ケースに対応することができる。アプリケーションを開発する時点で、サーバー 管理や運用も含めたイメージを持っておくことで、このような冗長性が高く扱い やすいアプリケーションを作成することができる。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第2章: 難読化ツールを作ろう 前編:VC++のプロジェクト変更の自動化 --- 著者:suma x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  「難読化ツールを作ろう」という題で難読化ツールの作り方を前後2回に別けて 解説します。 今回は、VC++(Visual C++)のプロジェクトファイルをC#で作ったプ ログラムから変更するテクニックを解説します。  VC++のプロジェクトファイルをプログラムから編集するというのは、VC++向け のVisual Studioのアドインや開発ツールを作るのに便利な方法です。今回は難読 化についてほとんど触れないため、Visual Studio向けに開発ツールを作りたい方 は是非読んでみてください。  この記事は、以下の私のブログから参照しているPDF・プログラムをWizard Bi ble向けに書き直した物です。PDFではライブラリの使い方などは解説していませ んが、興味があればこちらも後から読んでみてください。 「VC++向け難読化ツールの開発」レポートPDFの公開 http://d.hatena.ne.jp/obfuscation/20090119#p1 難読化ツールソースコード公開 http://d.hatena.ne.jp/obfuscation/20090125#p1 ■0x02.) なぜ自動化するのか  難読化ツールで難読化を自動化する理由は次の2点でしょう。 ・プログラマーが難読化のためにソースコードを変更する作業をなくす。 ・これによりバグの発生、ソースコードの保守性の低下を防ぐ。  また、難読化だけでなく開発ツールで自動化を行う目的は次の2点に主眼を置く ことになると思います。 ・生産性の向上  手順に詳しくない人でも簡単に扱えるようにする。  慣れている人でも、面倒な作業を簡単にできるようにする。 ・別システムへの統合  開発ツール(NAntやMSBuildなど)やシステム(ビルド・テストツールなど)と 統合して、開発のプロセスをすべて自動化できるようにする。  今回作るのはVisual Studio用のアドインではありませんが、例としてIntel T BB(Threading Buliding Blocks)のアドインを紹介しておきます。  TBBのアドインは、VC++のプロジェクトオプションを変更してDLLをロードする ディレクトリのパスを変更します。TBBのようなライブラリのDLLは複数バージョ ンのファイルが開発者のマシンに混在してインストールされることがあるため、 TBBのインストーラはシステムディレクトリにDLLをインストールしません。しか し、DLLは実行ファイルのあるディレクトリ、Windowsディレクトリ、PATHに設定 されたディレクトリなどから検索されるため、そのままではTBBのDLLをプログラ ムからロードされません。そこで、アドインを使ってプロジェクトオプションか らPATHを変更し、指定したバージョンのDLLが実行時にロードされるようにしてい ます。 ■0x03.) Visual Studioを拡張する方法  Visual StudioにはIDEを拡張するCOMライブラリが提供されています。提供され ている機能に、メニューやツールバー、ウィンドウなどのカスタマイズ、テキス トエディタで編集している情報へのアクセス方法などがあります。MSDNの以下の ページからたどっていくと、拡張できる機能の多さに驚くと思います。 MSDN - Visual Studio 環境の拡張 http://msdn.microsoft.com/ja-jp/library/esk3eey8.aspx MSDN - EnvDTE 名前空間 http://msdn.microsoft.com/ja-jp/library/envdte.aspx MSDN - EnvDTE80 名前空間 http://msdn.microsoft.com/ja-jp/library/0e105c68.aspx  今回はVC++のプロジェクトファイルを扱うため、VCProjectとVCProjectEngine というクラスインタフェースを使います。以下のページでそれぞれのインタフェ ースのメンバが解説されています。 MSDN - VCProjectEngine メンバ (Microsoft.VisualStudio.VCProjectEngine) http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.vcprojectengine.vcproject_members.aspx MSDN - VCProject メンバ (Microsoft.VisualStudio.VCProjectEngine) http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.vcprojectengine.vcprojectengine_members.aspx ■0x04.) 自動化するプログラムを書く  それでは、C#を使ってVC++のプロジェクトオプションを扱うプログラムを書い てみましょう。およそ以下のような手順となります。Visual Studio 2005とVisu al Studio 2008で作り方に異なることはありません。 ●C#でプロジェクトを作る  ここでは簡単に動作を確認するためコンソールアプリケーションのC#プロジェ クトを想定して説明します。 ●VCProjectとVCProjectEngineを参照に追加する  Microsoft.VisualStudio.VCProjectとMicrosoft.VisualStudio.VCProjectEngi neの2つのコンポーネントをプロジェクトに登録します。以下のページを参考にし て、Visual Studioのソリューションエクスプローラから参照を追加してみまし ょう。参照の追加の「.NET」タブからこれらのコンポーネントを追加することが できます。 MSDN - 方法 : EnvDTE、EnvDTE80、および EnvDTE90 の各名前空間への参照を追 加する http://msdn.microsoft.com/ja-jp/library/yf86a8ts.aspx ●usingでVCProjectとVCProjectEngineを記述する  自動化の処理を記述するソースコードの先頭に以下の行を追加します。 ---- using Microsoft.VisualStudio.VCProject; using Microsoft.VisualStudio.VCProjectEngine; ---- ●自動化するコードを書く  VCProjectとVCProjectEngineを使ったコードは以下ようになります。以下のコ ードでは、プロジェクトのファイル一覧と、プロジェクトの設定一覧を表示しま す。 ----- static void test1(string project_path) { VCProjectEngine engine = new VCProjectEngineObject(); VCProject proj = (VCProject)engine.LoadProject(project_path); if (proj == null) { throw new Exception(); } IVCCollection projFiles = (IVCCollection)proj.Files; IVCCollection projConfs = (IVCCollection)proj.Configurations; // プロジェクトのファイルを表示する for (int i = 1; i <= projFiles.Count; i++) { VCFile file = (VCFile)projFiles.Item(i); Console.WriteLine("File {0}: {1}", i, file.Name); } // プロジェクトの設定を表示する for (int i = 1; i <= projConfs.Count; i++) { VCConfiguration cfg = (VCConfiguration)projConfs.Item(i); Console.WriteLine("VCConfiguration {0}: {1}", i, cfg.Name); // オプションを変更する場合は、VCConfiguraionをIVCCollectionにキャストする。 // IVCCollectionクラスからItemメソッドを使って好きなイベントオブジェクトを取得する。 // 取得し、そしてさらにキャストする。 //VCPreLinkEventTool eventTool = (VCPreLinkEventTool)((IVCCollection)cfg.Tools).Item("VCPreLinkEventTool"); //if (eventTool != null) //{ // eventTool.CommandLine += "...."; //} // ファイル名を変更してプロジェクトを保存する proj.ProjectFile = "(パス)"; proj.Save(); } } static void Main(string[] args) { if (args.Length == 1) { test1(args[0]); } } -----  通常のC#コードとは異なる以下の点に気をつけてコードを書く必要があります。 ・メソッドの返り値、もしくはプロパティがobject型の場合は、自分が扱うイン タフェースの型へキャストする ・キャストしたリファレンスがnullになっていないかチェックする ・一部のリスト(ファイル一覧)などは、IVCCollecitonというインタフェースを 使ってオブジェクトのリファレンスを取得する(その後キャストする)  コンポーネントはCOMである関係もあってか、メソッドの返り値やプロパティは オブジェクト(object型)なっています。自分が扱いたいインタフェースをMSDN のドキュメントから探し、同時にメソッドやプロパティが何の型を返すのか確認 しておくとよいでしょう。 MSDN - Microsoft.VisualStudio.VCProjectEngine 名前空間 http://msdn.microsoft.com/ja-jp/library/microsoft.visualstudio.vcprojectengine.aspx ■0x05.) まとめ  Visual Studioは色々拡張できて実はスゴイのに、解説した記事を見たことがな いので書いてみることにしました。少々説明不足なところがあるかもしれません が、MSDNを見て試行錯誤すればすぐに解決できると思います。  このネタは昨年秋頃に、Wizard Bibleにチュートリアルを書こうと思っていて 気がついたら放置していた内容でした。文章を書くリハビリと、記事を書くのが 続くように前後に別けたので、後編に続きます。次回はOCamlというプログラミン グ言語を使った難読化プログラムの実装について解説する予定です。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第3章: ハニーポットを作ろう vol.0 〜ハニーポットってなぁに?〜 --- 著者:黒崎ゆうき x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  こんにちわ。今回が初投稿となります、黒崎ゆうきと申します。  近年、コンピュータウィルスの感染手口もとても巧妙なものになり、アンチウ ィルスソフトなしではコンピュータの使用は怖いものとなっています。ですが、 実際にマルウェアを収集したり、感染したり、解析をしてみることもコンピュー タを学ぶ上で大切なことだと思います。  そこで、今回はハニーポットの概念や種類に加え、構築を行いたいと思います。 ■0x02.) ハニーポットとは  ハニーポットとは、和訳すると「蜜壷」の意味があります。「攻撃者にとって 何かしら有益な情報があると見せかけ攻撃を誘う」もののことと解釈できます。 有名な事例として、天文学者クリフォード・ストールの著書『カッコウはコンピ ュータに卵を産む』にある「SDIネット」というものが挙げられるます。  攻撃者による攻撃の傾向や、どのようなツールを用いたのかといった情報を収 集するために用いられる、攻撃されることに意味があるシステムの事を指します。 ですが、実際に脆弱性があるシステムをネットワーク内に稼動させたらどうでし ょうか?そのコンピュータを経由して、他のコンピュータに悪意を及ぼす可能性 があります。そのため、目的に応じて、様々な種類のハニーポットが設計されて います。 ■0x03.) ハニーポットの種類 ●高対話型ハニーポット(High-Interaction Honeypots)  実際に脆弱性を持たせた「本物の」システムを稼動させ、攻撃を誘うもののこ とを高対話型ハニーポットといいます。  「本物の」システムを使うことにより、「本物の」情報を手に入れることがで きるため、沢山情報を得ることができます。ですが、実際に脆弱性を残したシス テムを稼動させることにより、管理が大変難しく、他のコンピュータに被害を及 ぼす可能性があります。そのため、個人レベルで構築するにはあまり実用性はな いかもしれません。 ●低対話型ハニーポット(Low-Interaction Honeypots)  高対話型ハニーポットは「本物の」システムを稼動させるものでしたが、低対 話型ハニーポットは、「本物のような」脆弱性を持ったシステムをエミュレート し、監視を行うものです。決して「本物の」システムではないため、収集できる 情報は限られますが、エミュレートしている範囲に機能が制限されるため、高対 話型ハニーポットよりも安全に稼動をさせることができます。 ●仮想ハニーポット(Virtual Honeypots)  仮想マシン(VMware,VirtualBOX,Xenなど)でで構築されたハニーポットのこと を指します。仮想マシンは、一度電源を落とせば、汚染されていないシステムへ 戻すことが容易なため、管理面では大変有効な方法であるといえます。ですが、 最近のボットやマルウェアは賢いですから、自分自身が仮想マシン上に身を置い たことをと察すると、自らを消去しようとするものなどがあります。いかに、攻 撃者やマルウェアに仮想マシンだと悟られないようにするか、という大変難しい 技術が必要になります。  代表的なハニーポットの種類は上記3つです。それぞれに、メリット、デメリッ トがあるため実際に行いたいことに合わせて使用するハニーポットを決定しなけ ればなりません。  今回私が構築するハニーポットは安全面を考慮し、個人でも管理ができそうな 「低対話型ハニーポット」を選択しました。 ■0x03.) Nepenthesの構築  OSはCentOS5.3を使います。FirewallはDisableとしました。その上でNepenthes を稼動させることを今回の目標とします。  Snortを同時に稼動させ、不正アクセスの検知を行おうかと考えましたが、今回 はNepenthesのみで稼動を行ってみて、その他の拡張は次回からの課題にしたいと 思ったためです。  CentOS上でNepenthesを動作させる上で必要なモジュールがいくつかあります。 まず、以下のモジュールがインストールされていることを確認します。 ----- terminal # rpm -qa | grep curl # rpm -qa | grep pcre # rpm -qa | grep pcap -----  足りないモジュールは以下のコマンドで入手します。 ----- terminal # yum install [モジュール名] -----  さらに、libadnsも必要になるので、GNU adnsからtarボールをダウンロードして makeします。 GNU adns:http://www.chiark.greenend.org.uk/~ian/adns/ ----- terminal # wget http://www.chiark.greenend.org.uk/~ian/adns/adns.tar.gz # tar zxvf adns.tar.gz # cd adns # ./configure # make # make install -----  これで準備が整ったので、Nepenthesのインストールをします。Nepenthesは以 下のサイトから入手し、インストールしてください。 Nepenthes公式:http://nepenthes.carnivore.it/  また、SorceForgeからもtarボールを入手することができます(私はこちらを使 用しました)。 ----- terminal (SorceForgeの場合) # wget http://nchc.dl.sourceforge.net/sourceforge/nepenthes/nepenthes.*.tar.gz # tar zxvf nepenthes* # cd nepenthes* # ./configure # make # make install -----  これで、/opt配下にNepenthesがインストールされます。 ■0x04.) Nepenthesが使用するポートについて  Nepenthesは脆弱性を持ったシステムをエミュレートするため、外部から接続を 受け付けなければ攻撃は成功しません。つまり、ポートを開放しなければならな いということです。  Linuxではデフォルトで複数のポートを使用している場合があります。以下のよ うにして確認することが出来ます。 ----- terminal # netstat -a -----  この際に、Nepenthesが解放するポートと重複しないように、ポート番号を変え るか、サービスを停止するかしてください。私は、SSH以外のサービスを全て停止 してNepenthesを稼動させるようにしました。  以下がNepenthes稼動前と稼動後のポートの様子です。 ----- terminal # netstat -a *Nepenthes稼動前 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:ssh *:* LISTEN # netstat -a *Nepenthes稼動後 Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:blackjack *:* LISTEN tcp 0 0 *:imaps *:* LISTEN tcp 0 0 *:pop3s *:* LISTEN tcp 0 0 *:ariliamulti *:* LISTEN tcp 0 0 *:epmap *:* LISTEN tcp 0 0 *:commplex-main *:* LISTEN tcp 0 0 *:nameserver *:* LISTEN tcp 0 0 *:netbios-ssn *:* LISTEN tcp 0 0 *:tip2 *:* LISTEN tcp 0 0 *:pop3 *:* LISTEN tcp 0 0 *:imap *:* LISTEN tcp 0 0 *:http *:* LISTEN tcp 0 0 *:ndmp *:* LISTEN tcp 0 0 *:6129 *:* LISTEN tcp 0 0 *:smtps *:* LISTEN tcp 0 0 *:sgi-esphttp *:* LISTEN tcp 0 0 *:27347 *:* LISTEN tcp 0 0 *:17300 *:* LISTEN tcp 0 0 *:ftp *:* LISTEN tcp 0 0 *:ctx-bridge *:* LISTEN tcp 0 0 *:zephyr-clt *:* LISTEN tcp 0 0 *:eklogin *:* LISTEN tcp 0 0 *:urbisnet *:* LISTEN tcp 0 0 *:smtp *:* LISTEN tcp 0 0 *:bintec-admin *:* LISTEN tcp 0 0 *:https *:* LISTEN tcp 0 0 *:imap3 *:* LISTEN tcp 0 0 *:microsoft-ds *:* LISTEN tcp 0 0 *:1023 *:* LISTEN tcp 0 0 *:ssh *:* LISTEN -----  リモートログインを行うために起動させてあるSSHを除き、その他はNepenthes が空けたポートです。  同じセグメントからnmapでポートスキャンをかけた結果が以下のとおりです。 ----- OpenPort PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp filtered smtp 42/tcp open nameserver 80/tcp open http 110/tcp open pop3 135/tcp open msrpc 139/tcp open netbios-ssn 143/tcp open imap 443/tcp open https 445/tcp open microsoft-ds 465/tcp open smtps 993/tcp open imaps 995/tcp open pop3s 1023/tcp open netvenuechat 1025/tcp open NFS-or-IIS 2103/tcp open zephyr-clt 2105/tcp open eklogin 2107/tcp open unknown 3372/tcp open msdtc 5000/tcp open upnp 6129/tcp open unknown 10000/tcp open snet-sensor-mgmt -----  WAN側からNmapを使ってスキャンをかけようとすると、私の環境では上手くでき なかったです(スキャンを開始すると、グローバルIPが変えられてしまう。)そ のため、ポート解放をチェックするサイトにて上記オープンポートをスキャンし ました。  これで、Nepenthesが稼動し、WAN側からもコネクションを受け付けるようにな ったのでこのまま稼動させておけば "/opt/Nepenthes/var/binary"へマルウェア が格納されます(ファイル名はマルウェアのハッシュ値)。 ■0x05.) 終わりに  今回は、ハニーポットとは何か?という説明を行い、実際にハニーポットを構 築し稼動を行いました。ISP側で不正なコネクションの規制をしていなければ、上 記ディレクトリにマルウェアを採取できます。しかし、一週間程稼動を行った私 のシステムでは、ISP側で規制が行われているようで、残念ながらマルウェアを採 取することができませんでした。  次回からは環境の変更を行い、実際にマルウェアを採取したり、Snortをインス トールして、不正アクセスの検知を行いたいと思います。  最後までお付き合いいただきありがとうございました。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第4章: 浮気のススメ --- 著者:理事長 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに 【編注】この記事は原案が連合大尉、加筆修正が連合理事長となります。  元探偵の大尉が送る、今回のコンテンツは「ばれない浮気をするために」です。  世の「浮気・不倫」をしている人達のほぼ全ての人に言えるコトですが、「浮 気・不倫」をするためには彼氏彼女や旦那に奥さんのいずれかが必要な訳です。  もちろん浮気は隠すことが基本ですよね?…中にはわざと判るようにする場合 もありますが…今回はそんなのは無視致します。  ま、いくら隠してみても初心者(?)な方々は決定的なミスを気づかないで、 放置しちゃうものなのです。 ■0x02.) 探偵をやってて思ったコト  探偵をやってて思ったコト。…自分がする時は気をつけようって思ったことで す(笑)。  そんなのを適当に…ほんっっっとに、力を抜いて紹介してみようかとおもいま す。  では、早速いってみましょう。 ●浮気相手と会うときは自分の車を使わないこと  もう基本ですよ基本。相手が車を持ってて迎えに来てくれる場合も、自宅から 離れた場所で待ち合わせをすること。  それも駅前やコンビニとかじゃなくって、その辺の路上がベストです。  まず自分の車を使わないことでナンバーから住所を出されるのを防ぎましょう。 ま…お互いに電車やタクシーを利用するのが一番よいんですが。 ●本気で浮気を隠したいのなら協力者を用意すること  はい!これも基本です。  できれば恋仲相手の親しい人を買収なりなんなりして抑えておくのが、好まし いです。  逆に売られることをされないように、あらかじめ協力者の弱みを握っておくこ とも大事です。浮気相手が彼氏・彼女(夫・妻)の友人だったら簡単でよいです ね〜。  ただ…両者合意の下じゃないと逆に被害が大きくなることの方が確率高いので、 気をつけましょう。  薬も使い方を間違えたら毒になりますし…ね? ●シャンプー・リンス・香水・タバコ等は浮気相手と同じモノを使うようにすること  彼氏・彼女と同居している場合は必須です。可能なら洗濯するときの洗剤や柔 軟材なんかも合わせましょう。  浮気相手がソロ(?)の場合は相手側に自分の使ってるのを使用してもらうよ うに。  当然、ラブホテルなんかに行ってもばれないように携帯用として用意しておく こと。…ホテルにおいてあるのって基本的に香りが強いから、使っちゃうとばれ ますよ?  あ、普段から香水は使っておいたほうがよいです。男女共に、性交前と性交後 って体臭が微妙に違いますから。性交後の6時間位はソノ匂いだから…。行為の後 に彼氏・彼女と会うなら気をつけましょう。 ●浮気相手専用の携帯電話を用意すること  必須事項だと思うんですが…どうかな?  普段使ってる携帯でもメールや着信・通話履歴を残さなければよいけど…。彼 氏・彼女と一緒に居る時にかかってきたら困りますよね?ロックとかしてたら何 かを隠しているってわかっちゃいますしね。手に入れるのに苦労するかもだけど …、飛ばしの携帯ならばさらに安全です。  携帯のアドレスや電話番号から契約者の情報がわかっちゃうし…気をつけるべ きです。 ●普段から電話に出ないことやメールの返信を遅くしておくこと  まぁ…事前作業です。「いつもは電話もすぐ出るのに…」なんてコトにならな いように浮気する前から徐々にやっておくことが大事です。最近の携帯電話は位 置情報が携帯に残ってたりするから危険です。  逆にこの機能を使ってアリバイ工作をしてしまいましょう!毒薬も上手く使え ばよい薬になるのです。 ●髪の毛・写真・レシート等の処分は怠るな  はい。基本に立ち返れ…です。  服や車内には思ってるよりも浮気の陰が残るものです。一緒に撮った写真なん てもってのほか。  飲食店かなにかで渡されたレシートはその場で処分。…あ。当然、浮気相手に 使うお金はばれないように工面しましょう。パチンコなんかのギャンブルする人 は財布を分けてますから楽ですよね?  まぁ、こんな感じですね。本当はまだまだあるんだけど…長くなりますので。 ■0x03.) さいごに  ここまで書いてきたのは「浮気相手が今の状態で満足している場合」ってのが、 条件です。略奪なんかを考えている人と浮気してるなら、紹介した方法では逆に 危険です。  …なんていうか…アレですよね。「ばれるかばれないかのスリルが媚薬」  浮気するのはしょうがないのです。「私の彼氏(彼女・夫・妻)は浮気なんかし てないよ」…って思うよりも、最初から浮気してるものと思ってたほうが長く付 き合えると思います。  ほら。浮気ってことは自分が本命だってコトじゃないですか。自分が浮気の場 合も高いので要注意です。  最後に「これを実践して不都合が起きても、当方は関知できません」と付け加 えておきます。  それでは拙い文章ではありましたが、拝読していただいてありがとうございま す。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第5章: 基礎暗号学講座・第22回 〜ガウスの和と平方剰余の相互法則〜 --- 著者:IPUSIRON x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■0x01.) はじめに  こんばんは、IPUSIRONです。  今回の記事ではこれまで解説してきたルジャンドル記号と大きく関係するガウ スの和という概念について紹介したいと思います。WB44では格子点に着目して平 方剰余の相互法則を証明しましたが、今回はガウスの和を使った証明を紹介しま す。 ■0x02.) 1の原始n乗根  今月号の主題であるガウスの和の定義には1の原始n乗根という概念が使われる。 そこでまず1の原始n乗根を定義する。  1の原始n乗根とは直観的にいえばn乗して初めて1になる1のn乗根のことである。 1のn乗根とは、n乗して1になるx^n-1=0の解である。x^n-1=1の解は次である。 ζ_n =exp(2πi/n)^k =exp(2πki/n) =cos(2πk/n)+i・sin(2πk/n)(k=0,1,…,n-1) (∵オイラーの公式)  ζ_0=1であるので、解は{1,ζ_n,(ζ_n)^2,…,(ζ_n)^(n-1)}のような巡回群を 成している。  1になる1のn乗根となるようなkの性質を考えてみる。 (ζ_n^k)^h=1 ⇔cos(2πkh/n)+i・sin(2πkh/n)=1 ⇔2πkh/n=2πm(m:ある整数) ⇔kh/n=m ⇔hはn/dの任意の倍数(ただし、d=(k,n))  このようなhの最小値がnであるのはd=1に限る。よって、次の定理が得られる。 [定理]「ζ_n^kが1の原始n乗根」⇔「(k,n)=1」  この1の原始p乗根の個数はφ(p)個あるのはオイラー関数の定義より明らかであ る。  具体的な数値例で調べてみる。n=7とする。ζ_7=exp(2πi/p)とすると、1の7乗 根の集合は{1,ζ_7,(ζ_7)^2,…,(ζ_7)^6}であるp=7と素なものは1,2,…,6であり、 先ほどの結果より、1の原始7乗根の集合は{ζ_7,(ζ_7)^2,…,(ζ_7)^6}である。 ■0x03.) ガウスの和の定義  (a/b)がルジャンドル記号を意味するのか、単に分数を意味するのを区別するた めに、ルジャンドル記号を次の記号に置き換える。 [定義] [a]∈Zp^*={[a_1],[a_2],…,[a_(p-1)]}に対して、次のように定義する。 λ_p([a]):=(a/p) ルジャンドル記号の定義より、 [1] [a]∈(Z_p^*)^2のとき、即ちa∈QR_pのとき、λ_p([a])=1 [2] [a]/∈(Z_p^*)^2のとき、即ちa∈QNR_pのとき、λ_p([a])=-1 であることは明らかである。ここで、(Z_p^*)^2:={x^2|x∈Z_p^*}、「a/∈A」は 「集合Aは元aを含まない」を意味する。  このとき、ガウスの和であるSを次のように定義する。 [定義]S:=Σ[k=1;p-1]λ_p([a_k])ζ^(a_k) ここで、ζは1の原始p乗根とする。  具体的な数値例として、p=7の場合のガウスの和を調べてみる。 S =Σ[k=1;6]λ7([a_k])ζ^(a_k) ここでζ=exp(2πi/7)とする。 =λ7([1])ζ^1+λ7([2])ζ^2+λ7([3])ζ^3+ λ7([4])ζ^4+λ7([5])ζ^5+λ7([6])ζ^6 =1・ζ^1+1・ζ^2+(-1)・ζ^3+1・ζ^4+(-1)・ζ^5+(-1)・ζ^6 (∵QR_7={1,2,4},QNR_7={3,5,6})  Z_p^*={[a1],…,[a_(p-1)]}はZ_p^*={[1],…,[p-1]}と書き換えられるので、ガ ウスの和はすぐに次のように置き換えられる。また、p/|kとすると、[k]∈Z_p^* であり、Z_p^*={[k],…,[(p-1)k]}も成り立つ。よって、次のように式変形が可能 である。 [定理] S =Σ[k=1;p-1]λ_p([a_k])ζ^(a_k) =Σ[k=1;p-1]λ_p([k])ζ^k =Σ[h=1;p-1]λ_p([kh])ζ^(kh)  最後の式変形でΣの添え字がkからhに変わっていることに注意。 ■0x04.) ガウスの和の性質  ガウスの和の定義は一見複雑そうに見えるが、2乗するととてもシンプルな形に なる。 [定理]S^2=p・(-1)^{(p-1)/2} [証明]ここでλ_p(0):=0とする。これはルジャンドル記号で考えても矛盾しない から問題ない。  すると、Sは次のように書ける(Σの始点に注目)。 S=Σ[k=0;p-1]λ_p([k])ζ^k ←(1)  (1)より、S^2は次のように書ける。 S^2 =(Σ[k=0;p-1]λ_p([k])ζ^k)S =Σ[k=0;p-1](λ_p([k])Sζ^k) ←(2)  ここで、Σが影響する括弧内に注目する。 λ_p([k])Sζ^k =λ_p([k])(Σ[h=0;p-1]λ_p[kh])ζ^(kh))ζ^k (∵前の章で得た「S=Σ[h=1;p-1]λ_p([kh])ζ^(kh)」とλ_p(0):=0より、 「S=Σ[h=0;p-1]λ_p([kh])ζ^(kh)」を得る。このSを代入した) =Σ[h=0;p-1]λ_p([k])λ_p([kh])ζ^{(h+1)k} ←(3)  さらに、λ_p([k])λ_p([kh])に注目すると、次のように変形できる。 λ_p([k])λ_p([kh]) =λ_p([k][kh]) (∵λ_pは群の準同型写像であるから) =λ_p([k]^2・[h]) =λ_p([k^2])λ_p([h]) =1・λ_p([h]) =λ_p([h])  よって、(3)はΣ[h=0;p-1]λ_p([h])ζ^{(h+1)k}と書ける。  このことより、(2)は次のように書ける。 (2) =Σ[k=0;p-1](λ_p([k])Sζ^k) =Σ[k=0;p-1]Σ[h=0;p-1]λ_p([h])ζ^{(h+1)k} =Σ[h=0;p-1]λ_p([h])(Σ[k=0;p-1]ζ^{(h+1)k}) =Σ[h=0;p-1]λ_p([h])・p (h=p-1のとき)、0 (0≦h<p-1のとき) (∵0≦h≦p-1nならば1≦h+1≦pより、Σ[k=0;p-1]ζ^{(h+1)k}=p (h=p-1のと き)or 0(≦h<p-1のとき)) =Σ[h=0;p-1]λ_p([p-1])・p (h=p-1のとき)、0 (0≦h<p-1のとき) =λ_p([p-1])・p =λ_p([-1])・p (∵p-1≡-1 (mod p)) =λ_p(-1)・p (∵[-1]=-[1]=-1) =p・λ_p(-1) (∵交換律) =p・(-1)^{(p-1)/2} (∵第1補充法則より、(-1/p)=(-1)^{(p-1)/2}) □  この定理から次の系がすぐに成り立つ。  ここで第1補充法則より(-1)^{(p-1)/2}は整数なので、S^2は整数である。また、 定理の結果の両辺に(-1)^{(p-1)/2}をかけると、S^2さえも消えてしまう。 [系]S^2:整数 [証明]第1補充法則より(-1)^{(p-1)/2}は整数なので、S^2は整数である。 □ [系]p=S^2・(-1)^{(p-1)/2} [定理]定理の結果の両辺に(-1)^{(p-1)/2}をかけると、 S^2・(-1)^{(p-1)/2}=p・(-1)^(p-1)  pは素数なので、p-1は偶数。よって、-1を偶数乗すると1である。 □ ■0x05.) ガウスの和と平方剰余の相互法則  さらに、ガウスの和とルジャンドルの記号が直接関係する次の性質が成り立つ。 合同式であることに注意して欲しい。 [定理](p/q)≡(-1)^[{(p-1)/2}{(q-1)/2}]・S^(q-1) (mod q) [証明]系より、p=S^2・(-1)^{(p-1)/2}が成り立つ。 pを{(q-1)/2}乗して、式変形していくと次のようになる。 p^{(q-1)/2} =(S^2・(-1)^{(p-1)/2})^{(q-1)/2} =(-1)^[{(p-1)/2}{(q-1)/2}]・S^(q-1)  qは奇数ならば、q-1は偶数である。q-1=2kとすれば、S^(q-1)=(S^2)^k=(整数)^k =整数である。よって、オイラー規準により(p/q)≡p^{(q-1)/2} (mod q)を適用す ることができ、次の合同式が成り立つ。 (p/q)≡(-1)^[{(p-1)/2}{(q-1)/2}]・S^(q-1) (mod q) □  ここでの目標は平方剰余の相互法則が成り立つことを示すことなので、上記の 定理と(合同式版の)平方剰余の相互法則を比較すると、次の命題が成り立つこ とが示されればよい。実際にこの命題が成り立つことを証明する。 [定理]S^(q-1)≡(q/p) (mod q) [証明]右辺のルジャンドル記号は写像λ_pを使って書き直すと、次のようになる。 S^(q-1)≡λ_p([q]) (mod q)  ここで、a_k:=λ_p([k])ζ^kとおく。ただし、a0=0とする(矛盾しない)。  するとガウスの和の定義より、S=Σ[k=0;p-1]a_kが成り立つ。  また、(X1+…+X_n)^p-(X1^p+…+(X_n)^p)=p・F_n(X1,…,X_n)が成り立つことが 知られている。この式においてp=q,n=pとし、文字X_iにa_(i-1)を代入すると次が 成り立つ。 (a0+…+a_(p-1))^q-(a0^q+…(a_(p-1))^q)=q・F_p(a0,…,a_(p-1)) ←(1) ・左辺の第1項=(a0+…+a_(p-1))^q=S^q ・左辺の第2項=(a0^q+…(a_(p-1))^q)=Σ[k=0;p-1](a_k)^q ←(2)  ところで、F_p(a0,…,a_(p-1))∈Z[ζ]が成り立つ。  この理由は次の通りである。b_k:=λ_p([k])とおくと、複素数a_kは多項式b_k X^kの文字Xにζを代入した値である。  そこで、多項式g=Z[X]を、g:=F_p(b0,b1X,…,b_(p-1)X^(p-1))とすれば、F_p( a0,…,a_(p-1))は文字Xにζを入れた値、即ちg(ζ)と一致する。つまり、F_p(a0 ,…,a_(p-1))=g(ζ)∈Z[ζ]である。  一方、(2)のΣの中は(a_k)^qは次のように展開できる。 (a_k)^q =λ_p([k])^q・ζ^(kq) =λ_p([k])・ζ^(kq) (∵λ_p([k])=±1∧q:奇数) =λ_p([kq])λ_p([q])・ζ^(kq) (∵λ_pの準同型性∧λ_p([q]^2)=1)  よって、(2)は次のように展開できる。 (2) =Σ[k=0;p-1](a_k)^q =Σ[k=0;p-1]λ_p([kq])λ_p([q])・ζ^(kq) =λ_p([q])Σ[k=0;p-1]λ_p([kq])・ζ^(kq) =λ_p([q])S (∵Sの定義)  よって、(1)と比べて次が成り立つ。 S^q-λ_p([q])S=q・F_p(a0,…,a_(p-1)) S^(q+1)-λ_p([q])S^2=q・F_p(a0,…,a_(p-1))・S (両辺にSをかけた) {S^(q+1)-λ_p([q])S^2}/q=F_p(a0,…,a_(p-1))・S ←(3) (両辺からqを割った)  ここで、S^2:整数∧q+1:偶数より、S^(q+1):整数である。つまり、(3)の左 辺の分子は整数である。  よって、(3)の左辺は有理数である。  SとF_p(a0,…,a_(p-1))はどちらも環Z[ζ]の元なので、乗算した結果である(3) の右辺はZ[ζ]の元である(演算は閉じているから)。よって、(3)の左辺も整数 のはずである。なぜならば、「環Z[ζ]に含まれる有理数は整数である」(Z=Q∩ Z[ζ])が成り立つことが知られているからである。  (3)の左辺を整数tとすると、(分子)=S^(q+1)-λ_p([q])S^2=t・qになる。 S^(q+1)-λ_p([q])S^2=t・q S^2{S^(q-1)-λ_p([q])}=t・q  S^2=λ_p(-1)・p=(0 or 1 or -1)・p=(pの倍数)より、(q,S^2)=1である。 このことより、q|S^(q-1)-λ_p([q])が成り立つ。よって、S^(q-1)-λ_p([q])≡ 0 (mod q)である。 □  以上の2つの定理により、次の定理が直ちに得られる。 [定理](p/q)≡(-1)^[{(p-1)/2}{(q-1)/2}]・(q/p) (mod q)  さらに、合同式の両辺はいずれも±1なので、等号が成立する。つまり、平方剰 余の相互法則が成り立つことがわかった。 ■0x06.) おわりに  先月号では平方剰余仮定に基づく暗号技術か、Solovay-Strassenの素数判定法 について紹介すると言ってましたが、ルジャンドル数列の離散フーリエ変換やガ ウスの和について寄り道しすぎて1ヶ月経ってしまったので、WBにガウスの和を取 り上げました。  ガウスの和は数学的に重要な概念の1つで、円分体における類数の計算や正17角 形の作図法などに応用することもできます。こうしたガウスの和の応用に興味が ある人は『ガウスの和 ポアンカレの和』(正17角形の作図問題については『近 世数学史談』の方が手軽)や『初等整数論講義』を参考にしてください。  次回こそは暗号に関するネタが書きたいと思っています。  ではまた来月会いましょう。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x --- 第6章: お知らせ --- x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ○Wizard Bible(http://wizardbible.org/)では随時、執筆ライターを募集して います。  扱う内容のテーマは広義での「under ground」です。例えばハッキングやセキ ュリティからピッキングなどと幅広い内容を考えています。また特殊な職業や趣 味の解説などでも構いません。  一回きりでも構いません。また必ず毎回連載する義務もありませんので、でき る範囲で構いません。気軽に声をかけてください。 ○Kenji AikoさんがQ&Aを作ってくれました。初めて参加する人でもわかりやすく 書かれていますので、参考にしてください。 http://wizardbible.org/wbQandA.html ○Wizard Bibleに参加希望の方は気軽にメール(ipusiron@gmail.com)ください。 x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ---- 第7章: 著者プロフィール --- x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x x0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0xx0xXx0x ■金床 ●Job: プログラマー ●Web: http://guardian.jumperz.net/, http://www.jumperz.net/ ●Mail: anvil@jumperz.net ●Comment:  以前はどの会社のサーバーにしようか迷いつつ色々なベンダーのウェブサイト を見て回ったりしていたのですが、最近はすっかりDELLに固定されてしまいまし た。祭りの際に出てくるサーバーが安すぎて話になりません。安かろう悪かろう かと思いきや使ってみると非常によくできていて、故障もぜんぜん起こりません。  先日はOpteronが2個載った8コアのサーバーが6万円になっており、速攻で購入 しました。がっつり走らせると250Wほど喰うようです。安いとはいえ、これらの サーバーはデータセンターに置くことを前提としたラックマウントタイプのもの であり、ファンは爆音でかなりうるさいです。そこの部分を少しだけ勘違いして しまった気の毒な知人たちが会社に1台買ってしまったため、その会社では会議室 までファンの音が聞こえるようです。「うるさくて困っているようなら引き取る よ?」と悪魔のささやきを続けている今日このごろです。 ●無人島に1つだけ希望するものを持っていけるとしたら何を持っていくか?  MP3プレーヤーを持っていこうかと思いますが、イヤホンがないと役に立ちませ ん。また、バッテリーが切れてしまったらそれっきりであることを考えると、小説 がいいような気がします。…というか無人島がどんな無人島かによって事情が大 きく異なります。つまり、サバイバルになるようならナイフかライター。猿島な らラジカセ。こうですかね。 ■suma ●Job: Student ●Web: http://d.hatena.ne.jp/obfuscation/ , http://www.obfuscatism.net/ ●Mail: suman.orega.warukatta@gmail.com ●コメント:  お久しぶりです。最近の私の特技はやるやる詐欺と書く書く詐欺みたいな感じ で、ブログに「やる」と書いてそのまま放置してることが多いようです。ちなみ に最近パッカー開発はやらず、昨年は難読化のことばかりやっていました。今年 はネットワークプログラミングをやらざるを得ない状況に追い込むことに成功し たので、しばらくはネットワークな何かとかバイナリエディタの開発に力を入れ る予定です。  最近は自宅のサーバがOpenSolarisに移ったり、開発マシンがMacBookに移った りとWindowsプログラミングやらなくなってきてます。それでもWindows 7の発売 が待ち遠しいですね。また、Javaでソフトウェア開発する機会があるのですが、 EclipseやNetBeansでの開発が不満でVimしか使ってません。Visual Studioの偉大 さが身にしみます。 ●無人島に1つだけ希望するものを持っていけるとしたら何を持っていくか?  特になさそうです。 ■黒崎ゆうき ●Job: Student ●Web: http://www.infoyuki.net/ ●Mail: yuki@infoyuki.net ●Comment:  はじめて記事を執筆させてもらいました。  初めて、WBに投稿をしようと思ったのは、今年の1月頃でした。ですが今まで、 こういった記事を書く機会がなかったので作業は思うように進まず、結局半年程 たった今回が初投稿になってしまいました・・・。  今後も、ハニーポットやその他コンピュータに関する記事を書いていきたいと 思うのでどうぞよろしくお願いします。また、私のメールアドレスへ感想やクレ ーム等送っていただけると幸いです。 ●無人島に1つだけ希望するものを持っていけるとしたら何を持っていくか?  何が無いと生きていけない?と聞かれると、いつも「コカ・コーラ」と答えて います。なので、無人島にもコーラを持っていくでしょう。滞在する期間分。 あのシュワッというのど越し、後引く甘さ・・・たまりません。日常でも、毎日の ように飲むので"ダイエット"がついた方のコーラですけどね(笑)。 ■理事長(Rudolph von Gartheimer) ●Job:Der vollstreckende Vorsitzender des zentralen Exekutivkomitees ●Web:http://www.gartheimer.com/ ●Mail:gartheimer@gmail.com ●Team(Group):宗凶法人 愛連合 ●Comment:  今回の記事は連合でも浮き名を流す、専守防衛委員会大尉殿に原稿を寄せて貰 ったのを、一部加筆修正させて頂きました。例によってメルマガの、焼き直しで すが。  まぁ、ワタシは浮気などする前に、破局しましたが=□○_ 〜□○0  それにしても最近、暑くなってきましたね。クーラが欠かせない日々です。 ●無人島に1つだけ希望するものを持っていけるとしたら何を持っていくか?  ネットが出来るPCと言いたいところですが、無人島にネットがあるはずもなく、 もし持って行けるのなら、やはり、本ですね。一冊となると…聖書になるでしょ うか?我が闘争でもいいんですが…。 ■IPUSIRON ●Job: プログラマー ●Web: http://akademeia.info ●Mail: ipusiron@gmail.com ●Comment:  最近昆虫のようにゲームをやるということが少なくなってきました。事実ここ 10日間ぐらいXboxを起動していません。PrototypeやBATTLE STATIONS: Pacificな どを最近購入したはずなのに…。  しかしながら、コールドオブデューティー4、HALO3、Oblibion、Fallout3のと きは暇があればいつもやっていたことを考えると、やるゲームの面白さが大きく 影響しているのでしょうか。Oblibionなどを小さい画面でやると、文字がつぶれ て読めないにもかかわらず、やり続けていました。  熱中できるようなゲームを知っていましたら是非教えてください。ゲームより もとパチンコをする時間の方が長くなってしまいそうです(笑)。ゲームに熱中 すればパチンコから脱却できるのではと思っています(どちらも止めるというの は今のところありえない)。 ●無人島に1つだけ希望するものを持っていけるとしたら何を持っていくか?  単に決められた期間を無人島に滞在するだけなのか、遭難した結果無人島に漂 流し救出される時期も不明なのかということで答えも変わってくるかもしれませ ん。数年滞在するだけならばいつかは読みたいと思いつつ積読になっている数学 書を持って行きたいです。読み進めるのに時間がかかり、繰り返し読むことがで きるからです。本気モードでサバイバルするならば、ナイフでしょうか。火に関 しては色々なおこしかたがあるからなんとかなるのではと思っています。  正直なところこれは質問が悪いと思いますが、実際にこのような変な質問が就 活時の試験やグループディスカッションのテーマで使われています。