デジタル署名が手書きからRSA暗号になるまでの流れを解説してみる
おはようございます。タカヒデです。
「デジタル署名」知っていますか?
基本情報技術者や応用情報技術者を勉強していると出てくるアレです。
署名というと普通手書きでサインを書くものですよね。
アレをどうやってデジタルに表現するのでしょうか?
ということで本日は、「デジタル署名が手書きからRSA暗号になるまでの流れ」を解説していきたいと思います。
なお、本日の内容も「世界でもっとも強力な9のアルゴリズム」という本から引用させていただいています。
2012年に発売された本ですが、様々なアルゴリズムを分かりやすく教えているのでオススメですよ。
それでは始めていきましょう。
そもそもデジタル署名ってなんだっけ?
まずはそもそもデジタル署名が何だったか、簡単に解説していきます。
「そんなん知っているわい」という方は読み飛ばしてください。
デジタル署名とは、「データが途中で改ざんされていないか?誰が送信したものなのか?」を受け取る側で確認できるようにした技術です。
実際の現実世界で「100万円借りました」みたいな借用書に手書きサインや印鑑を押すのと同じ役割をデジタルの世界でもできるようにしています。
もう少し具体的にいうと、自分しか知らない「秘密鍵」で署名を作成し、誰でも使える「公開鍵」で署名の検証を行います。
この公開鍵を「CA(Certificate Authority)」という認証局に登録することで、「公開鍵が自分のものである」と証明することができます。
ではRSA暗号とは?
続けてRSA暗号についても簡単に理解しておきましょう。
ここも本記事のメインではないのでサラッと流していきます。
RSA暗号とは、「素因数分解を用いて公開鍵暗号方式やデジタル署名を行う技術」のことです。
もう少し具体的にいうと、
- 2つの大きな素数を掛け合わせる→簡単
- 掛け合わせた数字から元の2つ素数を求める→難しい
この性質を利用して暗号化を行っている技術です。
(ちなみに素数とは1とその数字以外では割り切れない数字のことです。2,5,11とかこの辺の数字ですね)
「元の数字を求めることが難しい」ってことはいつかはできるんじゃないの?って思われたかもしれませんが、その通りです。
ただ、RSAでは数千桁の数字を扱うため、スーパーコンピューターをつかっても解読するのに数兆年の時間がかかり現実的ではないと言われています。
なので実際にデジタル署名などで使われている技術なんですね。
署名が手書きからRSA暗号でデジタル署名になるまでの流れ
お待たせしました。
前置きが長くなりましたが、「署名が手書きからRSA暗号でデジタル署名になるまでの流れ」を解説していきます。
- STEP1:紙に手書きする署名
- STEP2:南京錠と鍵を使った署名
- STEP3:掛け算を使った署名
- STEP4:指数を使った署名(デジタル署名)
こんな流れで解説していきますね。
なお一貫してやりたいことは、「100万円を山田から借りました」というメッセージをタカヒデが書いたものであることを証明できるかです。
常にそういった視点で見ていただけると良いかと思います。
STEP1:紙に手書きする署名
まずSTEP1は「紙に手書きで署名」することです。
これは昔からの馴染みの方法ですね。
「100万円を山田から借りました」というメッセージと共にタカヒデが手書きで署名します。
↓のイメージではテキストで入力していますが、本来はこれを手書きで行います。

また、署名銀行にも手書き署名を預けておくことで、これが本当にタカヒデの直筆のものであるかをか確認することも可能です。
こうしてSTEP1で「100万円を山田から借りました」というメッセージをタカヒデが書いたものであることを証明できました。
STEP2:南京錠と鍵を使った署名
続けてSTEP2は「南京錠と鍵」を使った署名です。
ここではタカヒデの鍵のみで開く南京錠を用意します。
↓のイメージにおけるオレンジの南京錠はタカヒデの持つオレンジの鍵でのみ開けることができます。

「100万円を山田から借りました」というメッセージを箱に入れ、その箱をタカヒデの鍵のみで開く南京錠でロックします。
これでこのメッセージを入れることができるのはタカヒデのみであり、鍵を開けられるのもタカヒデのみです。
しかし、100万円の支払いから逃れたいタカヒデは「鍵を無くした!」とか「この南京錠は私のではない!」とか言い出すかもしれません。
そういわないように鍵を銀行に預けることにしましょう。
こうしてSTEP2でも「100万円を山田から借りました」というメッセージをタカヒデが書いたものであることを証明できました。
STEP3:掛け算を使った署名
さて、ここからがデジタルな署名に移っていきます。
STEP3では「掛け算を使った署名」を行います。
日本語のテキストもデジタルの世界においては数字で表すことができます。
分かりやすくするために「100万円を山田から借りました」というメッセージが、ここでは「5」という一桁の数字だとしましょう。
【前提】時計算を使う
この掛け算を使った署名では「時計算」を使います。
↓のイメージは時計サイズを「11」とした場合です。

「11」まではそのまま表すことができますが、「12」で再度「1」に戻ります。
この時計算では「16」は「5」になり、「33」は「11」になります。
①時計サイズを決める
ここでは上記の通り「11」を選択します。
②南京錠の数字を決める
南京錠となる数字を決めます。
この数字は時計サイズより小さいものを選択します。
ここでは「6」を選んだものとしましょう。
③メッセージに鍵をかける
メッセージの「5」に南京錠の「6」を掛け合わせることでメッセージに鍵をかけます。
「5×6=30」なので時計算では「8」となります。
この「8」がメッセージに対する署名です。
④メッセージを解錠する
今度は鍵のかかったメッセージを解錠します。
解錠するためには「2」という鍵となる数字を使います。
(この「2」という数字はユークリッドのアルゴリズムというもので生成されるらしいけど割愛します)
署名の「8」と、鍵の「2」を掛け合わせてみましょう。
「8×2=16」なので、時計算では「5」となります。
もとのメッセージと同じになりましたね。

このように元のメッセージである「5」と、解錠したメッセージの「5」が一致すればデジタル署名は本物であるといえます。
ちなみ今回使った、「南京錠:6倍」という数字は秘密にしておかなければなりません。
一方、「時計サイズ:11」、「鍵:2倍」という数字は公開しておくことで、誰でもタカヒデの署名を確かめることができます。
この「時計サイズ」と「鍵」を認証局と呼ばれる鍵銀行に登録しておくことで、「タカヒデの署名は本物である」と証明することができます。

以上がSTEP3の「掛け算を使った署名」です。
ただ、実はこの掛け算を使った署名はコンピュータを使えば「南京錠の値を見つけ出すことができてしまう」らしい。
これでは署名に使えないですね。
STEP4:指数を使った署名
ということで最後、STEP4の「指数を使った署名」の解説に行きましょう。
指数とは「3の4乗」のように使われ、「3×3×3×3」といった計算を行うやつのことです。
【前提】ここでも時計算を使う
STEP3と同様、指数を使った署名でも「時計算」を使います。
ただし、ここではもう少し大きな数字で時計サイズを「22」としています。

ここからはSTEP3とほぼ同じです。
掛け算を使うのか、指数を使うかだけの違いです。
①時計サイズを決める
ここでは例の通り「22」を選択します。
②南京錠の数字を決める
南京錠となる数字を決めます。
この数字は時計サイズより小さいものをなので、「3」を選んだものとしましょう。
③メッセージに鍵をかける
メッセージが「4」だとして、に南京錠の「3」を乗じることでメッセージに鍵をかけます。
「4×4×4=64」なので時計算では「20」となります。
この「20」がメッセージに対する署名です。
④メッセージを解錠する
今度は鍵のかかったメッセージを解錠します。
解錠するためには「7」という鍵となる数字を使います。
署名の「20」に、鍵の「7」を乗じて「20×20×20×20×20×20×20=12億8千万」なので、時計算では「4」となります。(あってるかな?)

これでSTEP4でも「100万円を山田から借りました」というメッセージをタカヒデが書いたものであることを証明できました。
これがデジタル署名で使われるRSAのアルゴリズムです。
ここでも「南京錠:3乗」という数字は秘密にしておき、「時計サイズ:22」、「鍵:7乗」という数字は公開し認証局に登録しておきます。

RSAの解説の中でも伝えた通り、RSAは完璧にセキュリティが守られているわけではありません。
しかし、スーパーコンピューターをつかっても解読するのに数兆年の時間がかかるため現在も使われているアルゴリズムのようです。
まとめ
以上が「デジタル署名が手書きからRSA暗号になるまでの流れ」の解説でした。
- デジタル署名
- 「データが途中で改ざんされていないか?誰が送信したものなのか?」を受け取る側で確認できるようにした技術
- RSA暗号
- 素因数分解を用いて公開鍵暗号方式やデジタル署名を行う技術
どうでしょう?少し説明が分かりづらかったかもしれませんね。
なかなか理解できなかった方はぜひ「世界でもっとも強力な9のアルゴリズム」を読んでみると良いかと思います。
お疲れさまでした。
