公開鍵を作る!

できること
署名と暗号化で他人と安全にデータをやり取りできるようになる
必要なもの
Password and Keys
努力

OpenPGP public-key cryptography

出典をクリックでリンク元へジャンプ!

公開鍵暗号は主に特定の他人に送るデータを暗号化することと送ったデータが途中で改竄されていないことの証明、データの受け手はその逆の作業に使います
それぞれの作業を暗号化/復号化 署名/検証といいます

ここで座学をしましょう(PGPについての知識がある場合は読み飛ばしてください)
パスワードを用いて暗号化と復号化を行う方式は秘密鍵暗号に属します
自分が保管するための暗号を作る場合には便利ですが、他人に暗号を送る場合には暗号とは別にパスワードも送らなければなりません
昔の軍隊においては手渡しでパスを受け渡すことで第三者からの盗み見を防いでいましたが、インターネットで使うには適していません
公開鍵暗号は暗号化に使う鍵と復号化に使う鍵が分かれていることが特徴です
暗号化に使う鍵が公開鍵、復号化に使う鍵を秘密鍵と言い、二つを合わせて鍵ペアと言います

やりとりの受け手がA、送り手がBの鍵ペアを持つとして計四つの鍵を区別します
受け手が暗号化に使う公開鍵Aを送り手に教えて(メールアドレスを教える作業に近い)、送り手は教えられた公開鍵Aを元手に暗号を作成します
この公開鍵A暗号は秘密鍵Aを持つ受け手にしか解読することができません
作成した暗号を受け手に送ると、受け手は秘密鍵Aで暗号を解読することができます
お互いにこの作業を繰り返すことで会話が成り立ちます
公開鍵は盗み見されても問題ありません(むしろ公開するのが一般的)

しかし、受け手が解読できる暗号を公開鍵Aを知っているなら誰でも作れるのがこの方式の特徴です
送り手になりすました誰かが受け手の公開鍵Aを作ってウィルスや偽情報を受け手に向けて流すことがあります
そういった事態を防ぐために署名が存在します
署名はデータの送り主が送り手本人であることを証明する手段です

本来公開鍵は暗号化、秘密鍵は復号化に使うものの、その逆の作業に使うことも可能です
通常と逆に、送り手が自分の秘密鍵Bで作成した暗号を受け手に渡した公開鍵Bで解読できれば、
データの送り主は送り手の秘密鍵Bのパスワードを知っている人物ということになります
ちなみに、秘密鍵は公開鍵を生成できるので公開鍵と秘密鍵を逆にして使うことはできません
あくまで本来とは逆の作業が行えるだけです

公開鍵と暗号鍵の作り方
アプリケーション→ユーティティ→パスワードと鍵
ファイル→新規→PGP鍵→氏名にアルファベット五文字か日本語二文字以上を入力
メールは空欄のままでも構いません
メールアドレスを設定すると相手と暗号文でやりとりするのが容易になりますが、
生IP(Windows) で作ったメールアドレスを設定すると匿名性がなくなってしまいます
そもそも暗号文をメールで送ると文字化けする場合があり、TailsではThunderbirdの暗号化機能が推奨されているようです
鍵の拡張オプションで鍵の長さを4096ビットにすると解読が困難になります
パスワードを入力するとPGP鍵の完成です
パスワードと鍵→PGP鍵→GnuPG鍵の一番下にアイコンに金と銀のダブった新しい鍵が表示されます
金色はTails公式があらかじめインポート(入力)しておいた公開鍵で、金と銀が揃っているのは公開鍵と秘密鍵の揃ったあなたの鍵ペアです
パスワードの保管にKeePassXの使用を推奨します

それでは公開鍵で暗号化をしてみましょう
"この行をドラッグして反転させてください コピーする必要はありません"
Tailsの画面右上のメモ帳のアイコンをクリックしてください
まずは、 "パスワードでクリップボードを暗号化"を試してみましょう
パスワードを二回入力すると、メモ帳のアイコンに鍵かかかります
メモ帳からクリップボード暗号化の解除/確認を選択するとそのまま元々の文章が表示されます
分かりにくいことに入力したパスがシャットダウンするまでキャッシュに保存されていて復号化にパスを入力する必要がないようです
しかし、適当な場所にCtrl+Vを押してクリップボードの中身を貼り付けてみると・・・

-----BEGIN PGP MESSAGE-----

jA0ECQMCjPb0gb6poDTR0pYBVlPIYM7b8ZIsI8/4tK2j60YyCnSTZfAuX5pWXsEf
fivRVDSCPAl/aa0UwxBzxBvIOxC0e76/gVQo6v2zzks4uDz+g6uawi03kjlGb8R1
akYGPWtp3on9R9D/pwTBNYwYsMjrASXVWKgLlXHnuGudI4tkY/kQ3SfTl2J3WZYf
W+M5eGqBCQhAAdIAmnxHs1zJPlCF0RU=
=kDMi
-----END PGP MESSAGE-----

この様な怪文書が暗号です
-----BEGIN PGP MESSAGE-----から-----END PGP MESSAGE-----までをドラッグで反転させるとファイルのアイコンに再び鍵がかかり、クリップボード暗号化の解除/確認を選択すると解読できます
パスワードは"tepodondondondon"(""抜き)です アメリカ国歌のリズムでどうぞ

同じ手順を公開鍵で"クリップボードを署名/暗号化"で試してみましょう
"受信者を選択"の一覧に表示されるのが登録されている公開鍵で、メッセージの受取人になります
下側のメッセージを次として書名はあなたの持つ鍵(秘密鍵が登録されている鍵)を表示し、自分がメッセージの送信者であることを保証します
Tails accounting teamを受信者に選択し、先ほど作成した鍵で署名します
警告をスキップすると同じく手帳に鍵かかかりますが、クリップボード暗号化の解除/確認をしても読めません
手元にTails accounting teamの秘密鍵がないためです
貼り付けてみると先ほどのような怪文書ですが、公開鍵からメールアドレスに登録されているtails-accounting@boum.orgにこれを送信するとtails開発チームには
"この行をドラッグして反転させてください コピーする必要はありません"
という文章が復号化されて見えます 
ちなみに"受信者を選択"の一覧で複数の相手に解読できる一つの暗号文を作成すること、誰も選ばないことで暗号化はせずに署名だけをすることも可能です
解読をするには先ほどと同じように暗号文を-----BEGIN PGP MESSAGE-----から-----END PGP MESSAGE-----まで反転させてクリップボード暗号化の解除/確認を選択します

gpg: encrypted with 4096-bit RSA key, ID 0xE9539F1861AFC806, created 2017-11-10
"test1"
gpg: Signature made 2017年11月10日 16時33分13秒 UTC
gpg: using RSA key FAB5CE083BB054A55B5F12C3DCD4489979A97CAA
gpg: Good signature from "test2" [ultimate]

復号化の例
公開鍵test1で暗号化して秘密鍵test2で署名し、test1の秘密鍵で復号化しました
test1・test2ともに自作の公開鍵・秘密鍵のペアです
gpg: encrypted with 4096-bit RSA key, ID 0xE9539F1861AFC806, created 2017-11-10
"test1"
test1公開鍵で暗号化されたこと、その日時、test1の使用履歴のID(公開鍵のIDではない)
鍵の使用履歴のIDはパスワードと鍵からtest1を選択して詳細タブに表示される
gpg: Signature made 2017年11月10日 16時33分13秒 UTC
署名された日時
gpg: using RSA key FAB5CE083BB054A55B5F12C3DCD4489979A97CAA
test2の使用履歴のID
gpg: Good signature from "test2" [ultimate]
署名が手持ちの(インポート済みの)test2の公開鍵で検証されたこと、test2の素性の信頼性(自分で作ったものなので最高:アルティメット)
Primary key fingerprint: FAB5 CE08 3BB0 54A5 5B5F 12C3 DCD4 4899 79A9 7CAA
test2の公開鍵を特定するための指紋(フィンガープリント)test2の詳細タブに表示される

ここまで来たらあとは公開鍵を共有する方法です
自分のPGP鍵を一度クリックして青くハイライトさせてから画面上の編集→コピーしてメモ帳にCtrl+Vをすると公開鍵が貼り付けられます
貼り付けた文章を-----BEGIN PGP PUBLIC KEY BLOCK-----から-----END PGP PUBLIC KEY BLOCK-----まで含めてメールなどで送信します
受け取った側はその文章をテキストファイルにしてパスワードと鍵のファイル→インポートで選択して公開鍵を取り込みます
.gpgファイルで受け渡しする方法もあります
パスワードと鍵から自分のPGP鍵を一度クリックして画面左上のファイルからエクスポートを選択します
やりとりする相手に渡す.pgpファイルが完成しました
.gpgファイルを受け取ったらダブルクリックかパスワードと鍵→ファイル→インポートから開いてください
PGP鍵をダブルクリック→詳細から秘密鍵のエクスポートで秘密鍵を.ascファイルで出力できます
複数の端末で同じ秘密鍵を使う必要がある際に役に立つでしょう
.gpgファイルはメールで送れなくて不便なので、編集→コピーの 方法をおすすめします

公開鍵を共有するサイトを公開鍵サーバーといいます
http://pgp.nic.ad.jp/pgp/pks-commands-j.html
こういったサイトに公開鍵を登録するとやりとりの相手を見つけやすくなります
また公開鍵サーバーは他の公開鍵サーバーと同期しているため、一つの場所に登録すればすべての場所で検索可能になります

ここまで言っておいてなんですが、メッセージングには基本的にメールは使わずPidginからXMPPを使うことをおすすめします
手間がかかりすぎることと、XMPPにはForward secrecyという機構が備わるため万一パスワードが漏洩してもこれまでのやりとりは解読されないことが主な理由です
PGPでは暗号文が誰かに収集されて、秘密鍵のパスワードが漏れた場合同じ秘密鍵を使って解読するすべての暗号文が流出します
XMPPは一度相手を確認すれば書名や検証は不要で、やりとりを保存しない限りは安全です
もう一つの問題点は、前述したようにメール越しに暗号文を送信すると文字化けする場合があることです
文字化けを防いで暗号化メールを送るにはThunderbirdの機能を使うことが適切ですが、OAuth認証を要求しないメールサービスが見つけられませんでした…
Tailsから使うに当たってはsecmail(http://secmailw453j7piv.onion/src/login.php)がある程度セキュアでお勧めですが、こちらも結局Thunderbirdに対応していません 
おまけにShift-JISか何かに対応していないのか受信したメールが文字化けすることがあります

最初にTailsをダウンロードする時、Firefoxアドオンの検証とBittorrentによる検証のどちらかを求められましたが
Tails公式チームの公開鍵をダウンロードして手動でファイルを検証する方法も存在しました
この手段はファイルがサイトからユーザーに送られる過程ですり替えられたなら有効ですが、サイトごとハッキングされたら公開鍵自体をすり替えてしまっているため危険です
この危険を回避できる要素として信頼の輪があります

パスワードと鍵からTails accounting teamをダブルクリックして信用度の項目を見てください
この公開鍵はTailsが本物であることを確認した以上かなり信頼できます
公開鍵に対して、署名という行動で鍵に対する信用度をメモすることができます
信用度タブのこの鍵を署名するをクリックしましょう
・鍵への信頼度
・自分が署名したことを他人に公開するか
・この署名をあとから撤回させる権利を保持するか
・自分の持つどの鍵で署名するか を上から順に選択し、
署名するを押して選んだ鍵のパスワードを入力することで署名が完了します

Tails accounting teamの信用度タブに戻って、下側にある信用している人たちの署名だけを表示するのチェックを外してみましょう
あなたといくつかの不明な鍵やTails公式チームの別の鍵から信用を表明する署名をされていることがわかります
あなたは既にTails accounting teamをTails公式本人の公開鍵として信用しているので、
Tails accounting teamの公開鍵によって署名されたまた別の鍵にも一定の信用を置くことができます

ユーザーが鍵に署名をすると、まずチェックボックスを外すことなくすでに信頼している鍵からの署名を表示できます
次にそのユーザーの公開鍵を知っており、信用している他者が同じ要領で公開鍵の信用度を調査しやすくなります
これを指して信頼の輪といいます

XMPPを使う

知的反逆のすすめ

一番下の段にXMPPの解説があります
OTRやTorは通っているので気にしないで、その下のXMPPの使い方を参照しましょう
dukgo.comは使えないため、ここではjabber.toを元に解説します

Tailsが使うTorによる匿名化はデータを送受信した人物が誰かを不明にしますが、やりとりの中身を暗号化して第三者から守ることはありません
それこそが暗号化が必要になる理由です
XMPPはPidginで使うチャットのプロトコル(仕組み)です
OTR(Off The Record Messaging)はPidginのプラグイン(追加ソフト)として、XMPPに四つの機能を追加します
Encryption 
メッセージを暗号化します
Authentication
アカウントの持ち主がなりすましでないことを保証します
Deniability
やりとりが終わった後、あえて第三者がメッセージを偽造できるようにして本当のメッセージさえも自分が書いたという証拠をなくします
Perfect forward secrecy
万一パスワードが流出してもこれまでの会話は解読されません

PidginからXMPPを使う場合、persistenceからPidginの情報の保存を有効化してください
デフォルトのIRCアカウントは毎回ランダムに生成されたもので、匿名というか名無しの状態になります
IRCのアカウントはXMPPには使えません

jabber.toのアカウントの取得方法
アプリケーション→お気に入り→Pidgin→アカウントタブから追加を選択
プロトコル XMPP
ユーザ名  お好み
ドメイン名 jabber.to
リソース  Home
パスワード KeePassXに保存 
左下のアカウントをサーバに作成をチェック
"新しいXMPPアカウントの登録"画面が生成されるが、ユーザ名とパスは入力済みのはずなので登録をクリック
"登録の完了"タブが表示される
"仲間リスト"ウィンドウに戻って左上の"仲間"から新しいインスタント・メッセージなどを選択できればアカウントの登録は完了
問題があれば仲間リストの"アカウント"からアカウントを有効にしなおしてください

テストのためにもう一つアカウントを作っておきましょう(以下旧アカウントをmain、新アカウントをtestとする)
仲間→新しいインスタント・メッセージから名前欄にtestを入力し、その下の"アカウント"がmainであることを確認してOKを選択
発生した画面の下側の枠からいろいろメッセージを送りつけてみます
すると右下の通知とともに別のタブが開いて、testの視点からmainにメッセージを送りつけられたことがわかります
これがチャットです

次に、testを仲間リスト→アカウント→アカウントの管理から無効化します
mainから先ほどのようにtestにメッセージを送りつけます
アカウントからtestを有効化すると送りつけられたメッセージが表示されます
これが留守中にメッセージを送られたときの挙動です

さて、今度はチャットルームを訪ねてみます
仲間リスト→仲間→チャットに参加
他は無視して左下のルームの一覧を選択
"会議サーバの入力"ウィンドウが表示されます
conference.jabber.toの表示をそのままに"部屋の検索"を選択してください
"ルームの一覧"タブの上にあるアカウント欄で自分がチャットに使いたいアカウントを選べます
jabber.toに建設されているチャットルームは軒並み廃墟な上マトモな部屋が無いような気がします
別のサーバも探してみましょう
"ルームの一覧"タブから一覧の取得を選ぶか、仲間リストからチャットに参加に戻って"会議サーバの入力"ウィンドウを開き直します
ここで役立つのがhttps://list.jabber.at/で、conference.のあとにこのサイトが提供するServerのリストのどれかを挿入するとそのサーバ上のチャットルームを検索できます
例えばconference.xmpp.jpを開いてみましょう
こういった調子で、数多くのルームを訪問することが可能です

今度は自分自身のチャットルームを作成してみましょう
仲間リスト→仲間→チャットに参加タブを開いてください
アカウント ルームで使うアカウントの選択
ルーム   ルーム名の設定
サーバ   チャットルームを建設するサーバー
ハンドル  チャットルーム内での名前
パスワード 知り合いのみを部屋に入れる場合に設定しましょう
"参加"を選択すると、新しいチャットルームの生成ウィンドウが出現します

"ルームの設定"を選択すると、以下のカスタム設定を適用できるようになります
Room title ルーム一覧に表示される部屋の名前
Room description 同じく説明
Make room persistent(off)
onにすると住人がいなくなっても部屋が維持できます…が、なんと消せません
Make room public searchable(on)
offにするとルーム一覧から表示されなくなります
Make participants list public(on)
offにするとチャットルームの右側の参加者一覧が非表示になります
Make room password protected
ルームに参加するためのパスワードを設定します
Maximum Number of Occupants
部屋に参加できる人数の最大数を選択します
Present real Jabber IDs to:(moderators only)
参加者のニックネームではない本当のjabberIDは管理者にしか表示されませんが、
anyoneにすると誰にでも表示されるようになります
Roles for which Presence is Broadcasted
上から管理者・参加者・ゲストが入退室したときのお知らせを設定できるようです
これ以上はちょっと……どっかにいい説明書があるといいんですけども…
OKを押すと部屋が作成できます
適当に呟いて一度抜けましょう
"チャットに参加"から先ほど作成したルーム名(あるならパスワードも)を入力します

作成されたルームは"チャットに参加"からルーム名やサーバ・パスワードを入力すれば普通に入室できます

ファイルを操作する

できること
右クリックで簡単にファイルを簡単に署名・暗号化・圧縮
ファイルを完全に削除
削除されたファイルを復活不可能にする
必要なもの
公開鍵と時間

公開鍵はメッセージングだけではなく、ファイルの暗号化にも使えます

場所から適当なファイルを右クリックしてください
Compressで圧縮 圧縮されたファイルをダブルクリックして解凍
暗号化→Use passphrase only→一つのパッケージにまとめてから暗号化する・パッケージ名の横の拡張子を選択する→保存先を選択→パスワードを選択してパスワード暗号化が出来ます
同様の手順で先ほどと同様に公開鍵暗号化/署名ができます
送り先の公開鍵を指定して、署名用に自分の秘密鍵を指定します
署名を受け手に検証させるためにはあらかじめ自分の秘密鍵に対応した公開鍵を伝えておく必要があります
相手から暗号を送られた場合、受け手は受け手の秘密鍵と送り手の公開鍵(書名の検証用)のインポートを必要とします
受け手が自分の秘密鍵で暗号を解読したとき、画面中央上に"いい署名です"と通知がくればファイルは途中で改竄されていないことになります
通知は画面中央上の時計をクリックすると読み直せます

ファイルを右クリックして発生するメニューの署名のさらに下に、WipeとWipe available disk spaceという選択肢があります
ファイルはゴミ箱に移動して削除しても、実際に消されることはなく別のファイルによる上書きをただ待つことになります
これは家の建った土地を売りに出すようなもので、次の家が建つまで元の建物が取り壊されることはないのです
もともと意味のあったデータも乱数やゼロの集まりもデータ容量としては同じなので、削除のスピードを速めるために合理的な措置です

しかしどうしても他人に見られたくないファイルならどうでしょうか
ゴミ箱送りにしたファイルは簡単に復旧させられる上、一度上書きされた程度では元のファイルの痕跡が残ってしまいまた復旧の憂き目にあうことになります
ファイルの痕跡を抹消するためには無意味なデータで繰り返し上書きする必要があります

Wipeを選択すると確認画面が発生します
左下のOptionsボタンからそれぞれ
・上書きの回数 1/2/35 デフォルトは2
・高速ながら不完全な削除
・最後の上書きをゼロで統一 を選択できます
特に操作する必要はないでしょう
右下のWipeからファイル抹消が開始され、終了時にはWipe successfulと表示されます

Wipe available disk spaceは方式は同じものの、ディスクの空き領域を対象にすることで
過去にゴミ箱から捨ててしまったファイルを抹消するのに使います
使い方は同じですが、より時間がかかります

Share via OnionShareはOnionShareを使ってファイルをインターネットにアップロードできます
クリックすると選択したファイルを対象にOnionshareが起動し、Start Sharingを選択すると赤いボタンが黄色から緑になってその下にURLが表示されます
TorBrowserからURLにアクセスするとアップロードされたファイルがダウンロードできます
Stop Sharingをクリックしてアップロードを停止します
Stop sharing automaticallyのチェックがオンになっている場合、誰か一人にダウンロードされた時点でファイルのアップロードは自動的に停止します
複数人に共有する場合はチェックを外しましょう
また、アプリを止めるかPCをシャットダウンするとすぐにアップロードが終了します
長期間ファイルを共有する場合は通常のアップローダーを使わなければならないでしょう
二回目になりますが、こちらもご参照ください
https://ja.hideki.hclippr.com/2015/11/14/onionshare%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F%E5%AE%89%E5%85%A8%E3%81%AA%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%85%B1%E6%9C%89/