神山まるごと高専、本格授業二日目もITブートキャンプ!4コマ終わって、みんないい顔、楽しんでくれました!
4日連続90分15コマの前半戦。朝一講義はサイバーセキュリティ。
サイバーセキュリティの基本はプロトコル。2台のIchigoJamを隣同士、0か1かで通信するようジャンパー線でつないで、ひらがな5文字以内で定時する、待ち合わせ場所を伝えようゲームにチャレンジしてもらいます。5分間でどのように伝えるかを相談して、いざ本番!片方の人には伏せてもらってお題を表示。伝わるかな?
待ち合わせ場所通信成功、一番乗り!あかさたなと母音をそれぞれ数にして、1の数で伝えたとのこと。母音は長押しで表現するとか、和文モールスにするなど、いろんな決め方がありました。
ちなみにコンピューター同士は、お互いの時計を見ながら定期的に0か1かを判定する方式が多く、IchigoJamでは115,200bps(1秒間に11.5万bit伝える)UARTプロトコルに対応しています。速いね。それを使って、IchigoJamの遠隔操作実験。自分のプログラムが流出しちゃう!?消されちゃう!?・・・でも、便利と恐怖は人間次第。遮断も許可も人間次第。
ネットワークは、コンピューターがつながったもので、インターネットは、ネットワークがつながったもの。バケツリレーのようにいろんなコンピューターを経由して届く手紙。途中で見られたり、変えられたり、違う人に届けられたりしたら困るよね。
鍵が1つの古典暗号、共通鍵暗号と。鍵を一人2つ使う公開鍵暗号の発明によって実現した信頼の紹介。届け先もばっちり確認できるのが新しいインターネットプロトコルEVER/IPを使った、Internet3。今のインターネットの限界を知っておきましょう。
「E2EEメッセージングヘルパー」src on GitHub
公開鍵暗号を実験できるアプリ。以前作ったECDH版を使ったら共通鍵が合わないトラブル発生。先程、最新の公開鍵暗号EdDSA(Ed25519)に更新したので、こちらを復習に使ってください。(by 安全を実現するライブラリ sec.js)
公開鍵暗号の秘密鍵、公開鍵を生成して、相手の公開鍵をもらって、共通鍵を生成。自分の公開鍵を渡しておくとお互いの共通鍵がなんと一致します(DH、ディフィー・ヘルマン鍵共有)。
この共通鍵を使って、政府推奨暗号リスト「CRYPTREC暗号リスト」にも掲載されている共通鍵暗号AES-256-GCMで任意のメッセージを暗号化。暗号を相手に渡して復号化してもらいましょう。
通信で渡しているのは公開鍵だけ。復号できるのは対応する秘密鍵をもっている人だけ。つまり、途中誰が見ても決して破られない公開鍵暗号を使ったプロトコルを体験できます。
続いて、IoTのT、モノづくり、LEDや光センター、サーボを使ってIO(InputとOutput)を実験。
MixSodaを使った実験。インターネットを経由してPCやスマホを入力に使ったり、出力に使ったりできるのがIoTの便利なところ!
実験タイムで思い思いの実験をしてもらいました。
午後は、HTML、CSS、JavaScriptでおみくじゲーム、アドベンチャーゲーム、地図アプリ、VRアプリづくりなど、いろいろ体験。自分にぐっと来たところ、じっくり後で調べて遊んでみてね。
「e2ee src on GitHub」
公開鍵暗号の実験で使ったWebアプリのプログラムもオープンソース。HTMLとCSSとJavaScriptでできてます。
<!DOCTYPE html><html lang="ja">
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width">
<title>E2EEメッセージングヘルパー Ed25519 version</title>
<script type="module">
import * as sec from "https://code4fukui.github.io/sec.js/sec.js";
import { Base16 } from "https://code4fukui.github.io/Base16/Base16.js";
onload = () => {
generatebutton.onclick = async () => {
const prikey = sec.prikey();
const pubkey = sec.pubkey(prikey);
publickey.value = Base16.encode(pubkey);
privatekey.value = Base16.encode(prikey);
};
generatebutton2.onclick = async () => {
const pubkey2 = Base16.decode(publickey2.value);
const prikey = Base16.decode(privatekey.value);
const shkey = sec.sharekey(prikey, pubkey2);
sharekey.value = Base16.encode(shkey);
};
encryptbutton.onclick = async () => {
const data = new TextEncoder().encode(messagetext.value);
const key = Base16.decode(sharekey.value);
const cipher = sec.encrypt(key, data);
ciphertext.value = Base16.encode(cipher);
};
decryptbutton.onclick = async () => {
const key = Base16.decode(sharekey.value);
const cipher = Base16.decode(ciphertext.value);
const data = sec.decrypt(key, cipher);
if (data) {
messagetext.value = new TextDecoder().decode(data);
} else {
messagetext.value = "復号失敗";
}
};
};
</script>
<style>
body {
font-family: sans-serif;
}
input[type="text"] {
width: 80vw;
}
.message {
width: 30vw;
height: 5em;
}
.description {
font-size: 85%;
}
</style>
</head>
<body>
<main>
<h1>E2EEメッセージングヘルパー</h1>
<section>
<div class=description>既存の信用できない通信路を使った信用できる通信を実現する補助ツールです。<br><a href=https://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%89%E3%83%AF%E3%83%BC%E3%82%BA%E6%9B%B2%E7%B7%9A%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E7%BD%B2%E5%90%8D%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0>Ed25519</a>/<a href=https://ja.wikipedia.org/wiki/Curve25519>X25519</a>でキーペアの生成と受け取った公開鍵から共通鍵の生成をし、共通鍵暗号<a href=https://ja.wikipedia.org/wiki/Galois/Counter_Mode>AES-GCM</a>で暗号化復号化します。<br>本ページの読み込み後、サーバーとの通信はしません。<a href=https://github.com/code4sabae/e2ee/blob/main/ed25519.html>ソースファイル</a>でご確認ください。</div>
<br>
<input id="generatebutton" type="button" value="1. キーペア(公開鍵と秘密鍵)をつくる"><br>
<br>
秘密鍵(誰にも見せてはいけない鍵)<br>
<input type="text" id="privatekey"><br>
公開鍵(相手に渡す鍵、公開してもOK!)<br>
<input type="text" id="publickey"><br>
<br>
2. 相手の公開鍵(通信する相手から公開鍵をもらって書く、一人で試す場合→<a href=./ target=_blank>新ウィンドウ</a>)<br>
<input type="text" id="publickey2"><br>
<br>
<input id="generatebutton2" type="button" value="3. 通信用の共通鍵をつくる"><br>
<br>
共通鍵(ネットワークには流れていないけど、通信相手と同じ鍵)<br>
<input type="text" id="sharekey"><br>
<br>
<hr>
<table>
<tr><th>メッセージ</th><th></th><th>暗号</th></tr>
<tr>
<td><textarea class="message" id="messagetext"></textarea></td>
<td>
<input id="encryptbutton" type="button" value="暗号化→"><br>
<br>
<input id="decryptbutton" type="button" value="←復号化"><br>
</td>
<td><textarea class="message" id="ciphertext"></textarea></td>
</tr>
</table>
<br>
</section>
<hr>
<div id="credit">
App: <a href=https://github.com/code4fukui/e2ee/>src on GitHub</a><br>
Lib: <a href=https://github.com/code4fukui/sec.js>sec.js</a>(Ed25519, X25519, Ed25519-to-X25519, AES-256-GCM, <a href=https://developer.mozilla.org/ja/docs/Web/API/Web_Crypto_API>Web Crypto API</a>)<br>
Blog: <a href=https://fukuno.jig.jp/3908>E2EE サイバーセキュリティ at 神山まるごと高専</a><br>
</div>
</main>
</body>
</html>
HTML CSS JavaScriptの基本を学んだ人にはなんとなく読めるはず。覚える必要はありません。いじって壊して、少しずつ慣れていきましょう。
放課後、高専プロコンなどの各種コンテストに向けたクラブ活動発足に向けた相談会。元沖縄高専の正木さんから、沖縄高専学生によるプレゼンを紹介。
夕方の神山まるごと高専オフィス、お店は少なくても、ステキな自然と同士がたくさん!
いろんな「つくってたい」をITでどんどんカタチにしていこう!
links
- はんだづけからスタート、神山まるごと高専ITブートキャンプ
- IchigoJam with Trust、信頼をかけるメガネ、IchigoGlass