2011年2月26日土曜日

ウイルスバスターとLinuxインストールの関連性

Linuxがインストールされない。

僕は様々な原因を考えていた・・・
・CDの書き込みが正常に行われていない?
・機種との互換性?
・BIOSでの設定が違う?

結局、『市販されているアンチウイルスソフトとWinDVDは同時に起動できない』という理由でした。

関連:http://www.fmworld.net/biz/fmv/support/fmvmanual/0504-0509/5621c/q_trouble24.html


僕のWindowsには、ウイルスバスターがインストールされているので、停止させることで、CentOSを書き込んだDVDを読み込むことができました・・・orz

2011年2月21日月曜日

HTTPSとは

2011/02/21 大幅改訂

HTTPSという言葉は誰もが一度は聞いたことがあるでしょう。
今回は、HTTPSについてどういうものかを説明します。

課題;
暗号通信で重要なのは、「なにを暗号化したのか」と「誰との通信を暗号化したのか」です。

では、https通信は「なにを暗号化して」「誰と誰の間の通信を暗号化している」のでしょうか?


HTTPSとは
HTTPS (Hypertext Transfer Protocol Secure)とは、HTTPによる通信の安全性を向上させる目的として幅広く使われています。代表的なものとして、SSL(Secure Socket Layer) や TSL(Transport Layer Security) を用いた通信プロトコルであるHTTP over SSL/TLSがあります。 今回は、HTTPSといえば、HTTP over SSL/TLSということで解説したいと思います。

HTTPSは、サーバ認証・クライアント認証・メッセージの暗号化・セッション管理を行うことによって、盗聴やなりすましによる攻撃から保護します。

WebブラウザのURL入力画面に" https:// " がでているのが分かるでしょうか。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-02-1722.40.34-2011-02-21-06-10.png

これによってWebブラウザとWebサーバ間の経路における通信内容の盗聴・改ざんの危険性はほぼ回避できます。

仕組みは簡単です。HTTPSはブラウザに組み込まれていて、ユーザの要求に対しWebサーバーから返されたWebページをSSL/TLSで暗号化・復号化する、ということです。 HTTPSベースでの通信が行われる場合、ホームページのURLも "https:// " に変わります。

流れとしては、
  1. SSL/TLSをサポートしているブラウザで閲覧する
  2. ブラウザとWebサーバーがハンドシェイクを行い、共通鍵を生成する
  3. 共通鍵をそのセッションだけに有効な鍵として使用し、データのやり取りを暗号化する


SSL/TLSとは
SSL (Secure Socket Layer) /TLS (Transport Layer Security) は、暗号化処理・通信処理をするプロトコルで、アプリケーション層とトランスポート層の中間に位置づけられます。

解答
■何を暗号化しているのか
HTTPサーバーの間のリクエストとレスポンスのやりとりを暗号化しています。

■誰と誰の間の通信を暗号化しているのか
クライアント(Webブラウザ) と サーバ(Webサーバ)の間の通信です。


<メモ書き>(機会があったら調べる)
■HTTPSの略称って統一されていないのかな?
・Hyper Text Transfer Protocol over SSL
http://www.atmarkit.co.jp/aig/02security/https.html
・Hypertext Transfer Protocol Security
http://e-words.jp/w/HTTPS.html
・Hypertext Transfer Protocol Secure
http://en.wikipedia.org/wiki/HTTPS

使い方によって、適切な言葉があるのだから良いとは思うけども・・・
それとも、全く同じ意味で、略称だけ一緒なのか?

■ハンドシェイクって簡単にまとめたけど、結構複雑。
→自分もまだ理解していないから、もっと調べないと。

2011年2月19日土曜日

自宅サーバー奮闘記

といっても先輩のサーバーですが。

初めてファイルをアップロードしました。
環境変数を調べたりする、Perlのプログラムです。

とりあえずFTPを使ってアップロード。問題が出てきました。
"permission denied" エラーです。

ひとまず、自分専用ユーザーのディレクトリにアップロードして、
SSHでrootユーザ使って目的の場所まで移動させました。

ん、大変だなー。設定を簡単にしてください。


しかし、自宅サーバーで管理している人はセキュリティで色々苦労するんだな、と思いました。
アップロード後のパーミッション変更もしかりです。


基本的にCGIスクリプトはパーミッションの設定を「755」にするのが普通ではないでしょうか。
僕もローカルの環境では、そうしていました。
ただ調べてみるとセキュリティの面で非常に弱くなるみたいです。

参考:http://www.e-provider.jp/server/cgi.html

なので、アップロード後は、パーミッションの設定を変更することを意識するようにします。

2011年2月14日月曜日

PythonでDiffie-Hellman鍵交換

PythonとDiffie-Hellman鍵交換を学んだので、実装してみよう。
共通鍵の値が同じになるってことを確認するだけのコードですが。

細かいところはあまり気にせず実装したので、大きな数だとオーバーフローするし、負数はエラーが出ます。

Diffie_Hellman.py

#encoding: utf8

'''素数Xと整数Yは共通認識である'''
def dh_algorithm():
        # もうあらかじめ値を決めておこう。
        print "共有情報として、素数 X = 113, 素数 Y = 2 があります"
        Prime_X = 113
        Prime_Y = 2

        # Aさんがランダムに選んだ数p と Bさんがランダムに選んだ数q
        random_p = int(raw_input("Aさんの乱数を入力してください : "))
        random_q = int(raw_input("Bさんの乱数を入力してください : "))

        # Aさんの公開値Pを求める
        P = create_publicKey(Prime_X, Prime_Y, random_p)
        print "\nAさんの公開値P : %d" % P
     
        # Bさんの公開値Qを求める
        Q = create_publicKey(Prime_X, Prime_Y, random_q)
        print "Bさんの公開値Q : %d" % Q
     
        # Aさんの共通鍵の値は、Bさんから送られてきた公開値を使って
        A_Z = create_commonKey(Prime_X, Q, random_p)
        print "Aさんの共有値A_Z : %d" % A_Z
     
        # Bさんの共通鍵の値は、Aさんから送られてきた公開値を使って
        B_Z = create_commonKey(Prime_X, P, random_q)
        print "Bさんの共有地B_Z : %d \n" % B_Z
     
        if(A_Z == B_Z):
                print "作成した共通鍵の値は同じです。\n"
        else:
                print "作成した共通鍵の値は等しくありません。\n"
     
      
def create_publicKey(prime_X, prime_Y, random):
        '''共有情報である素数Xと素数Yと、自身で定義した乱数Zで、公開値Pを作成する'''
        P = pow(prime_Y, random, prime_X)
        return P
                                     
             
def create_commonKey(prime, publicKey, random):
        '''共有情報である素数と、相手の公開値と、自身で定義した乱数と、 を使って、共通鍵Zの値を生成する'''
        Z = pow(publicKey, random, prime)
     
        return Z
                


ターミナルで実行しました。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-02-1423.18.15-2011-02-14-23-00.png

実際は、サーバーとのやり取りだから、もっと複雑なんだろうけど、共通鍵の値が同じになることを確かめました。

それにしても、暗号鍵理論って面白いな、って思う今日このごろ。


Diffie-Hellman 鍵交換

今回も面白い課題をいただきました。
前回、『公開鍵暗号方式とCA(認証局)』の模範解答で以下の説明をしたことを覚えていますか?

(1) 共通鍵暗号を運用するときに予想される困難はなにか?
・送信に先立って秘密鍵を安全に交換する手段が必要となる
        (理由)共通鍵は、暗号鍵と復号鍵が同一であるという特性から


オフラインならば安全に鍵をやり取りできますが、可能ならばオンラインのほうがいい、という点は良いですか。では、今回はどうすれば、共有鍵をオンラインで安全にやりとりできるか、考えていきましょう。

課題:
安全な鍵のやりとりとして、DH ( Diffie - Hellman ) 鍵交換というものがあります。
DH鍵交換を使うことで安全に共通の鍵を保有できるのであれば共通鍵暗号をオンラインで安全に使えるように思えます。

セキュリティ上の問題はあるでしょうか?




Diffie-Hellman鍵交換とは
まずは、Diffie-Hellman鍵交換がどんなものなのかを押さえましょう。

<歴史的背景>
1976年に、ホィットフィールド・ディフィー (Whitfield Diffie) と マーティン・ヘルマン (Martin Hellman) によって発明されたアルゴリズムです。当時は、まだ公開鍵暗号方式がなかった時代なので、どのようにして共通鍵を安全に交換するのか、が模索されていました。


<Diffie-Hellman鍵交換の手順>
次の4ステップで構成されます。
  1. 共有情報を定義する(素数X, 素数Y)
  2. 定義した共有情報と自身で定義した乱数値(秘密値a)から公開情報(公開値P)を作成する
  3. 秘密文書を交換したい相手へ公開情報(公開値P)を送信する
  4. 相手から送られてきた情報(公開値Q)と自身で定義した乱数値(秘密値a) から共有値(共有鍵)を作成する
iPhoto20110214224150-2011-02-14-22-10.jpg

modを理解すれば、数学的には当たり前のことです。例え、共有情報を知ってても、AさんBさんの定義した秘密値が分からなければ、Zを解くのは困難です。それも当然で、P = Ya mod X から数aを簡単に計算するアルゴリズムはまだ発見されていないからです。これは、離散対数問題と呼ばれています。



見解
セキュリティ上の問題はあります。

有名な攻撃方法としては、 man-in-the-middle攻撃というものがあります。
これは、Diffie-Hellman鍵交換をしている2人の間に、悪意のある第3者が割り込んで、なりすましを行うことです。man-in-the-middle攻撃については次回解説します。


参考)

『始めてのコンピューターサイエンス』第03章 演習問題

練習問題
(1) 次の式が、それぞれどのような値を返すでしょうか

>>> 'Comp' 'Sci'
'CompSci'
>>> 'Computer' + ' Science'
'Computer Science'
>>> 'H2O' * 3
'H2OH2OH2O'
>>> 'CO2' * 0
''



(2) 適当なクォートとエスケープシーケンスを使って、Python 文字列として表現してください

>>> print 'They\'ll hibernate during the winter.'
They'll hibernate during the winter.
>>> print '"Absolutely not," he said.'
"Absolutely not," he said.
>>> print '"He said, \'Absolutely not,\'" recalled Mel.'
"He said, 'Absolutely not,'" recalled Mel.
>>> print 'hydrogen sulfide'
hydrogen sulfide
>>> print "left" + "\\" + "right"
left\right



(3) トリプルクォートではなく、シングルクォートかダブルクォートを使って次の文字列を書き直す
‘’’A
B
C’’’


>>> print "'''A\nB\nC'''"
'''A
B
C'''



(4) 組み込み関数の len を使って、空文字列の長さを調べて下さい
>>> len("")
0



(5) それぞれ数を参照するメッセージをx, y変数を使って表現しなさい

>>> x = 3
>>> y = 12.5
>>> print "The rabit is %d." % x
The rabit is 3.
>>> print "The rabit is %d years old." % x
The rabit is 3 years old.
>>> print "%d is average." % y
12 is average.
>>> print y, " is average."
12.5 is average.
>>> print y, "*", x
12.5 * 3
>>> print y, "*", x, "=", x * y
12.5 * 3 = 37.5



(6)以下の出力を得るためには、どのような書式文字列を使えば良いか?
a) “ “ % 34.5 => “34.50”
b) “ “ % 34.5 => “3.45e+01”
c) “ “ % 8 => “0008”
d) “ “ % 8 => “8 “

>>> "%.2f" %34.5
'34.50'
>>> "%.2e" %34.5
'3.45e+01'
>>> "%04d" % 8
'0008'
>>> "%d " % 8
'8 '



(7) raw_inputを使ってユーザーに数値の入力を促し、入力された数値をfloat型のnum変数に格納して、numを表示してください。

>>> string = raw_input()
3.4
>>> num = float(string)
>>> num
3.3999999999999999

なんでだろ?文字列をfloat型に変換すると、何かが起きている。また調べてみよう。



(8) Pythonで2つの文字列を隣り合わせで入力すると、Pythonは自動的に2つの文字列を連続します。

しかし、同じ文字列を変数に格納してから変数を横に並べると、構文エラーになります。(以下参照)
Pythonがこれを認めないのは、なぜだと思いますか?

>>> 'abc' 'def'
'abcdef'
>>> left = 'abc'
>>> right = 'def'
>>> left right
File "<stdin>", line 1
left right
^
SyntaxError: invalid syntax

<見解>
”変数に格納する”だからです。”right”,”left” は変数を格納する箱だと思えばいいです。箱は、どのように扱われるべきかを示さないといけない、といった方が人間にとって都合が良いと思います。
>>> right
'def'
>>> left
'abc'
>>> left = right
>>> left
'def'
>>> left = 'abc'
>>> left + right
'abcdef'



(9) 文字列に負数を掛け合わせときに、空文字列を返すのではなく、エラーを起こすべきだと考えている人々がいます。彼らがそのように考える理由を説明しなさい。また自分なりの意見を説明しなさい。

>>> s = 'Taichi Shindo'
>>> s * (-1)
''

<見解>
文字列に(-1)を掛けて、空文字列が返ってくる。どういうことが内部で行われているのかがよく分からないです。その内部で起こっていることが人間にとって理解できないものなら、エラーで返す方が都合がいいです。


2011年2月13日日曜日

ターミナルすげー

ここ最近ターミナルのすごさを実感しつつあります。
Pythonをほとんどターミナルで動かしたことで、ターミナルの見方が変わりました。

ターミナルとは、macで標準インストールされているアプリケーションです。
これを、動かしていると、一般人から『パソコンできる人や』、と思われることができます。

%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%882011-02-1322.31.48-2011-02-13-22-28.png

バイト先の先輩が、『Linuxをインストールして自宅サーバーにしたから一緒に何かを作ろうぜ!』誘われたので、やることにしました。HTMLやParlを勉強していたので、ちょうど良かったです。

そのために、SSHとFTPで設定する必要がありました。(←あまり知らないが・・・)

SSHとは、ネットワークを介してインターネット上に置かれているサーバにログインしたり、 コマンドを実行したり、ほかのマシンへファイルを移動 (コピー) したりするためのプログラムです

FTPとは、自分の目の前にあるマシンから遠く離れた場所にあるマシンにファイルを送り込んだり、その逆に遠く離れた場所にあるマシンからファイルをコピーするための仕組みです。遠く離れたサーバーにhtmlファイルをアップロードしたりします。

つまり今回は、まずSSHで、インターネット上に置かれている先輩のサーバーにログインして、ユーザーを作成し、その後、作成したユーザーID/PWを使って、FTPを接続して利用するという作業をしました。


さて、macでどうやってやろうかな・・・ネットで調べていると、素晴らしいページが
http://network.station.ez-net.jp/client/remote/ssh/mac.asp
結構時間がかかると思っていたのに、一瞬で終わりました。

ターミナル様様です。

これから、先輩のサーバーをいかに負荷をかけて破壊していくか、試行錯誤の日々が続くことになるでしょう。
SSHを使えば、実は一発で破壊できるのだけども、利用しないでおきます。(←誰でもできるから。)

2011年2月12日土曜日

ブログを英語と日本語で分けた

今日ブログを2つに分けて登録しました。

英語でのブログと、日本語でのブログです。
日本語版:http://t12488mac.blogspot.com/
英語版:http://t12488mac-english.blogspot.com/

日々思っていたことがあって、一つのブログに日本語と英語が混在していたら読みづらいのではないか?
でも、英語を勉強したいし、せっかくだからブログに載せたい。
ということで、英語で書く用のブログを立ち上げました。
後々には、facebookに移行するのは、英語版だけにしていくつもりです。

まだ、日記程度の英語しか書けないけど、専門のことも英語で書けるようになりたいです。

ひとまず、1つのブログ内での言語を統一することにして、日本語でのプログの右下にRSSフィードに英語版のブログの記事を載せるようにしました。英語版も同様です。


やってみた感想は、結構面倒くさいかもです。
また、前の形式に戻るか別の方法を取るかもだけど、ひとまず様子見てみます。

『始めてのコンピューターサイエンス』第2章 演習問題

Pythonを勉強し始めたものの、どうアウトプットすれば良いのだろうか....

『始めてのコンピューターサイエンス』に演習問題が載っていたので、自分なりの解答を導くことにしてみました。

練習問題
(1) 次の式は、それぞれどのような値を返すでしょうか。Python に式を入力して答えを確かめてください。
>>> 9 - 3
6
>>> 8 * 2.5
20.0
>>> 9 / 2
4
>>> 9 / -2
-5
>>> 9 % 2
1
>>> 9 % -2
-1
>>> -9 % 2
1
>>> 9 / -2.0
-4.5
>>> 4 + 3 * 5
19
>>> (4 + 3) * 5
35


(2) 単項のマイナスは、数値の符号を反転させます。同じように単項のプラスもあります。たとえば、Python は +5 の意味を理解しいます。x が -17 という値を持つとき、+x はどのような値を持つべきだと思いますか。符号には手をつけない方がよいのでしょうか。それとも絶対値関数と同じように、マイナス符号を取り除くべきでしょうか。Python シェルを使って、Python のふるまいを確かめてください。
>>> def f(x):
... return +(x)
...
>>> f(-17)
-17
<見解>
+について考えさせられた。僕たちは初等教育で、”+ (-17)” => “(+1) * (-17)” と考えるように教えつけられている。つまり、”- (-17)” => “(-1) * (-17)” で数値の符号が反転する。そういう考えで良いと思う。


(3) a. 新しい変数tempを作り、値24を代入してください
b. tempの値に1.8をかけ、32を加えて、摂氏から華氏に編案してください。
そして、計算結果の値をtempに代入してください。

>>> temp = 24
>>> temp = temp * 1.8 + 32
>>> temp
75.200000000000003


(4) a. 新しい変数 x を作り、値10.5を代入してください
b. 新しい変数 y を作り、値4を代入してください
c. x とy の合計を計算し、結果をxに代入してください

>>> x = 10.5
>>> y = 4
>>> x = x + y
>>> x
14.5
>>> y
4


(5) xの値が3の場合、 x += x - x という文をPythonが評価するときに起きることを箇条書きにして説明してください。
<見解>
・新しい変数xを作り、値3を代入
・x - x を評価する (結果は0)
・上で評価した値をxに加算する
>>> x = 3
>>> x += x - x
>>> x
3


(6) 関数名を付けるときの自分の考えを述べなさい
<見解>
例:convert_fahrenheit_to_celsius
カ氏温度をセ氏温度に変換する際の関数名。僕は、動詞を関数名の頭文字に持ってくるほうが、具体的に何を表す関数名かがすぐに理解できるので、そうするようにしています。


(7) アメリカでは、1ガロンあたりのマイル数で車の燃費を測ります。しかし、メートル法では、100kmあたりのリットル数で計算されるのが普通です。
  1. 1ガロン当たりのマイル数から100km当たりのリットル数に変換するconvert_mileageという関数を書いてください
  2. 20, 40 MPG(マイルパーガロン)について、関数が正しい値を返すことをテストしてください
  3. 正しい値を調べるためにどのような方法を使いましたか?
<solute_problem_2_7.py>
#encoding: utf8

def convert_mileage(mile):
        
'''1ガロン当たりのマイル数から100km当たりのリットル数に変換する'''
      
        # 1ガロンからリットル数に変換 (1ガロン = 約3.785リットル)
        # 1マイル数からkmに変換(1マイル = 約1.609メートル)
        # 数学的に解いてみる
      
        convert_literage = ( 3.785 * 100) / ( 1.609 * mile )
      
        
return convert_literage

>>> solute_problem_2_7.convert_mileage(20)
11.761963952765694
>>> solute_problem_2_7.convert_mileage(40)
5.8809819763828468

Google 電卓機能で確かめました。
        20 (mile / gallon) = 11.7607292 liter/100km
        40 (mile / gallon) = 5.88036458 liter/100km



(8) 仮引数と実引数の違いを説明してください
仮引数:関数定義時に使用される引数
実引数:その関数を実際に使用するときに関数に引き渡される引数

上の問題を例とすると
def convert_mileage(mile):  → mile が仮引数
>>> solute_problem_2_7.convert_mileage(20) → 20 が実引数

(参考:http://www.cc.kyoto-su.ac.jp/~yamada/ap/parameter_argument.html)


(9)
  1. km単位の距離と車の燃費を表す値を引数として、その距離を移動するために必要なガソリンの量をリットル単位で返す liters_needed という関数を定義してください。litters_needed関数は、前の問題で作ったconvert_mileage関数を呼び出さなければなりません
  2. liters_needed(150, 30) が 11.761938... 、liters_needed(100, 30) が 7.84129.... を返すことを確かめて下さい。
  3. 100と30を引数として、liters_needed を呼び出したとき、convert_mileageの引数はいくつですか?
  4. liters_needed(100, 30) という関数呼び出しは、convert_mileage 関数呼び出しを引き起こしますが、これら2つの関数のうち、さきに実行を終了するのはどちらですか?
<solute_problem_2_9.py>
#encoding: utf8

import solute_problem_2_7

def liters_needed(kilometer, mileage):
        
'''km単位の距離と車の燃費を表す値を引数として、その距離を移動するために必要なガソリンの量をリットル単位で返すliters_neededという関数を定義します'''
      
        # 与えられた燃費をもとに、100kmあたりのリットル数を求めます
        convert_mileage = solute_problem_2_7.convert_mileage(mileage)
      
        
# 与えられたkm単位の距離をもとに、必要なリットル数を求めます。
        liters_needed = (convert_mileage * kilometer) / 100
      
        return liters_needed


>>> solute_problem_2_9.liters_needed(150, 30)
11.761963952765694
>>> solute_problem_2_9.liters_needed(100, 30)
7.841309301843796

3) convert_mileageの引数は30
4) convert_mileageがさきに実行を終了する

(10) 組み込み関数abs, round, pow, int, float を使って次の式を解きなさい
>>> pow(3,7)
2187
>>> int(34.7)
34
>>> int(round(34.7))
35
>>> float(abs(-86))
86.0

『始めてのコンピューターサイエンス』O'REILLY出版

51WbHnaX0tL._SL500_AA300_-2011-02-12-01-01.jpg

今、ちまたで話題の『Python』。←ぼくが時代遅れ?
何やら、JavaやC++に並んで、Googleの3大プログラミング言語らしいぞ。
そんな話を聞いて、Pythonの入門書買いました。


一通り、読んでプログラミングコードを書いて動かした感想。
とても分かりやすい!←本書の内容もだけど、Pythonの言語が。


まず、Pythonを書いて動かすまでに手間がかからなかったことです。
これは、どの言語でもいえることなのですが、プログラミング言語を広く普及できる要素として、誰でも簡単にセットアップできること、が挙げられます。
Pythonは、ダウンロードしてすぐ、ターミナルなりXcodeなりで簡単に実行できました。


次に、視覚的にプログラミングコードを読みやすくなったことです。
Pythonでは、“{ }” がほとんどなくなり、インデントで整理するようになっています。

カ氏温度からセ氏温度に変換するプログラムをPythonでは以下のように表現できます。
#encoding:utf8

'''温度を操作する関数'''

def to_celsius(t):
        
'''カ氏からセ氏に変換します'''
        return round((t - 32.0) * 5.0 / 9.0)

def above_freezing(t):
        
'''セ氏表現の温度が氷点下以上ならTrue, そうでなければFalseを返します'''
        return t > 0

これがJavaだと以下のようなコードになります
public class test {

        
public float to_celsius(float t){
                
return round((t-32.0) * 5.0 / 9.0);
        }
       
        
public boolean above_freezing(float t){
                
if(t > 0){
                        
return true;
                }
else{
                        
return false;
                }
        }
}

Pythonは、中括弧やセミコロンがなくなり、だいぶ見やすくなったことが分かります。


とくに、プログラミング言語を学び始める人は、Pythonを勉強した後に、JavaやC++を勉強すると効率が良いと思います。
なんといっても、データベースやオブジェクト指向やGUI といったこともPythonで学べるので。

さすがは、Googleで使われている言語だけはあるな、と思いました。
まだ僕は、Pythonで出来ることが思いつかないので、もっと勉強しないとです。

2011年2月10日木曜日

ネットワークセキュリティを学ぶ

{diary}
ブログを本格的にスタートして、1ヶ月とちょっと。始めて良かったな、と思っています。
偏った生活をしているので、どうしても話題がコンピュータの話ばかりになってしまいますが。


先日、ブログのコメントから、ネットワークに携わっていた人とメールのやり取りをするようになりました。
僕にとっては、興味があるけども未知の分野であるネットワークに詳しい人と出会えたことを、嬉しく思っています。

僕にネットワークに関する課題を与えてくれ、考えさせてくれます。
毎日課題について考えるのが楽しく、知識が定着していくのを感じます。

これからもっともっと勉強して、今度は僕が後輩に教える側になりたいです。
とりあえず今は、吸収した知識をブログへ載せていきます。

公開鍵暗号方式とCA (認証局)

公開鍵暗号方式と認証局を学ぶ前に、以下の課題に取り組んでみましょう。
『公開鍵暗号の問題点と認証局でどう解決するのか』が理解できることでしょう。

課題:
公開鍵暗号はペアになった秘密鍵と公開鍵を使う暗号方式です。

以下の問題を解いてください。
(1) 共通鍵暗号を運用するときに予想される困難はなにか?
(2) その困難は公開鍵暗号を使うことでどのように解決できるか?
(3) 公開鍵暗号を運用するときにどのような問題点が発生しうるか?


単語の確認:
・共通鍵暗号方式
        暗号化と復号に同じ鍵を利用する暗号方式のこと
       
・公開鍵暗号方式
        公開鍵と秘密鍵の2つで1組となるペア鍵を使って、暗号化と復号を行う暗号方式


模範解答:
(1) 共通鍵暗号を運用するときに予想される困難はなにか?
・送信に先立って秘密鍵を安全に交換する手段が必要となる
        (理由)共通鍵は、暗号鍵と復号鍵が同一であるという特性から

・共通鍵の特性から、多くの鍵の種類が必要となる → 鍵の管理が困難
        (理由)暗号の文書のやり取りをする人の数だけ鍵が必要だから

(2) その困難は公開鍵暗号を使うことでどのように解決できるか?
・公開鍵から秘密鍵の作成が不可能という特性から、安心して公開鍵を公開することができる

・公開鍵は必要なときに入手できるので、秘密鍵の1つ、もしくは、ペア鍵の2つを管理すればよい
        →鍵の管理が容易になる

(3) 公開鍵暗号を運用するときにどのような問題点が発生しうるか?
・正しい公開鍵を手に入れているのかを判断するのが不可能
        →悪意ある第三者が、偽った公開鍵を公開している可能性がある


認証局 (CA : Certificate Authority) :
(3)の問題を解決してくれる役割を果たしているのが認証局です。

自分の公開鍵の正当性を証明するため、信頼のおける第三者機関である認証局に、公開鍵の正当性を証明してくれる証明書を発行してもらいます。もちろん、証明書を発行する前に本人であるかの審査はきちんとしています。

認証局(CA)が証明書を発行することで、公開鍵の正当性を証明する仕組みをPKI (Public Key Infrastructure : 公開鍵基盤)といいます。