読者です 読者をやめる 読者になる 読者になる

だるろぐ

とてもだるだるした日記です http://about.daruyanagi.jp/

お知らせ

『暗号 情報セキュリティの技術と歴史』

読書 歴史 数学

暗号 情報セキュリティの技術と歴史 (講談社学術文庫)

暗号 情報セキュリティの技術と歴史 (講談社学術文庫)

「ポスト量子化暗号」について知りたかったのだけど、まずそれ以前の暗号化に対する知識が割とあやふやなので1冊読んでみた。ペロッと読めて、楽しく、ためになる。ちょっと意識の高い高校生ぐらいにお勧めやね。

f:id:daruyanagi:20160924094820p:plain

本書はまず、歴史の話から始まる。古代スパルタのスキュタレー(一見、皮ひもにランダムな字が書かれてるんだが、とある棒に巻き付けて読むとと意味のある文になる)やカエサル暗号(アルファベットを n 個ずらすってヤツ)、そして第二次世界大戦時のエニグマ。割とありきたりかなって感じだったけど、日本軍のパープル暗号を評価している部分などは面白かった。システム自体は割と頑張って作ってたのに、運用がガバガバで解読されてしまうのは日本軍らしいなって思う。

あとは、上杉謙信の軍師・宇佐美定行が使ってたという暗号も興味深かったなー。これはもうちょっと調べて、歴史ブログの方のネタに使わせてもらおうっと(^ω^)

まぁ、そんな感じで歴史上いろんな暗号が考案されていて、割と高度なものもあったのだけど、そうした工夫をひっくり返してしまう大発見が現代になって行われた。それがアルゴリズムと鍵の分離なんだなー。

たとえばカエサル暗号を例にとってみる。カエサルは「A を C、B を D に置き換えれば復号できる暗号文」を右腕のラビエヌスへ送る。

この暗号をラビエヌスが読むとき、カエサルとラビエヌスはその解読法を共有していなければならない。これはラビエヌスが捕まって、拷問かなにかで解読法を知られてしまうとローマ軍全体が困ってしまう。そこで役に立つのが、アルゴリズムと鍵の分離だ。

暗号の解読法は、アルゴリズムと鍵に分類できる

たとえば、カエサル暗号では「アルファベットを n個 ずらす(n=2 ならば、A は C、B は Dにする)」がアルゴリズム。n が鍵とみなせる。

アルゴリズムと鍵を分離すると、アルゴリズムは公開できる。なぜならば、鍵さえ秘密になっていれば、ウェルキンゲトリクスが暗号文を入手しても、それを解読するのは至難だからだ。無論、アルゴリズムも秘密である方がいい。でも、鍵をもう少し複雑化して「5、3、-2」とでもすればどうだろう。これは単に「3で割って1余るならば5、2余るならば3、余らないならば-2だけずらせ」という鍵だけど、これだけで割と困るよな。もっと複雑にすれば、アルゴリズムを知っているだけでは復号できるとは断言できなくなる。

アルゴリズムと鍵を分離しておけば、もしラビエヌスが鍵を漏らしてしまっても、鍵を変えるだけで済む。さらに定期的に鍵を変えるように取り決めておけば、万が一古い暗号が漏えいしても新しい暗号文の解読は難しくなり、より安全に運用できる。単に難読化させたいだけならば、鍵を定期的に変える必要もない。相手に「計算うぜー(;^ω^)」と思わせれば勝ち。

さらに言えば、鍵は全体で共有しなくてもよい

たとえば、ラビエヌスと弟キケロで鍵を分けておけば、ラビエヌスにだけ、弟キケロにだけ解読できる暗号文を作成できる。逆に言えば、送られてきた暗号文が弟キケロに知らせた鍵でしか解けなければ、その暗号文はラビエヌスではなく、弟キケロが送ったものであるとみなせる。つまり、暗号は認証(相手がホンモノかどうかの判断)にも使える。「お前この暗号文読める? おっけおっけ」。これを応用すれば、ブロックチェーン――仮想通貨が本物かどうかを見分ける技術――なんかにも使えるわけだな(本書にはそこまでの話はない)。

鍵も公開できる

現代では、この鍵をさらに公開できるものと秘密のものに分ける「公開鍵」方式というのが使われている。鍵まで公開しちゃうんだな! それでも大丈夫っていうんだから、ちょっと不思議。

公開鍵方式では、公開鍵と秘密鍵の二つの鍵が使われる。

公開鍵は、暗号文の作成に使う。これはみんなが自由に使ってよい。一方、作成した暗号文の解読には公開鍵と秘密鍵の両方を知っておく必要がある。こうしておけば、解読用の鍵を運搬しなくてよい。ラビエヌスが襲われたり、拷問にかけられる心配がなくなるってわけ!(カエサルは狙われるかもだけど

これは暗号化における大きなパラダイムシフトだった。本書ではこれ以後とこれ以前で暗号化を分け、共通鍵方式と公開鍵方式についてとくに詳しく解説してくれている。

公開鍵方式の話を続けよう。公開鍵と秘密鍵はまったく無関係というわけではなく(無関係だったら復号できん)、秘密の関連性(二重のアルゴリズム=鍵の関係)があるのだけど、公開鍵からそれを推測することはできない(できないことはないが、スパコンを使っても何十年かかる)。これには数学の時間に習った「素因数分解」の原理が使われている。

28411×28429=807696319

は割と簡単に計算できるけど、逆にノーヒントで

807696319=?

を素因数分解するのは大変でしょ? そのほかにも p 進数みたいな話も応用されているみたいだな。

このあたりの具体的な話については、依然に読んだ数論の本の知識が非常に役に立った。暗号は「作るのは簡単だけど、元に戻すのにはすごい手間がかかる」のが基本。それに数論が役に立つっていうのはちょっと面白いよね。日本人が役に立っているっていうのも、読んでいてちょっとだけ鼻が高い感じ。あと、暗号化の記事を読んでると「ディフィー・ヘルマン」とかよく出てくるけど、あぁ、そういう人だったのね的な(多分大学の教養課程でもやった気がするんだが、身についてなかった……orz)。

でも、この数論ベースの暗号も今後登場が期待される「量子コンピューター」の前では役に立たなくなるかもしれない。そのために開発されているのが「ポスト量子化暗号(量子コンピューターが実用化された後も使える暗号)」で、それには楕円関数とかを使うらしいが……本書には「楕円関数はきれいだよ!」ぐらいしか書いてない。まだまだ素人にわかりやすく説明できるレベルではないんだろうな。

というわけで、今回はこの程度の理解で終わらせておくことにする。

Windows 10 へ無償アップグレードしたあとに元のバージョンへ戻しておいた端末を再び Windows 10 にする

Windows 10 Windows 8.1 MacBook

f:id:daruyanagi:20160923210256p:plain

最近使っていなかった MacBook(Windows 8.1)に電源を入れて Windows Update を開いてみると、「Windows 10 へのアップグレードを利用できます」という表記が。あれ、もう無償アップグレードキャンペーンって終わったんじゃなかったっけ? 

このボタンを押すとどうなるのかちょっと気になったので、そのまま案内に従って作業を進めてみました。

結果は――別に何も起こりませんでした/(^o^)\

再起動したら、溜まってた更新プログラムが適用されて、それだけ。フツーに Windows 8.1 が立ち上がりました。

けれど、そういえば、この MacBook は一度 Windows 10 へ無償アップグレードしたあとに、Windows 8.1 へ戻しておいたヤツであるはず。かつて聞いた話だと、一度 Windows 10 へ無償アップグレードしておけば、Windows 10 のライセンスをタダで確保できるという話だった。

いい機会なので、それが本当なのか試してみることにしました。ダメだったら、この記事がウソだったということになるな。

メディア作成ツール

まずは「メディア作成ツール」をダウンロード。

これを使えば、Windows 10 の ISO イメージをダウンロードして、OS をアップグレードできるハズ。

f:id:daruyanagi:20160923211041p:plain

プロダクトキーの入力を求められたら、[この PC に Windows 10 を再インストールしています]というリンクをクリックすれば OK みたい。キーを入力しなくても、インストール画面へ進める。

f:id:daruyanagi:20160923211147p:plain

あとは、案内に従ってアップグレードを進めるだけ。

無事 Windows 10 へ再アップグレード完了

f:id:daruyanagi:20160923211832p:plain

アップグレード処理は1時間足らずで完了。「設定」アプリの[更新とセキュリティ]‐[ライセンス認証]画面を見てみると、「Windows は、Microsoft アカウントにリンクされたデジタルライセンスによってライセンスされています」とある。ちゃんと有効なライセンスが取得できているようですな?

f:id:daruyanagi:20160923212027p:plain

なお、元の Windows 8.1 へ戻せる期間は 30 日 → 10 日へ短縮されているので注意。僕はこのまま Windows 10 で使い続けようかなーって思います。Windows 10 になれると、8.1 はちょっと……ねw

UWP:はてなの oAuth 認証

UWP はてな C#

f:id:daruyanagi:20160919220838p:plain

プログラミングの秋……なのかな? 最近、またプログラミングをちょろちょろとやっています。今回は、UWP。一つ新しいのができたのでストアに提出して、今はむかし作りかけて放置中のはてブをつけるアプリを完成させようと四苦八苦してる途中。

実はこのアプリ、ほぼ完成していて、Windows 10 Mobile ではてブみたりはてブつけるのに使っているのだけど、セットアップに AtomPub の APIキー を使うタイプなんだよね。自分で使う分にはこれでもいいんだけど、ちょっとダサいので oAuth でやりたかった。

AsyncOAuth を導入する

さて、oAuth はトークンのやり取りとかハッシュとかヘッダーの生成とか、いろいろややこしい処理がある。自分でも組んでみたけど、どこかちょっと間違ってるみたいで、なかなか認証が通らない。というわけで、ライブラリさまのお力を借りた。

いろいろ探してみたんだけど、AsyncOAuth が一番気に入ったかも。

UWP プロジェクトに NuGet でインストールできなかったんだけど、手動で加えたら問題なく動いた。もうメンテナンスされていないのかもしれないけど、せっかくいいものなので UWP でもサクッと使えるようにしてほしいな(賛同してくれるヒトは、みんなで のいえっち にサイレントプレッシャーをかけよう!)。

AsyncOAuth にはコンソールアプリだけど はてな 認証のサンプルもついてる。これを UWP 向けにチョロチョロと改造すればおっけ。

var authorizer = new OAuthAuthorizer(ConsumerKey, ConsumerSecret);
var callbackUri = "http://localhost/";

var requestTokenResponse = await authorizer.GetRequestToken(
    "https://www.hatena.com/oauth/initiate",
    new[]
    { 
        new KeyValuePair<string, string>(
            "oauth_callback",
            callbackUri
        )
    },
    new FormUrlEncodedContent(new[] {
        new KeyValuePair<string, string>(
            "scope", 
            "read_public,write_public,read_private,write_private"
        )
    }));

var requestToken = requestTokenResponse.Token;

var authorizeUrl = authorizer.BuildAuthorizeUrl(
    "https://www.hatena.ne.jp/touch/oauth/authorize", 
    requestToken);

たとえば、リクエストトークンをとるまでのところはこんな感じ。めんどくさいところは全部やってくれるので楽ちんだー。

callbackUri を“oob”にしたら PIN を使った認証になる。WebAuthenticationBroker.GetCurrentApplicationCallbackUri() で取得した URL は はてな では使えないみたいなので、今回は“http://localhost/”をセットしておく(これはあとで認証するときに必要になる)。

WebAuthenticationBroker を使って認証する

f:id:daruyanagi:20160919223009p:plain

次は Web へアクセスして認証。UWP には WebAuthenticationBroker っていうダイアログを出す仕組み(それだけじゃないけど)が用意されているので、それを使うといい感じ。

// さっき取得したリクエストトークンを使って認証 URI を取得
var authorizeUrl = authorizer.BuildAuthorizeUrl(
    "https://www.hatena.ne.jp/touch/oauth/authorize",
     requestToken);

// ダイアログを開いて結果を取得
var webAuthenticationResult = await WebAuthenticationBroker
    .AuthenticateAsync(
        WebAuthenticationOptions.None,
        new Uri(authorizeUrl), new Uri(callbackUri)
    );

// 結果をみていろいろ分岐処理
switch (webAuthenticationResult.ResponseStatus)
{
    case WebAuthenticationStatus.Success:
        try
        {
            // http://localhost?...=...&...=... っていうのが
            // 返るのでテキトーに千切って verifier だけ取得
            var verifier = webAuthenticationResult.ResponseData
                .Split('?').Last()
                .Split('&').Last()
                .Split('=').Last();
            // リクエストトークンと verifier で
            // アクセストークンをゲット
            // これでいろいろし放題だ!
            var accessTokenTokenResponse = await authorizer
                .GetAccessToken(
                    "https://www.hatena.com/oauth/token",
                    requestToken, verifier);

            AccessToken = accessTokenTokenResponse.Token;

            result = true;
        }
        catch (Exception exception)
        {
            // エラー処理するんやで
        }
        break;

    case WebAuthenticationStatus.ErrorHttp:
    case WebAuthenticationStatus.UserCancel:
    default:
        break;
}

ユーザー情報を取得

f:id:daruyanagi:20160919223808p:plain

あとは OAuthUtility.CreateOAuthClient() でクライアントを取得してごにょごにょするだけ。このクライアントは AsyncOAuth が HttpClient にフィルター(?)をかましているだけなので、HttpClient みたいに GetAsync() とかできる。

var client = OAuthUtility.CreateOAuthClient(
    ConsumerKey, ConsumerSecret, AccessToken
);

var json = await client.GetStringAsync(
    "http://n.hatena.com/applications/my.json"
);

これでディスプレイネームやプロフィールイメージなんかが取得できるので、テキトーにバインディングしてあげればおっけ。楽ちんでいいわー。

NuAns NEO に Anniversary Update が キタ━━━━(゚∀゚)━━━━!!

NuAns NEO Windows 10

f:id:daruyanagi:20160916100636p:plain:w250 f:id:daruyanagi:20160916100645p:plain:w250

今作ってる UWP アプリのターゲットを間違って Anniversary Update にしちゃった(だって新しい方がいいじゃん)ので、非 Anniversary Update な NuAns NEO で実機デバッグできなくて困ってた。助かる―

f:id:daruyanagi:20160916100656p:plain:w250 f:id:daruyanagi:20160916100653p:plain:w250

なんかアプリがいくつか消えて、スタート画面が歯抜けになってるっぽいけど、なにがなくなったんだっけ(ピン留めが外れただけかな?)。とりあえず アクション センター の使い勝手がちょっとよくなってうれしい。

C#:非同期なイベント?

C#

たとえばこんなコードがあるとする。ラムダ式でイベントハンドラを実装する、よくあるヤツ。

public void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += (sender, reason) => { Hoge(); };
}

イベントハンドラ内で非同期コードがある場合は、こんな感じになる。

public void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += async (sender, reason) =>
    { 
        await Hoge(); 
    };
}

async/await を付け足すだけなので、そんなに難しくはない。

次に、イベントハンドラのコードが肥大化してきたので、これを外に出すことにする。

非同期じゃない場合はこんな感じ。

public void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += taskInstanceCanceled;
}

private void taskInstanceCanceled(
    IBackgroundTaskInstance sender, 
    BackgroundTaskCancellationReason reason)
{
    Hoge();
    :
    :
}

これをさっきみたいに非同期にすると、

public void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += taskInstanceCanceled;
    // taskInstance.Canceled += async taskInstanceCanceled;
}

private async Task taskInstanceCanceled(
    IBackgroundTaskInstance sender, 
    BackgroundTaskCancellationReason reason)
{
    await Hoge();
    :
    :
}

になると思うんだけど、

taskInstance.Canceled += taskInstanceCanceled;

ここでエラーになる(taskInstanceCanceled の返り値が void ではなく Task なので)。

しょうがないので、ちょっと考えてこうした。

public void Run(IBackgroundTaskInstance taskInstance)
{
    taskInstance.Canceled += async (sender, reason) =>
    {
        await taskInstanceCanceled(sender, reason);
    };
}

private async Task taskInstanceCanceled(
    IBackgroundTaskInstance sender, 
    BackgroundTaskCancellationReason reason)
{
    await Hoge();
    :
    :
}

動いたっぽいんだけどなんかしっくりこないので、今度詳しい人に聞いてみたい。

バイクのナンバープレートを落としたとき、人類はどのように対応すればよいのか

とりとめもないこと バイク Monster S2R800

f:id:daruyanagi:20160910041417j:plain

この前バイクを買ったんだけど、BAS で受け取って家に帰る途中、ナンバープレートを脱落させました/(^o^)\

ちゃんとネジを〆たつもりだったんだけど、L型2気筒エンジンの振動に耐えるには十分でなかったらしい。後続車の方、ほんまごめんなさい。なんか落ちた気はしたんだけど、クルマの流れの中、振り返って十分に確かめる余裕がなかった。

当たり前ですが、ナンバープレートのない状態で走行するのは違反です(五十万円以下の罰金)。

第二章 自動車の登録等

(自動車登録番号標の表示の義務)

第十九条  自動車は、第十一条第一項(同条第二項及び第十四条第二項において準用する場合を含む。)の規定により国土交通大臣又は第二十五条の自動車登録番号標交付代行者から交付を受けた自動車登録番号標を国土交通省令で定める位置に、かつ、被覆しないことその他当該自動車登録番号標に記載された自動車登録番号の識別に支障が生じないものとして国土交通省令で定める方法により表示しなければ、運行の用に供してはならない。

第八章 罰則

第百九条  次の各号のいずれかに該当する者は、五十万円以下の罰金に処する。
一  第十一条第一項(同条第二項及び第十四条第二項において準用する場合を含む。)、第十一条第四項若しくは第六項、第十九条、第二十条第四項、第五十四条の二第四項、第六十三条第六項、第七十三条第一項(第九十七条の三第二項において準用する場合を含む。)又は第九十八条第三項の規定に違反した者

道路運送車両法

ナンバープレートを再交付してもらいましょう。

1. 紛失届を出す

まずは最寄りの交番や警察署で紛失届を出しましょう。松山の場合は、陸運局に近い松山南警察署がいいかも。

f:id:daruyanagi:20160910043605p:plain

警察のお世話になることはあまりないので知らなかったのですが、遺失物は会計課に相談すればいいみたいです。警官のおっちゃんを適当に捕まえて聞いたら、一瞬「なにを当たり前のこと聞いてんだクソが」みたいな顔をされましたが、丁寧に教えてもらえました。

紛失届を出すと何桁かのナンバーを教えてもらえるので、これをメモして陸運局へ。

2. ナンバープレートの再発行

陸運局にいったら、まず総合受付のようなところへ。書かなければならない書類一式がもらえます。ナンバープレートの紛失というケースは意外と少ないようで、ちょっとここで手間とりました。

書類をもらったら、見本をみながら頑張って必要事項を埋めましょう。

  • 車検証:ナンバーやバイクの型番などを知るのに必要
  • 印鑑:なくてもなんとかなったけど、あった方が面倒は少ない

などを前もって準備しておくとよいです。僕はここで書類を何回か書き損じて、受付のお姉さんに迷惑をかけてしまいました。死にたかった。この書類を書くときに、さきほどの紛失届のナンバーがあるととてもスムーズ。二度手間になるのは面倒なので、ぜひ先に紛失届を出しておきましょう。

書類を完成させて、先ほどの総合受付でチェックしてもらうと、どこをどういう順番で回ればいいかを書いた紙がもらえるので、その通りに手続きを勧めればあとはおっけー。ナンバープレートを受け取る際に確か600円ぐらいとられますので(ほかにもちょろちょろ支払う必要あり)、小銭があればいいかもしれませんな。

なお、ナンバープレートの番号は変わってしまうので注意。変えないで再発行してもらう手段もあるとかないとかですが、その日中とはいかないだろうと思います。任意保険の確認とかちょっと大変かも。うちはバイクを買ったばかりでまだ入ってなかったので助かった。

3. 自賠責ステッカーの再発行

最後に忘れてはいけないのが、自賠責ステッカーの再発行です。

(保険標章)
第九条の三 検査対象外軽自動車、原動機付自転車及び締約国登録自動車は、国土交通省令で定めるところにより、保険標章を表示しなければ、運行の用に供してはならない。

罰則
第八十八条 次の各号のいずれかに該当する者は、三十万円以下の罰金に処する。
一 第八条又は第九条の三第一項若しくは第二項(第九条の五第三項及び第十条の二第四項において準用する場合を含む。)の規定に違反した者

自動車損害賠償保障法

もしかすると中型以上の車検が必要なバイクは貼らなくていいのかもですが(車検のないバイクは必須)、まぁ、あるに越したことはないでしょう。

再発行の手続きは簡単で、自動車損害賠償責任保険証明書をもって保険会社の窓口に行くだけです。僕の場合はあいおいニッセイ同和損害保険株式会社(なげぇ)だったので、JR 松山駅の近くにある営業所に行ってきました。

f:id:daruyanagi:20160910045444p:plain

ほんま駅そばやな。2階に上がると受け付けがあるので、そこで証書を見せて書類を書くだけで代わりのステッカーがもらえました。お金もとられないようでなにより。

教訓

ネジはちゃんとしめる。

後日談

まさか紛失届を出したナンバープレートが帰ってくるとは思わなかった/(^o^)\

もう不要だし処分してほしかったのですが、それはそれで困るみたいなのでちゃんと東警察署まで取りに行きました。

届けてくださった方、ありがとう。

クルマにいっぱい轢かれたみたいで、表面がモコモコしていますが、これはこれで味があるような気がしてきたので、記念に飾っとこうかなぁと思います。