「私が愛したサムライの娘」
まあ面白かったけど、Amazonのレビューが高過ぎてあがりまくったハードルを超えられなかった。
あとちょっと読みにくい。
エンターテイメントとしては、同じ忍者モノの梟の城とかとっぴんぱらりの風太郎のほうがよっぽど好きかな。
そもそも忍びはサムライではないし。軍医に突っ込みたい。FF5でも別のジョブだったし、覚えるアビリティもぜんぜん違う。そこへ行くとこの2冊では、くノ一は恋に溺れるような性格でなく、どこまでも冷徹な存在だったので、本書のストーリー展開が腑に落ちなかった。
Bluetooth headset on WebRTC
Google様がやっているWebRTC https://webrtc.org
これのAndroid native clientを使ってみたのだけど、Bluetoothのheadsetをpairngしても音声とマイクが本体につながってて、BTデバイスにroutingされないので、ちょっといじってみた。
結論からいうとAppRTCAudioManager.java
を弄る必要がありますが、とくに難しいことはありません。
※ BT接続のところは適当です。
public enum AudioDevice { SPEAKER_PHONE, WIRED_HEADSET, EARPIECE, + BLUETOOTH_HEADSET } public void init() { Log.d(TAG, "init"); if (initialized) { return; } ___snip___ - updateAudioDeviceState(hasWiredHeadset()); + boolean btConnected = isBtHeadsetConnected(); + updateAudioDeviceState(hasWiredHeadset(), btConnected); + + // ここかなりサボってます。 + // 本当はBT接続処理をちゃんとしないとだめですよ + if (btConnected) { + audioManager.startBluetoothSco(); + audioManager.setBluetoothScoOn(true); + } else { // Register receiver for broadcast intents related to adding/removing a // wired headset (Intent.ACTION_HEADSET_PLUG). registerForWiredHeadsetIntentBroadcast(); + } ___snip___ /** Changes selection of the currently active audio device. */ public void setAudioDevice(AudioDevice device) { Log.d(TAG, "setAudioDevice(device=" + device + ")"); AppRTCUtils.assertIsTrue(audioDevices.contains(device)); switch (device) { case SPEAKER_PHONE: setSpeakerphoneOn(true); selectedAudioDevice = AudioDevice.SPEAKER_PHONE; break; case EARPIECE: setSpeakerphoneOn(false); selectedAudioDevice = AudioDevice.EARPIECE; break; case WIRED_HEADSET: setSpeakerphoneOn(false); selectedAudioDevice = AudioDevice.WIRED_HEADSET; break; + case BLUETOOTH_HEADSET: + setSpeakerphoneOn(false); + selectedAudioDevice = AudioDevice.BLUETOOTH_HEADSET; + break; default: Log.e(TAG, "Invalid audio device selection"); break; } onAudioManagerChangedState(); } + private boolean isBtHeadsetConnected() { + + BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); + Set<BluetoothDevice> devices = adapter.getBondedDevices(); + + return (adapter.getProfileConnectionState(BluetoothProfile.HEADSET) == + BluetoothProfile.STATE_CONNECTED); + } /** Unregister receiver for broadcasted ACTION_HEADSET_PLUG intent. */ private void unregisterForWiredHeadsetIntentBroadcast() { - apprtcContext.unregisterReceiver(wiredHeadsetReceiver); - wiredHeadsetReceiver = null; + if (wiredHeadsetReceiver != null) { + apprtcContext.unregisterReceiver(wiredHeadsetReceiver); + wiredHeadsetReceiver = null; + } } /** Update list of possible audio devices and make new device selection. */ + private void updateAudioDeviceState(boolean hasWiredHeadset, boolean hasBtHeadset) { + // Update the list of available audio devices. + audioDevices.clear(); + if (hasBtHeadset) { + audioDevices.add(AudioDevice.BLUETOOTH_HEADSET); + setAudioDevice(AudioDevice.BLUETOOTH_HEADSET); + } else { + updateAudioDeviceState(hasWiredHeadset); + } + }
ちなみにWired headsetはオリジナルのコードでちゃんと動いてました。
そのうちちゃんと勉強しようっと。
- 作者: Alan B. Johnston,Daniel C. Burnett,内田直樹(監訳)
- 出版社/メーカー: リックテレコム
- 発売日: 2014/12/12
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
TypeScriptネットワークプログラミング―HTML5/WebSocket/WebRTCによる
- 作者: 松田晃一
- 出版社/メーカー: カットシステム
- 発売日: 2014/12
- メディア: 単行本
- この商品を含むブログ (1件) を見る
今日の一言:リスクを取ることはオプションではない。義務だ。
スウェーデンのサッカー選手、ズラタン・イブラヒモビッチの呟き。
最近知ってすごく響いたので。
Risk everything is not an option. It's mandatory. #icicestparis #riskeverything pic.twitter.com/IrvwtzsK32
— Zlatan Ibrahimović (@Ibra_official) 2014年6月4日
いつも強気で勝ち気な天才イブラ様らしい、しかし凡庸な自分でも勇気づけられる言葉。
ついでにサッカーの名実況・寅さんこと山本浩氏(NHK)の本も紹介。
- 作者: 山本浩,倉敷保雄
- 出版社/メーカー: 出版芸術社
- 発売日: 2007/10
- メディア: 単行本
- 購入: 6人 クリック: 22回
- この商品を含むブログ (36件) を見る
スポーツ選手や実況から名言がよく生まれるのはなんなのですかね。今後もしょっちゅう登場すると思います。
蹴りたい言葉 サッカーがしたくなる101人の名言 (コスモブックス)
- 作者: いとうやまね
- 出版社/メーカー: コスミック出版
- 発売日: 2007/11/17
- メディア: 単行本(ソフトカバー)
- 購入: 1人 クリック: 16回
- この商品を含むブログ (2件) を見る
3-4歳児向け絵本おすすめ
過去のエントリーで2-3歳向けの本を紹介しましたが、本の内容が少しずつ高度になって来たので、別のエントリにします。
基本的には3-4歳児向けに読み聞かせるものです。
大渋滞でまっている親子の会話のお話で、はたらくくるまがたくさんでてきて子ども的に楽しいです。
2階建てバスにどんどん人がのり、やがて100階建に。100階建で走りつづけると、、、
ぎょうれつのできるシリーズはいくつかあって、どれもほんわかする良い本です。パンが好きになります。
最後になんとパンのレシピがついています。
間瀬なおかた氏の乗り物系の本に失敗はない。
最新のH5系新幹線も、E7系かがやきもでてきて最高。
左右どちらから開いても読めるギミックも素晴らしい。
今日の一言:どの説が正しいか、どの論が誤りか、、、
突然はじめてみます。今日の一言。
どの説が正しいか、どの論が誤りか、判断しようとするのは問題の本質を見失うことであろう。
SFモノの名作小説「星を継ぐもの」からの一言。
月面で真紅の宇宙服を着た人間の遺骸が発見され、その謎を明かすべく大きな論争に発展した中での、主人公ビクター・ハントの思考の一端がこれ。
- 作者: ジェイムズ・P・ホーガン,池央耿
- 出版社/メーカー: 東京創元社
- 発売日: 1980/05/23
- メディア: 文庫
- 購入: 207人 クリック: 2,160回
- この商品を含むブログ (476件) を見る
仏教の「中道」の考えに似ています。
暗号技術入門まとめ
とっつきにくい暗号技術が簡潔にわかり易く書かれていて、読んでいてとても面白かった。最高の入門書だと思います。
まだ2月だが、今年の My 技術書 of the yearはこの本に決まる可能性が高い。
第一部 暗号
いろんな暗号技術
- 対象暗号
- 公開鍵暗
- 一方向ハッシュ関数は正真性を提供
- メッセージ認証コードは、正真性と認証を提供
- デジタル署名はなりすまし、改ざん、否認防止
- 擬似乱数生成器 その場限りの鍵(セッションキー)を作るのに使う
この6つは暗号学者の道具箱と呼ばれている。暗号化に関する技術はこの6つを駆使することで実現されている。
セキュリティの常識
対称暗号
DES
64bitの平文をブロックとしてまとめて暗号化する。
現在ではブルートフォースアタックで解析できる様になった。
ファイステルネットワークを採用していて、ラウンドと呼ばれる暗号化の1ステップを何度も繰り返す。DESでは16ラウンド。
平文を32ビットごとに分けて、右32bitとサブ鍵をもとにラウンド関数fでビット列を生成し、左32bitとXORを採って暗号化する。これを右と左を入れ替えながら何度も繰り返す。
特徴
- ラウンド数を増やせる
- ラウンド関数fをどんなものにしても復号化が可能で、 出力から入力を逆算できなくてもよい。
- 暗号化と復号化を全く同じ構造で実現できる
Triple DES
特徴
- DES keyを3つ使って、暗号化、復号化、暗号化と三段重ねする。
- 単独のDESとしても使えるように2段目は 復号化 になる。
- 銀行などで使われているが、処理スピードが高くない。
AES
- 複数のラウンド
- SPN構造
- SubBytes > ShiftRows > MixColumns > AddRoundKey の順番で処理
- これを10-14回繰り返す
- 現時点で安全で高速
SubBytes:単一換字暗号
ShiftRows:行ごとに左に規則的にシフト
MixColumns:列ごとに行列計算
AddRoundKey:ラウンド鍵とXOR
ブロック暗号モード
ECB : Electric CodeBlock
- シンプルだが最も機密性が低い
- 同じ平文ブロックは常に同じ暗号文ブロックになる
- 電子符号表モード
ECBに対する攻撃
- ブロックの入れ替えが可能
- 仕組みとしては改ざんが可能(MACを使えば防げるけど)
CBC : Cipher Block Chaining
- 1つ前の暗号文ブロックと平文ブロックをXORを取ってから暗号化
- 最初の暗号文ブロックはランダムな値の初期化ベクトル
- 暗号文ブロックに対して入れかえや改ざんが困難
CFB : Cipher FeedBack
CFBモードへの攻撃
- 再生攻撃が可能
- 防ぐためにはMACが必要
OFB : Output FeecBack
CTRモード
- 1ずつ増加するカウンタを暗号化して鍵ストリームを作り出す
- カウンタは、ランダムな値ノンス8bitとブロック番号8bitを組み合わせて作る
公開鍵暗号
対象暗号には鍵配送問題がある。暗号的な解決方法は2つ
名前 | 用途 |
---|---|
公開鍵/public key | 暗号用 |
(私有)秘密鍵/private key | 複合用 |
問題
- 公開鍵暗号でも、認証の問題は解決できない。
- 対称鍵暗号は対象暗号に比べて何百倍も遅い
RSAのアルゴリズム
この辺のがまとまってて良さそう。
http://quanon.hateblo.jp/entry/2015/03/26/205949
公開鍵暗号への攻撃
- man-in-the-middle攻撃(中間者攻撃): アリスとボブの間に入って、鍵をすり替えながらなりすます攻撃。 対策は公開鍵の証明書
- 選択暗号文攻撃
ハイブリッド暗号システム
対称暗号と公開鍵暗号を組み合わせていいとこ取りする。
メッセージは対称暗号で暗号化し、そのセッションキーを公開鍵暗号で暗号化する。
一般的にメッセージが鍵自体よりも長いので有効。
セッションキーは擬似乱数生成器で作り出して推測不可能なものにする。
セッションキー暗号化とメッセージの暗号化を結合して送る。
PGP, SSL/TLSでも使われている。
第二部 認証
一方向ハッシュ関数
メッセージの指紋をとって改ざんされてないことを保証するもの。真正性のチェック。
ハッシュ値はもとのデータがどんな長さであっても固定サイズになる。
もとのデータが1bitでも変化したら、ハッシュ値も非常に高い確率で異なるべき。
- 弱衝突耐性
- ある特定のハッシュ値を持つ別のメッセージを見つけ出すことが困難であること
- 強衝突耐性
- ハッシュ値が一致するような異なるメッセージを見つけ出すことが困難であること
具体例
MD4/MD5
衝突を見つけることが考案されたので安全ではない
SHA1
教衝突耐性が破られたため、安全ではない
SHA2
まだやぶられてない
SHA3
SHA1が破られたことを受けて作られた新しい方式。Keccak
一方向ハッシュ関数への攻撃
一方向ハッシュ関数で解決できない問題
なりすましを検出できない。認証にはMACとデジタル署名が必要。
MAC: メッセージ認証コード
送信者の意図通りのものであることを照明する。改ざんとなりすましの防止が目的。
ひとことで言うと、鍵に依存した一方向ハッシュ関数。
メッセージからMAC値を計算し、メッセージと共に送る。受信者はメッセージからMAC値を計算して、受け取ったMAC値と比較することで認証する。
ここでも鍵配送問題がある。
ところで、ある時
対称暗号で暗号化されているのに、なぜMACが必要なのか。鍵を持っていて正しく復号化できるのであれば、それは正しい相手なのだから、MACは不要では??
という質問をされたことがある。
その時は明解に答えられなかったが、この本にほぼ同じ内容のコラムがあった。答えは
受信者は、平文を"正しく復号化"できているかを判断できない場合がある。例えば平文がランダムな文字列だったり、似た文字だった場合。平文が振り込み金額のみを送るようなケースでは「1000」という部分が「4258419」となってても正しさを判断できない。あるいは、平文が鍵をであるような場合、ランダムな文字列が別のランダムな文字列になってたら正しさを判断できない。
HMAC
MACに対する攻撃
- 再生攻撃(リプレイ攻撃) : 暗号化された内容を盗聴して同じ内容を再送する 対策としては、シーケンス番号、タイムスタンプ、ノンスを追加する。
MACで解決できない問題
- 第三者に対する証明
- 否認防止
デジタル署名
改ざん、なりすまし、否認防止が目的。
自分のメッセージであることを証明するために、メッセージ、あるいはそのハッシュ値を自分のプライベート鍵で暗号化したものをメッセージに付加して送る。受信側は送信者の公開鍵で復号化して、メッセージまたはハッシュ値と比較することで検証する。
デジタル署名にもman in the middle攻撃される可能性がある。
MACとデジタル署名の比較
メッセージ認証コード | デジタル署名 | |
---|---|---|
鍵 | 共有鍵 | 公開鍵暗号で署名作成・検証 |
鍵配送問題 | 起きる | 起きないが、公開鍵の認証が必要 |
正真性 | ◯ | ◯ |
認証 | ◯:通信相手に対してのみ | ◯:第三者に対しても |
否認防止 | × | ◯ |
デジタル署名で解決できない問題
正しい公開鍵を入手するために、証明書が必要。
つまるところ、公開鍵基盤 PKIが必要という話になる。
証明書
認証局(CA)が発行するもので、公開鍵が確かなものであることを証明する証明書(公開鍵証明書)
認証局はベリサインが有名
PKI
公開鍵を運用するための規格、仕様の総称。
PKCS(Public Key Cryptography Standards)もPKIの一種。
で構成される。
証明書を破棄する場合は、証明書破棄リストCRLを作成する。
鍵・乱数・応用技術
鍵 ― 秘密のエッセンス
鍵は平文と同じ価値があると考えられるので、推測出来ないものにする必要がある。最も良いのは乱数を使うこと。パスワード+ソルトをハッシュ関数にかける場合もある。PBE:Password based Encryption
鍵更新 (現在の鍵のハッシュ値を新しい鍵とする)も良い。
KEK : 鍵を暗号化するための鍵を使うと、守るべき鍵の本数が減る
Diffie-Hellman鍵交換
他人に知られても構わない情報を交換することで、お互いに共通の秘密鍵(セッションキー)を作りだす方法。
離散対数問題を解くことの難しさを利用している。
乱数
暗号化技術において、鍵、鍵ペア、IV、ノンス、ソルトの生成に使われる非常に重要なもの。
無作為性、予測不可能性、再現不可能性が求められる。
ソフトウェアが生成する乱数は周期性があるため、ハードウェアから、キーボード入力の時間間隔、放射線観測機、熱雑音などを乱数生成の種として利用し、再現不可能性を実現している。
セキュリティ用に使えるアルゴリズムとそうでないものがあるので注意。Javaでは、java.util.Random
は使えない。java.security.SecureRandam
はセキュリティ用。
PGP
Pretty Good Privacyの略。
OpenPGPという規格がある。
GnuPGPはOpenPGPを準拠したフリーソフトウェア。
対称暗号、公開鍵暗号(ハイブリッド暗号)、デジタル署名、一方向ハッシュ関数、証明書、圧縮、テキストデータ、分割統合、キーリングをサポート。
SSL/TLS
Secure Socket Layer / Transport Layer Security.
上位にくるHTTP/SMTP/POP3などの内容を暗号化する。
TLSプロトコルは、TSLレコードプロトコルとTSLハンドシェイクプロトコルによって構成されている。
暗号技術と現実社会
いくらソフトウェアを強固にして守っても、最終的には一番弱いところ(主に人間)から破られます。
ビットコイン
ビットコインは暗号化の技術を多数使っている。
P2Pベースの決済システムで、全ての取引記録が公開取引簿として記録されている。ブロックチェーン。
1つのブロックはトランザクション部とヘッダから出来ている。
トランザクション部には、トランザクションの集まりが保存されている。
ヘッダには直前のブロックのヘッダ部分のハッシュ値と、トランザクション部分のハッシュ値が格納されている。
ブロックを追加するためには、正しいヘッダを持ったブロックを計算しなければならない。直前のブロックのハッシュ値は、上位ビットに0が並ぶものになる。例えば0000000000000000000000539f09e0a0c753924678bca8eceb88eaa1...
のようなもの。条件を満たすハッシュ値が出るまで、ノンスを変えながらハッシュ値の計算をしまくる。この行為を採掘と言う。
量子暗号と量子コンピュータ
量子暗号が確立したら、解読できなくなる。盗聴によって読むと光子の状態が変化してしまうので。
それよりも先に量子コンピュータが誕生したら、現状の暗号化技術は全て解読される。
以上。
ほとんど単語だけのメモもありますが、検索用に。
全体を通して、本当に良い本でした。
以前読んだこちらも良い本でした。
体系的に学ぶ 安全なWebアプリケーションの作り方 脆弱性が生まれる原理と対策の実践
- 作者: 徳丸浩
- 出版社/メーカー: ソフトバンククリエイティブ
- 発売日: 2011/03/03
- メディア: 大型本
- 購入: 119人 クリック: 4,283回
- この商品を含むブログ (146件) を見る