Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

社内勉強会:iOSのBluetooth通信でRSA暗号化体験

はじめまして、iOSエンジニアの千吉良です。
今回は社内で行われている勉強会の内容の一つを紹介したいと思います。

弊社では社内勉強会として、幾つかのチームごとに題材を決め、定期的に発表を行う会を開いております。僕は「SICP(計算機プログラムの構造と解釈)」を題材としています。SICPはMITで計算機科学の入門的な教科書として使われているものらしく、表紙に魔術師のような絵が描かれている事から、巷では「魔術師本」とか呼ばれているみたいですね。

今回紹介する内容

SICPの序盤に、素数に関する箇所があります。素数を使って何か発表向けのものができないかと考えたところ、RSA暗号が思い浮かびました。秘密鍵・公開鍵って良く聞くし使いますよね。iOS担当でもある事ですし、2台のiPhone端末間でRSA暗号を使ってやりとりをするようなものができないかと思い、Bluetooth通信を利用して鍵の受け渡しや暗号文の送信を実感して遊べるデモアプリを作成してみました。*1

今回の実装をするにあたり、こちらの書籍も参考に致しました。
暗号理論と代数学

作成したサンプルアプリ 'BluetoothRSASample'

ソースコードGitHub上に公開しています。

BluetoothRSASample
GitHub - naru-jpn/BluetoothRSASample: RSA通信の実感サンプル

f:id:timers-tech:20151101222027p:plain

このサンプルアプリは、2台のiPhone間でBluetooth通信を行う前提で作られています。暗号化・複合化の鍵として使う数字は設定画面内にプレースホルダーとして入っていますので、そちらの数字で試していただくといいかも知れません。数字を別のものに編集して、挙動がどう変わるかも見る事もできます。

Bluetooth通信の実装は、Appleのサンプルプロジェクト'BTLE Transfer'の実装内容を利用しています。送信側のAdvertisingスイッチをオンにして受信側の端末を近づけると、公開鍵や暗号文が送受信できます。Bluetooth通信の仕組みもきちんと整理して、いつかまとめたいですね。

動作手順

1. 暗号文を受け取る側の端末に、秘密鍵・公開鍵を登録します。
f:id:timers-tech:20151101223153j:plain

2. 暗号文を作成する側の端末に、公開鍵を送信します。
f:id:timers-tech:20151101223158j:plain

3. 暗号文を作成する側の端末で、公開鍵を使って平文を暗号化します。
f:id:timers-tech:20151101223204j:plain

4. 暗号文を受け取る側の端末に、暗号文を送信します。
f:id:timers-tech:20151101223209j:plain

5. 暗号文を受け取る側の端末で、秘密鍵を使って暗号文を複合化します。
f:id:timers-tech:20151101223214j:plain

6. 平文が得られました!
f:id:timers-tech:20151101223217j:plain

RSA暗号とは

仕組みを詳しく説明し始めたりしたら一回分の投稿に収まるはずもなく、この投稿は必然的にシリーズ物になってこのブログを埋め尽くしてしまいます。ここでは「あれ、これ暗号化・複合化じゃない?」程度の実感を持っていただく事を目的にしたいと思います。

まず、3人の登場人物を紹介します。

e=17,~~N=21,~~d=5

2を操作してみる

いきなりですが、2をe(17)乗したものを計算し、N(21)で割った余りを計算してみましょう。

2^{17} \% 21 = 11

さらに、11をd(5)乗したものを計算し、N(21)で割った余りを計算します。

11^{5} \% 21 = 2

最終的な計算結果は 2 で、はじめの値と同じです。他の数ではどうでしょうか?

3を操作してみる

次に、3をe(17)乗したものを計算し、N(21)で割った余りを計算してみましょう。

3^{17} \% 21 = 12

12をd(5)乗したものを計算し、N(21)で割った余りを計算します。

12^{5} \% 21 = 3

おお、計算結果は 3 になりました。

4を操作してみる

4^{17} \% 21 = 16

16^{5} \% 21 = 4

5を操作してみる

4^{17} \% 21 = 16

17^{5} \% 21 = 5

...

以後同様です。いずれも2回目の計算で元の数字に戻っています。

ここで、「17乗して21で割る」という操作を E と名付け、「5乗して21で割る」という操作を D と名付けましょう。

2\xrightarrow{E}11,~~3\xrightarrow{E}12,~~4\xrightarrow{E}15,~~5\xrightarrow{E}16,...

11\xrightarrow{D}2,~~12\xrightarrow{D}3,~~15\xrightarrow{D}4,~~16\xrightarrow{D}5,...

もうお分かりでしょう。ここでは E が暗号化の操作、D が複合化の操作に対応しています。

この計算例では、

e=17,~~N=21,~~d=5

という数字の組を選びました。実は、21という数字は、素数3と素数7との積で作られる数です。適当な計算によって、暗号化・複合化として使う 17 と 5 を求めることが出来ます。例として 3 と 7 という小さい数を挙げましたが、実際には数百桁程度の数が用いられるようです。

数字 e と N を知っていれば暗号化を行うことができ、数字 d を知っている人だけが複合化をすることができます。そこで、(e, N) の組を公開して暗号化された文章を作ってもらいます。そうして作られた暗号文は、秘密の数字 d を知っている人だけが複合化を行うことができます。

あとがき

長くなってしましましたが、こんな内容の勉強会も行っています。他のチームでも色々と面白い内容を取り上げていますよ!
少しでも気になった方、試しに話を聞いてみたい方、気軽にご連絡ください!


================

子育て家族アプリFamm、カップル専用アプリPairyを運営する Timers inc. では、現在エンジニアを積極採用中!急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください!
採用HP : http://timers-inc.com

*1:鍵を使った暗号化・複合化の再現のみで、鍵の生成の為の実装は含まれていません。

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる