公開鍵と秘密鍵のどちらで暗号化するのか

先日受けた安全確保支援士試験で公開鍵か秘密鍵かを選ぶ問題があった。

あまり自信がなかったので翌日WEBで検索していたら、自分の回答が間違っている、と愕然とした。

公開鍵暗号方式とは、暗号通信をおこなうときの受信者が、暗号化するデータを送信する相手に対し公開鍵を送付し、送信者はその公開鍵を用いてデータを暗号化して送信し、受信者は秘密鍵でそれを復号する方式である。

昨日の試験で、私は「秘密鍵は公開できないからそれで復号できない」と考えたことを覚えていたのだが、公開鍵で復号できるのなら暗号化の意味がないではないか!

しまった!

しかも、同じような問題が2回出ていて同じように考えた。

これを全部間違えていたとしたら、もうアウトだ。

というか、そもそもこんな単純なことを理解していないようではたとえ合格してもセキュリティの専門家を名乗ることはできない...

検索すると「秘密鍵で暗号化するという間違った解説が蔓延している」という記事がいくつも出てきた。

...が、さらによく調べると、「秘密鍵で暗号化(この言い方は微妙なのでカッコをつける)」する場合もあるらしかった。


そして、問題を見直してみると、

「xxxを用いて署名を作成」
「xxxを用いて署名を検証」

となっていた。

2か所ともに。


これは公開鍵暗号化ではなく、デジタル署名の話だ。
だから、署名を作成するのに用いるのは秘密鍵で、検証するのは公開鍵であっている。


でも私は、「公開鍵で復号(検証)できてしまったら意味がないのでは?」
という疑問を抱くこともなかったので、
たとえ合格していてもあまり胸をはって「俺は安全確保支援士だ」と言うことはできない。


デジタル署名において秘密鍵を用いて署名を作成することを、「秘密鍵で暗号化」というのは厳密には正しくないらしいが、
よくわからない。
私が信頼していてよく参考にしているWEBサイトでもそういう言い方がされている。

https://www.ipa.go.jp/security/pki/024.html

IPAのデジタル署名を説明したサイトにも、「生成したダイジェストを自分の秘密鍵で暗号化します。」という記述がある。



公開鍵、秘密鍵、証明書、署名...

これらについての説明は何度も何度も聞いた(読んだ)ことがある。
が、何度聞いても、当たり前すぎるような、なんとも腑に落ちない感じがあった。

暗号化というのは他人に内容を知られないように、何かを書き換えることである。
そして、当然、それは読むことを期待する相手には解読(復号)できなければならない。

私たちがよくやるのは、データを暗号化し、パスワードをかけることだ。
そして、そのパスワードを相手に伝える。

メールの添付ファイルをパスワード付きzipで圧縮して、
後からそのzipファイルの解凍パスワードを送信する、というのはよく見る光景である。
私もよくやる。

その際によく言われるのが、「ファイルを添付したメールにパスワードを記載するな」ということである。

それは宛先を誤った場合に他者にファイルを解凍されてしまうからだ。


この方式は、方式というほどのことではないくらいの簡単な方式だが、「共通鍵暗号」方式という。

私がそうなのだが、暗号化なんてこれしか方法がないんじゃないかと考える人が多いのではないだろうか。

しかし、これもすぐ気づくことであるが、共通鍵暗号方式では共通鍵を他者に知られないように、通信相手に渡す必要がある。


解読するための鍵をさらに暗号化しても、やっぱりそれを復号する鍵が必要になり、
何重に鍵をかけようと、この課題はついて回る。

その課題を解消するのが公開鍵暗号方式である。


公開鍵暗号方式では、暗号化する鍵と復号化する鍵をペアで用意する。

このとき重要なのは、二つの鍵はそれぞれ暗号専用、復号専用であるだけでなく、
当然かもしれないが、ペアになっている、ということである。

つまり、Aさんの公開鍵で暗号化したデータを、Bさんの秘密鍵では復号できない。

そしてもう一つ、復号化する鍵を他者に渡してならないことは誰にでもわかるだろう。

だがそれと同じくらい重要なのが、暗号化するために、データの送信者に対して、
受信者が公開鍵を渡さなければならないということである。

そして、そのためにさらに次の重要事項が発生する。
それは、公開鍵の内容は他者に知られてもかまわないが、
その公開鍵が暗号化したデータを送信したい相手の鍵であるかを確認しなければならない、
ということである。


物理的な鍵でたとえたいのだが、「開けるときと閉めるときで違うカギを使う」
という実例はないだろうか?

よく、南京錠の絵を使って、閉めることだけができる鍵、開けることだけができる鍵、
などと説明されるが、そんな物理的鍵はこの世に存在しない...

と思って検索してみたら、「投函できるが自分は鍵をもっていないポスト」と言っている人がいた。

なるほど、これに似ている。


誰でもポストに郵便物を投函できるが、ポストを開けることはできない。
しかし郵便物は相手に、相手だけに届かなければならない。

我々がポストに郵便物を投函するのは、それが郵便ポストであり、
それを開けて配達する郵便配達員を信頼しているからである。

公開鍵を送るというのは、ポストを設置するような行為だ。

我々はポストがポストであることを、真っ赤であるとか「ポスト」と書いてあるかとかいう程度でしか確かめないが、

電子的に暗号通信、つまり鍵(ポスト)と暗号文(郵便物)を交換する際には、第三者に証明するという方法を使っている。


その一つが、HTTPS通信で使用されるサーバ証明書である。

我々はサーバ証明書を見てそれが信頼できる発行者が発行したものであることを確認してアクセスする。
(実際にはブラウザが証明書の正当性を検証し我々はその結果を信頼している)

HTTPサイトにアクセスすると提示される証明書には公開鍵が含まれている。
アクセスする者は公開鍵を受け取り、それを使ってデータを暗号化して通信する。

そして、送信先のHTTPSサイトだけが、その暗号化したデータを復号できる。



メモ

2019-04-08-raspbian-stretch-lite.img

wpa_passphrase <ssid> <password>

sudo rm -rf /var/lib/apt/lists/*

sudo rpi-update

sudo reboot

sudo apt update
sudo apt dist-upgrade -y
sudo apt-get autoremove -y
sudo apt-get autoclean

sudo reboot

raspberry pi でWEBカメラ ~motion~

pi zero wにカメラをつけてWEBカメラにする。

パソコンで使うUSBカメラを使ったことはあったが、
Camera Module V2を使う。

pi zero wのケースはカメラをセットする穴がある。

ただし、カメラの穴があるふたをするとGPIOの金具があるので閉まらない。

金具部分があいたフタもあるのだが、それにはカメラの穴がない。

どっちかを加工すればいいのだろうが、とりあえずテープで止める。


piでWEBカメラをやる場合の定番としてmotionというソフトがある。

これは動画ではなくて、動きがあった場合のみ画像を更新するものであるが、

外の景色などを表示させるには十分である。


USBカメラの場合、カメラを接続してmotionをインストールすればすぐ使えるのだが、

Camera moduleを使う場合は、 /etc/modulesに以下の記述を追加してrebootが必要。

bcm2835-v4l2


あと、/boot/config.txtに以下の記述が必要なそうなのだが、
私の場合はすでに書いてあった。

start_x=1
gpu_mem=128

start_xって関係なさそうだけどな... まあいい。


vcgencmd get_camera を実施して、両方 1になっていること。

supported=1 detected=1


 ls /dev/video* を実行して、 video0があること。
(私の場合。10,11,12はカメラモジュールを認識しなくても出てくる)

/dev/video0  /dev/video10  /dev/video11  /dev/video12


以下でカメラの動作を確認できる。

(静止画)
raspistill -o test.jpg

-oは出力ファイル名


(動画)
raspivid -o test.h264 -t 10000

-oはファイル名、-tはミリ秒数

形式はh264とかいうものらしいのだが、
VLC media playerで再生できる。


コーデックは H264かMJPEGが指定できるようだ。

-cd, --codec    : Specify the codec to use - H264 (default) or MJPEG

raspivid -cd MJPEG -o test.mjpeg  -t 5000

が、mjpegも結局メディアプレイヤーでは再生できず。


motionは、apt install motion でインストール

apt-get install motion ではダメ、みたいなことがどこかに書いてあったが、
どっちでもできたような気がするが定かではない
(いろいろやったので)

motion.confの設定内容については情報がたくさんあるので特に書かない。


自動起動するために下記の設定をするというのがあるのだが、

/etc/default/motion に

start_motion_daemon=yes

zeroではうまくいかなかった。
psで見るとmotionは起動するようなのだが、ブラウザでアクセスすると起動していないときと同じように表示されない。

sudo motionを実行すると画面が表示されるがグレーで、
「カメラにアクセスできない」みたいなメッセージが表示される。

ログを見ると、すでに起動していてカメラが占有されている、
みたいなことらしい。

USBカメラを使った古いpiではうまく動いていたのだが.....


なので、手動起動にした。

sudo motion -b

-b はバックグラウンド起動のオプション。


psで起動確認

ps aux | grep motion
root       684 96.9  6.6 126476 25320 ?        Sl   22:31  31:29 motion -b
pi        1575  0.0  0.5   4360  1908 pts/0    S+   23:04   0:00 grep --color=auto motion

デーモン起動なので停止する場合はkillする。

もっとスマートな方法があるかな...



しばらく使って気づいたのだが、cameraモジュールはフォーカス(ピント)が手動で、
カメラのレンズ部分を回すことでおこなう。

白いプラスチックのダイヤルみたいなものが付属しているのだが、
それをレンズ部分にはめると回せる。

なくても楊枝かなんかで回せそう。

時計回りで遠くに、逆で近くにフォーカスする。



2019-04-08-raspbian-stretch-lite.img
を使い、諸アップデートをしている。

uname -aの結果
Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 armv6l GNU/Linux

raspberry pi zero W

raspberry pi zero wをセットアップする。

カメラ、ケースも買ってある。

pi zero wは、pi zeroに無線LANアダプタがついたものだ。

pi zeroも買ったのだが、やっぱりネットワーク接続は本体についていてほしい。

wなしのpi zeroだと、マイクロUSBハブをつけてそこに無線ドングルをつけねばならない。

せっかくの小さいボディなのに。


カメラは普通のpiで使うのと同じものだが、zeroのカメラインタフェースは小さい(名前は知らない)ので、ケーブルを付け替える必要がある。

そのケーブルも買っておいた。(ケースの付属品だったかな?)

先日セットアップしたpi3で使ったのと同じイメージをSDに書き込む。

使ったのはSD formatterとDD for Windows

カードを差して、電源を差す。小さいLEDが緑色にチカチカして、点灯状態になる。

これで起動しているはず....と、無線LANのSSIDとかパスワードの設定をしていない。

つながるはずがない。

調べると、以下2点を実施すればよい。

1. SDカードに ssh というファイルを作る
2. wpa_supplicant.conf ファイルを作り設定を書く

が、起動はしているようだが無線ルータのdhcpクライアントを表示してもクライアントが増えない。

おかしいな...

コマンドが実行できないのでケーブルを抜いて電源を落として、SDカードを見てみると、
さっき作ったsshとwpa_supplicant.confが消えている。

なぜだ?

仕方がないからディスプレイにつなぐか、と思ったらHDMIインタフェースがminiだ。

ケーブルがない。買ってくる。

HDMI miniケーブルでディスプレイにつなぎ、micro USBハブを介してキーボードをつなぐ。

起動ログが表示される。正常に起動している。

ifconfigを見るとwlanのインタフェースが見えない。

無効になってるのかなと調べかけて、待てよ、と本体裏の名前を見ると、「W」がない。



wpa_supplicant.confの文字コードのせいか、最後に空行があるとダメなのかとか、
悩みかけたがそんな問題ではなかった。

無線LANアダプタのない無印raspberry pi zeroを起動していたのだ。



「W」にSDカードと電源を差しなおして起動。

あっさりつながる。SSHでログイン。


最初なので諸更新をする。

sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade

sudo rpi-update
これは初めて

sudo reboot


カメラの設定

sudo raspi-config

5 Interfacing Options
P1 Camera
Would you like the camera interface to be enabled?
yes

reboot



raspistill -w 1920 -h 1080 -o pic001.jpg

で写真が撮れるということなので実行する。

pic001.jpg というファイルができる。

見たい。

パソコンに移すためにvsftpdをインストールする。
vsftpdのインストール方法については省略。

sambaを使った方がcoolか。後でやろう。

ftpでさっきの pic001.jpgをコピー。

ちゃんと撮れてる。けっこう画質がいい。


apacheを入れて、webで見るようにするか。

sudo apt-get install apache2

とやるだけで、httpアクセスするとテストページが表示される。


さて、カメラのセットアップもできた。