第一章 暗号化・復号について 1. 暗号

第一章 暗号化・復号について
1.
暗号
暗号とは第三者に内容を知られないように行う特殊な通信(秘匿通信)方法のうち、暗号文を特別な知識なし
では読めないように変換する表記法である。 一方、受信者には暗号が伝達しやすく解読できる。また、紙やメー
ルやネットで正確に伝わるように機種依存文字ではなく可視である文字を使用する。秘匿通信には主に次の三種
類の方法がある。
1. ステガノグラフィ
ステガノグラフィとは、データを秘密状態でやり取りするための技術の一種で、あるデータを他のデータの
中に埋め込んで所在を秘匿する技術のことである。ステガノグラフィでは、画像データのように冗長性を持っ
たデータの中に隠したいデータを織り込ませることで所在を隠す手法が取られる。一般的な情報の秘匿手段
である暗号化とは異なり、情報の存在自体を外からは判別できなくすることができる長所を持っている。ス
テガノグラフィの技術は、画像データに著作権情報を追加する電子透かし技術などに応用されている。
2. コード
通信文の単語やフレーズを、事前に決めておいた言葉・記号で置き換える。これらは符牒や隠語とも呼ば
れる。
3. サイファ
通信文を、意味とは関係なく、所定のアルゴリズムに従って、
(1 つまたは複数の)文字やビットごとに置換
や転置を行うことで、読めない文に変換する。
秘匿通信を行う上で最も単純な方法は、(1) の通信文そのものの所在を隠してしまうことである。歴史上実際に行
われたものとしては、通信文を丸めて飲み込んだり、ベルトの内側に書き普通の被服のように身につけたり、新聞
の文字に印(文字横に穴を開ける等)をつけて文章を作る、頭を剃りあげて頭皮に通信文を刺青し、再び頭髪が
生えそろうことで隠す、などもあったようである。秘匿通信を行う方法としては(特に第二次世界大戦後は)、(3)
のサイファが主流である。
暗号には様々な方式があるが、現存する暗号は主に下記のように分類することができる。
古典暗号 - 暗号化・復号に鍵の概念を使わないものもある。
1. 換字式暗号 - 別の文字を割り当てる。単一換字、多表式換字などがある。
・単一換字:平文の文字に対して、暗号文の文字が常に同じ文字に変換されるような暗号のこと。例えば、
平文の“ d ”が、暗号文で必ず“ a ”になるならば、それは単一換字式暗号である。平文の文字に対して、暗
号文の文字が常に同じ文字に変換されるような暗号のこと。例えば、平文の“ d ”が、暗号文で必ず“ a ”に
なるならば、それは単一換字式暗号である。最もシンプルな単一換字式としてシーザー暗号、ポリュビオス
暗号などが知られている。仕組みが単純であり、簡単に解読されるため、現代ではほとんど使われていない。
・多表式換字:1 文字単位だが内部状態を保持し、変換ルールを切り替えながら変換を行う暗号のこと。単
一換字式暗号が安全でなくなってきた 15 世紀後半から 16 世紀後半にかけて考え出された暗号で、ヴィジュ
ネル暗号がおそらくもっとも有名なものである。
2. 転置式暗号 - 文字を並べ替える。
現代暗号 - 鍵を使い、アルゴリズムを公開したものが多い。
1. 共通鍵暗号 - 暗号化・復号で同じ鍵を使う。ブロック暗号、ストリーム暗号などがある。
・ブロック暗号:固定長のデータ(ブロックと呼ぶ)を単位として処理する暗号の総称である。
・ストリーム暗号:文をビット単位あるいはバイト単位などで逐次、暗号化する暗号である。
2. 公開鍵暗号 - 暗号化・復号で異なる鍵を使う。
1
鍵を使わない方法は、一度敵に知られた方法は二度と使えない、暗号の信頼性を客観的に評価することができな
いなどの問題がある。例えば、シーザー暗号(古典暗号の一つ)は、暗号化・復号の表記法が秘密でなければ安
全性が保てなかった。 それに対し鍵を使う方法は、アルゴリズム自体を敵に知られても構わないような方法が目
標であり、一度考案した方法は、鍵を変えることで何度でも使える、アルゴリズムを広く公開することで信頼性
を十分に検討することができるなどの多くの利点がある。 近代になると、このように鍵のみを秘密にしていれば
暗号化・復号の方法を皆に公開した場合でも安全を保てることが暗号にとって望ましい目標である(ケルクホフ
スの原理)と認識され、現代暗号では鍵を使うものが主流となった。 さらに現代暗号では、暗号化・復号の方法
だけではなく、暗号化の鍵を公開しても安全性が保てる方式(公開鍵暗号)も扱う。
インターネットなどのネットワークを通じて文書や画像などのデジタルデータをやり取りする際に、途中通信
で第三者に盗み見られたり改ざんされたりされないように決まった規則に従ってデータを変換することを暗号化
という。文章を暗号化するには、文字コードを用いて数値化する必要がある。暗号化、復号には暗号表にあたる
「鍵」を使うが、対になる二つの鍵を使う公開鍵暗号と、どちらにも同じ鍵を用いる共通鍵暗号がある。
2.
復号
復号とは、暗号化やデータ圧縮などがされたデータから、元のデータを復元すること。暗号の場合には、暗号
化に用いた秘密の情報 (暗号鍵) を用いて元のデータを得ることを意味し、これを用いずに元の情報を復元するこ
とは「解読」という。
「復号化」と表記する例も見られるが、(「暗号」が暗号文の意味を持ち、変換作業のことを
「暗号化」というのに対し) 暗号文から元のデータに戻す作業自体を復号という (復号というデータは存在しない)
ことから、復号化という表記は誤りであるとみなされることが多い。
3.
3.1.
文字コードの種類
ASCII
ASCII とは、アルファベットや数字、記号などを収録した文字コードの一つ。最も基本的な文字コードとして
世界的に普及している。7 ビットの整数 (0∼127) で表現され、ラテンアルファベット (ローマ字)、数字、記号、空
白文字、制御文字など 128 文字を収録している。ASCII は ISO 標準 7 ビット文字コード ISO/IEC 646 の元とな
り、後に 8 ビット文字コードである ISO/IEC 8859 が主流となって以降、世界中で使用されている様々な文字の
符号化方式の多くは、ASCII で使用されていない 128 番以降の部分に、その他の文字を割り当てたものである。
2
表 1: ASCII 文字コード表
コード
備考
00-1F
20
21-7E
表 2: 改行コードの違い
改行コード
代表的な環境
制御文字
空白
図形文字
7F
制御文字 (DEL)
※可視化できないものが含まれて
いる。
3.2.
LF(0x0a)
UNIX
CR(0x0d)
MacOS
CRLF(0x0d0a)
Windows
UTF-8
UTF-8 とは、Unicode1 の 16 ビット文字セットを、8 ビットのバイト列に変換するための技術仕様のことであ
る。UTF-8 は 8 ビットの可変長マルチバイトで文字を表現している。UTF-8 方式を用いて文字列を変換すると、
Unicode の最初の 128 文字を変換した結果が ASCII コードと全く同じくなる。そのため、旧来の処理システムと
も親和性が高く保つことができる。このとき UTF-8 は、英数は 1 バイトで表現し、日本語は 3 バイトで表現する。
そのため、UTF-16 と比べるとデータのサイズが大きくなってしまうという面もあり、UTF-8 と UTF-16 に関し
ては状況によって使い分ける必要がある。
コード
00-7x
8x,9x,Ax,Bx
表 UTF-8 文字コード表
カテゴリ
備考
1 バイト文字
UT-ASCII に同じ
多バイト文字の 2 バイト目以降
Cx,Dx
2 バイト文字の開始バイト
Ex
3 バイト文字の開始バイト
Fx
4 バイト以上の文字の開始バイト
漢字はおおむねこれで開始
F0-F7 は 4 バイト、F8-FB は 5 バイト
FC-FD は 6 バイト
※可視化できないものが含まれている。
表 UTF-8 と UTF-8N の違い
UTF-8
BOM 付き
BON なし
UTF-8N
表 テキストエディタの対応状況
アプリケーション
UTF-8
UTF-8N
メモ帳
読み○
書き○
読み×
書き×
eclipse
読み○
書き○
読み×
書き×
秀丸エディタ
読み○
書き△
読み×
書き○
BOM(Byte Order Mark) とは、Unicode の UTF-16 など 16 ビット幅のエンコーディング方式において、エン
ディアンを指定するためにファイルの先頭に記入される 16 ビットの値。
UTF-16 などではビット列の並びとしてビッグエンディアンとリトルエンディアンの両方を許容しているため、誤っ
たエンディアンで文書を読み込むと判読できなくなってしまう。このため、ファイルの先頭の BOM を読んで、文
書がどちらのエンディアンで作成されたかを判別してから本文を読み込む。
BOM は 16 進数で「FEFF」という 16 ビットの値で、誤ったエンディアンで読み込むと、これが「FFFE」とな
る。BOM が「FFFE」となった場合には逆のエンディアンを使って読み込めば正しく読み込むことができる。
BOM はエンディアンの判別だけでなく、文書が Unicode で記述されているかどうかを判別するために用いられる
こともある。このため、エンディアンが関係ない UTF-8 などの文書でも先頭に BOM がついている場合がある。
1 符号化文字集合や文字符号化方式などを定めた、文字コードの業界規格
3
3.3.
Shift-JIS
Shift JIS コードとは、日本語文字コードの一つ。Microsoft 社によって策定された。文字の 1 バイト目を見る
だけで漢字か 1 バイト文字 (いわゆる半角英数字) か分かる、等幅フォントで表示した場合に画面上の桁数とバイ
ト数が一致するなどの特長から、同社の MS-DOS や Windows、Apple 社の Mac OS など、パソコンの標準文字
コードとして広く普及した。
コード
表 Shift-JIS 文字コード表
カテゴリ
備考
0x00-ox1f,0x7f
1 バイト文字
制御コード
0x20-0x7e
1 バイト文字
ASCII 文字
0x829f-0x82f1
2 バイト文字
全角ひらがな
0x8340-0x8396
2 バイト文字
全角カタカナ
0x8940-0x9ffc
2 バイト文字 全角漢字
※可視化できないものが含まれている。
3.4.
JIS
JIS とは、日本工業規格 (JIS X 0208) で規定されている日本語の文字コードである。Windows をはじめ、日本
語の文字コードとして最も一般的に用いられている文字コードの一つとなっている。
表 Shift-JIS 文字コード表
カテゴリ
備考
コード
0x00-0x1f,0x7f
1 バイト文字
制御コード
0x20-0x7e
1 バイト文字
ASCII 文字
0x21-0x5f
1 バイト文字
JIS7(7 ビット JIS) の半角カタカナ
0xa1-0xdf
1 バイト文字
JIS8(8 ビット JIS) の半角カタカナ
0x2421-0x2473
2 バイト文字
全角ひらがな
0x2521-0x2576
2 バイト文字
全角カタカナ
0x3021-0x7c6e 2 バイト文字 全角漢字
※可視化できないものが含まれている。
3.5.
EUC-JP
EUC-JP とは、文字コード体系の EUC(Extended Unix Code) の各国定義部分に日本語文字集合の割り当てを定
義したものである。UNIX で日本語を扱うために使用されている。EUC は 1985 年に「UNIX システム日本語機能
提案書」の中で定義された日本語用 UNIX 内部コード体系に基づいて、 世界各国で使用可能なように拡張したコー
ド体系である。日本語 EUC は 4 種類の文字セットで構成される。ASCII 文字は 1 バイトで、JIS X 0208-1990(新
JIS) は 2 バイト。JIS X 0201(1 バイトカタカナ) は 1 バイト目に 16 進数 8E の制御コードとし、続く 1 バイトに
割り振り 2 バイトで定義する。16 進数 8F の制御コードに続く 2 バイトに JIS X 0212-1990(補助漢字) を割り振っ
ている。
コード
表 EUC-JP 文字コード表
カテゴリ
備考
0x00-0x1f,0x7f
1 バイト文字
制御コード
0xa4a1-0x7e
1 バイト文字
ASCII 文字
0xa4a1-0xa4f3
2 バイト文字
全角ひらがな
0xa5a1-0xa5f6
2 バイト文字
全角カタカナ
0xb0a1-0xfcee
2 バイト文字
全角漢字
0x8ea1-0x8edf 2 バイト文字 半角カタカナ
※可視化できないものが含まれている。
4
4.
4.1.
変換方法
Base64
データを 64 種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチ
バイト文字やバイナリデータを扱うためのエンコード方式である。かつての電子メールを送るためのプロトコル
SMTP では、ASCII といわれる 7byte で表現される英数字しか送ることができず、メールを使って画像や音声な
どのデータをやりとりしたいと思った時に、英数字しか対応していなかったので、送受信することができなかっ
た。Base64 は MIME によって規定されていて、7 ビットのデータしか扱うことの出来ない電子メールにて広く利
用されている。そこで、すべてのデータを英数字で表す MIME(Multipurpose Internet Mail Extensions) という
規格が登場し、その中で Base64 というデータの変換方法が定められた。これによって、受信側と送信側が MIME
に則ってエンコード・デコードをすることで、メールを通して画像や音声などの送受信が可能になった。具体的
には、A-Z, a-z, 0-9 までの 62 文字と、記号二つ (+, /)、さらにパディング (余った部分を詰める) のための記号と
して = が用いられる。
表 Base64 文字コード表
コード
備考
0-25
大文字アルファベット (A-Z)
26-51
小文字アルファベット (a-z)
52-61
数字 (0-9)
62
63
+
/
※全て可視化できる
〈変換手順〉
1. 元データを 6 ビットずつに分割。(6 ビットに満たない分は 0 を追加して 6 ビットにする)
2. 各 6 ビットの値を変換表を使って 4 文字ずつ変換。(4 文字に満たない分は=記号を追加して 4 文字にする)
例 1)”code”を 16 進、2 進にコード変換せよ
(16 進)63 6f 64 65
(2 進)0110 0011 0110 1111 0110 0100 0110 0101
例 2)”あいうえお”を base64 でコード変換せよ
文字列:”あいうえお”
(UTF-8 の場合)
16 進表示:e38182, e38184, e38186, e38188, e3818a
2 進表示:1110 0011 1000 0001 1000 0010, 1110 0011 1000 0001 1000 0100, 1110 0011 1000 0001 1000 0110, 1110
0011 1000 0001 1000 1000, 1110 0011 1000 0001 1000 1010
6 ビットずつに分割
111000 111000 000110 000010 111000 111000 000110 000100 111000 111000 000110 000110 111000 111000 000110
001000 111000 111000 000110 001010
変換表により、4 文字ずつ変換
”44 GC”, ”44 GE”, ”44 GG”, ”44 GI”, ”44 GK”
Base64 文字列
”44 GC 44 GE 44 GG 44 GI 44 GK”
(Shift-JIS の場合)
16 進表示:82a0, 82a2, 82a4, 82a6, 82a8
2 進表示:1000 0010 1010 0000, 1000 0010 1010 0010, 1000 0010 1010 0100, 1000 0010 1010 0110, 1000 0010
1010 1000
5
6 ビットずつに分割
100000 101010 000010 000010 101000 101000 001010 100100 100000 101010 011010 000010 101010 00
2 ビット余るので、4 ビット分 0 を追加して 6 ビットにする
100000 101010 000010 000010 101000 101000 001010 100100 100000 101010 011010 000010 101010 000000
変換表により、4 文字ずつ変換
”gqCC”, ”ooKk”, ”gqaC”, ”qA”
2 文字文余るので、2 文字分=記号を追加して 4 文字にする
”gqCC”, ”ooKk”, ”gqaC”, ”qA==”
Base64 文字列
”gqCCooKkgqaCqA==”
(EUC-JP の場合)
16 進表示:a4a2, a4a4, a4a6, a4a8, a4aa
2 進表示:1010 0100 1010 0010, 1010 0100 1010 0100, 1010 0100 1010 1000, 1010 0100 1010 1010
6 ビットずつに分割
101001 001010 001010 100100 101001 001010 010010 101000 101001 001010 1010
4 ビット余るので、2 ビット分 0 を追加して 6 ビットにする
101001 001010 001010 100100 101001 001010 010010 101000 101001 001010 101000
変換表により 4 文字ずつ変換
”pKKk”, ”pKSo”, ”pKo”
3 文字文余るので、1 文字分=記号を追加して 4 文字にする
”pKKk”, ”pKSo”, ”pKo=”
Base64 文字列
”pKKkpKSopKo=”
例 3)”44 GC 44 GE 44 GG 44 GI 44 GK”を Base64(UTF-8) でエンコードせよ
Base64 文字列
”44 GC 44 GE 44 GG 44 GI 44 GK”
4 文字ずつに分割
”44 GC”, ”44 GE”, ”44 GG”, ”44 GI”, ”44 GK”
変換表により変換
111000 111000 000110 000010 111000 111000 000110 000100 111000 111000 000110 000110 111000 111000 000110
001000 111000 111000 000110 001010
4 ビットずつに分割
1110 0011 1000 0001 1000 0010, 1110 0011 1000 0001 1000 0100, 1110 0011 1000 0001 1000 0110、1110 0011
1000 0001 1000 1000, 1110 0011 1000 0001 1000 1010
16 進表示に直す
e38182, e38184, e38186, e38188, e3818a
UTF-8 変換表により変換
”あいうえお”
6
5.
共通鍵暗号
共通鍵暗号とは暗号化と復号に同一の鍵を使う暗号方式である。暗号文の受信者と送信者で同じ鍵を共有する
必要があり、暗号文を送受信する前にあらかじめ安全な経路を使って秘密の鍵を共有する必要がある。公開鍵暗号
が発明される前までは、暗号といえば共通鍵暗号のことであった。
利点:共通鍵暗号は公開鍵暗号よりも処理時間が早い。
欠点:暗号化と復号に同じ鍵を使用するため、第三者に鍵を知られてしまうとデータを復号されてしまう。また、
通信接続先ごとに鍵を作成しなくてはならない。
6.
公開鍵暗号
公開鍵暗号とは暗号化に使う鍵と復号に使う鍵が分離されており、暗号化に使った鍵で復号を行うことができ
ず、片方からもう一方を割り出すことも容易にはできないようになっている。鍵の持ち主は復号に使う鍵のみを他
人に知られないように管理し、暗号化に使う鍵は公開する。このため、暗号化に使う鍵は公開鍵、復号に使う鍵
は秘密鍵と呼ばれる。
利点:暗号化されたメッセージは受信者の持つ秘密鍵でしか復号できないため、途中で第三者に傍受されても中
身を解読されることはない。また、暗号に使う公開鍵は第三者に知られても解読されないため、鍵の安全な輸送
が必要なく、安全性も高い。
欠点:公開鍵暗号は共通鍵暗号よりも処理が複雑になりがちであり、より多くの計算資源や時間を必要とする。
6.1.
DH 法 (Diffie-Hellman)
DH 法 (Diffie-Hellman 鍵交換) とは、公開鍵暗号方式が考案される以前の 1976 年に、Whitfield Diffie 氏と Martin
E. Hellman 氏によって考案された、安全でない通信経路を使って秘密鍵を安全に送受信するための鍵交換方式。
公開鍵を交換する暗号方式としては世界で始めて登場した方式とされ、IETF によって RFC 2539 として規格化さ
7
れている。
Diffie-Hellman 鍵交換方式では、離散対数問題を利用した計算によって生成された値を公開情報として相手に送
る。計算には乱数を用いるが、その乱数は秘密鍵として非公開のまま保持しておく。公開情報を受け取った相手
は、同様に自分の方で公開情報と秘密情報をランダムに生成した上で、自分が掲載によって得た公開情報を返す。
お互いの秘密情報は交換することなく、計算の元となった値を共有することが可能になる。離散対数問題の解析的
な解法が見つかっていないことを安全性の根拠としている。
〈ネットワーク公開情報〉
ネットワーク全体で共通に使用する情報として、ランダムに生成された素数 p と Zp∗ の原始元 g が公開されてい
ると仮定する。
〈鍵生成アルゴリズム〉
・送信者は 0 ≦ a ≦ p − 2 となる a をランダムに選び、yA = g a (mod p) を計算する。[補講]Zp = 0, …, p − 1(要
素が p 個)、Zp∗ = 1, …, p − 1(要素が p − 1 個) である。つまり、0 ≦ a ≦ p − 2 は、0 からカウントするので
p − 1 個で一致している。次に、yA を公開鍵として公開し、a を秘密鍵として秘密に保持する。
・受信者は 0 ≦ b ≦ p − 2 となる b をランダムに選び、yB = g b (mod p) を計算する。
次に、yB を公開鍵として公開し、b を秘密鍵として秘密に保持する。
〈鍵共有アルゴリズム〉
・送信者は自分の秘密鍵 a と受信者の公開鍵 yB を入力として、次を計算する。
KA = (yB )a
(mod p)
・受信者は自分の秘密鍵 b と送信者の公開鍵 yA を入力として、次を計算する。
KB = (yA )b
(mod p)
ここで、K = g ab (mod p) とおくと、K = KA = KB となる。
よって送信者と受信者は秘密鍵 K を秘密に共有できる。
6.2.
RSA 法 (Rivest-Shamir-Adleman)
代表的な公開鍵暗号系のひとつである。一方向性関数の性質を利用することで暗号化を可能としている。暗号
化だけでなく署名などにも応用ができる。
〈歴史〉RSA 暗号は 1977 年に R.L.Rivest、A.Shamir、L.Adleman によって考案された。RSA 暗号の名称は、ア
ルゴリズムの開発者の頭文字 (R.L.Rivest、A.Shamir、L.Adleman) が由来である。
〈鍵生成〉次のアルゴリズムを実行する。
1:2 つの大きな異なる素数 p, q を生成し、N = pq を計算する。
2:GCD2 ((p − 1)(q − 1), e) = 1 となる e をランダムに選ぶ。
3:拡張ユークリッドの互除法により、
ed ≡ 1 mod (p − 1)(q − 1)
となる d を求める。
4:pk = (N, e) を公開鍵として公開し、d を秘密鍵として保持する。
〈暗号化〉平文を 0∼(pq − 1) の範囲で数値化し、それぞれの値を m とする。公開鍵 (N, e) と m を入力として、
次のように暗号文 c を計算する。
c = me mod N
2 Greatest
Common Divisor : 二つ以上の自然数の公約数の中で最大のもの
8
〈復号〉秘密鍵 d と暗号文 c を入力として次のように計算し、平文 m に復号する。
cd mod N
上式の答えが平文 m と一致していれば、公開鍵暗号系の仕様がいえたことになる。
6.2.1.
試作プログラム
一節より、わたしたちは紙面でも伝えることができるように可視である文字を使用したいと考え、Base64 を用
いることにした。Unicode で定義される文字集合を用いて文字列をバイト列(数値の列)に変換する方式である
UTF-8 や、日本語を含む文字列を表現するための方式である Shift-JIS などの文字コードは不可視なものがランダ
ムに存在し、使用したい文字がまとまっていないためコード表をそのまま使用することができない。また、可視
である文字だけを使用する場合、平文 m を 0∼(pq − 1) の範囲内に数値化する必要があり計算が増える。そこで
平文 m を 64 種類の英数字のみでデータを表現する方式である Base64 を用いることで、UTF-8 や Shift-JIS を全
て可視である文字コードに変換することができる。さらに、使用したい文字がまとまっていることからコード表
をそのまま使用することができ、平文 m を 0∼(pq − 1) の範囲内に数値化する計算が必要ない。平文 m が 65 以
上のとき RSA 法の計算は可能であるが、可読文字への変換ができないという問題が生じる。この問題を解決する
ことさえできれば暗号化に適していると考えた。
Base64 変換とは元データを 6 ビットずつに分割し、各 6 ビットの値を変換表を使って 4 文字ずつ変換する方法
である。その際、4 文字に満たない分は=記号を追加するため、数字, アルファべット, +, /, =の合計 65 文字が必
要となることから、N が 65 以下になる二つの異なる素数 (p, q) の組み合わせを探す。よって p = 13, q = 5 のと
き、平文を RSA 法で暗号化・復号できる試作プログラムを作成した。この試作プログラムを基盤として改良する
ので、以下に詳しく手順を示す。
(1) 平文を Base64(UTF-8) を用いて数字, アルファべット, +, /, =のみに変換する。(エンコード)
(2)Base64 のコード表 (64 文字) に=を加えた 65 文字の文字列を設定する。
(3)(1) の変換結果を (2) の文字列から検索し、インデックス 3 を得る。(数字のみに変換)
(4)(3) の結果を RSA 法 (暗号化) を用いて計算する。
このとき、指数計算は関数ではなく for 文を使用する。なぜなら、べき乗関数である Math.Pow は計算過程でテイ
ラー展開を行うからである。テイラー展開とは以下の式で表される。
f (x) =
∞
∑
f (n) (a)
(x − a)n
n!
n=0
f (x) = xn の場合、Σの範囲が 0 →nの有限であるため小数になる。このことにより誤差が生じるので for 文を用
いて指数計算を行う。また、for 文中で指数計算のみを先に行うと、(int 型 4 ) 数値が大きくなりオーバーフロー 5
が起こるため指数、剰余の計算を同時に行う必要がある。
(5)(4) の計算結果をインデックスとし、(2) の文字列に格納されているデータを得ることで暗号文を作成する。
(6) 復号化を行うために (5) で作成した暗号文を (2) の文字列から検索し、インデックスを得る。(数字のみに変換)
(7)(6) の結果を RSA 法 (復号化) を用いて計算する。
(8)(7) の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(9)(8) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
以下に例を示す。
(例 1)
1. 平文 m を入力する。
”あいうえお”
3 プログラミングでは、配列の要素を区別・指定するための通し番号をインデックス
(添字) という
32 ビット整数である。範囲は-2,147,483,648∼2,147,483,648。
5 計算を行っている途中で計算結果がコンピューターの内部で扱える値の範囲を超えてしまう状態のこと。
4 符号付き
9
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの異なる素数 p, q を設定する。(p = 13, q = 5)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d ≡ 1 mod (13 − 1)(5 − 1)
7d ≡ 1 mod 48
d≡ 7
8. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 65 c = 56
c = 567 mod 65 c = 56
c = 67 mod 65 c = 46
c = 27 mod 65 c = 63
:
”56 56 46 63 56 56 46 4 56 56 46 46 56 56 46 57 56 56 46 10 ”
9. 文字列 str から (56 56 46 63 …) 番目の文字を表示する。
よって暗号文 c は”44u/44uE44uu44u544uK”となる。
10. 暗号文 c(44u/44uE44uu44u544uK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 46 63 56 56 46 4 56 56 46 46 56 56 46 57 56 56 46 10 ”
11. 暗号文 c, d = 7, N (= pq)=65 として平文 m(= cd mod N ) を計算する。
m = 567 mod 65 m = 56
m = 567 mod 65 m = 56
m = 467 mod 65 m = 6
m = 637 mod 65 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
12. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
13. 復号文 (44GC 44GE 44GG 44GI 44GK) を base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる
この試作プログラムの場合、文字列を増やし文字を割り当てれば暗号文に変換することができる p, q の範囲を
広げることができる。しかし、文字も文字列も有限であるため任意の二つの異なる素数 (p, q) では暗号文に変換
することができない。そのため RSA 法 (暗号化) の計算後、文字列数が少なく足りないのでインデックスを検索
10
することができない。よって文字列からインデックスを検索するのではなく Base64(UTF-8) 変換をすることで、
任意の二つの大きな異なる素数 (p, q) で暗号化、復号ができるようにした。
p, q が大きくなると RSA 法の計算結果が負の値になってしまいエラーが発生することがわかり、プログラム中
の mod 計算を行う方法として%演算子を使用している箇所に原因があると考えた。
実際に具体的な値の場合の%演算子の計算を試してみると、
125 mod 13 = 125%13 = 8
(−125) mod 13 = (−125)%13 = (−8)
となる。しかし私たちは
125 mod 13 = 125%13 = 8
(−125) mod 13 = (−125)%13 = 5
となると考えていた。%演算子は”余り”を求める演算子であり、被演算子が負の値の場合、余りの符号は機種依存
であるため矛盾がおきた。
そこで、被演算子が負の値になった理由としてオーバーフローしているのではないかと考えた。オーバーフロー
を防ぐために List 内の int 型をより範囲の広い long 型に置き換えたが、負の値が必要ないことから ulong(符号付
き長整数型) に変更した。その際、プログラム内のすべての int 型を uint 型に修正した。
<ソースコード>
static List<ulong> Mod2(uint p, uint q, uint e, uint[] data)
{
List<ulong> list = new List<ulong>();
for (int num = 0; num < data.Length; num++)
{
ulong z = 1;
for (int c = 0; c < e; c++)
{
z = data[num] * z;
}
list.Add(z);
}
return list;
}
また N が 64 以下の場合、平文を Base64 変換しインデックス検索した値が 0∼(N − 1) の範囲に入らないこと
があるので暗号化、復号を行うことができない。そこでインデックス検索した値を 0∼(N − 1) の範囲に入れるた
めに N 進数に変換し、一区切りずつ RSA 計算を行い Base64 変換をする。N 進数への変換方法はインデックス検
索した値を N で割って、その商をさらに N で割る。またその商を N で割るを、余りを出しながら商が 0 になる
まで繰り返し、余りを前から順に並べる。除算を繰り返す回数は 64 を N 進数に変換した桁数分行う。
(例) p = 3, q = 5(N = 15), e = 7, 平文”あいうえお”の場合
1. 平文を Base64 変換しインデックス検索した値
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
2. 除算を繰り返す回数を計算する。
64 ÷ 15 = 4 余り 4
4 ÷ 15 = 0 余り 4
つまり 64 を 15 進数にすると 44 になり桁数は 2 となるので、2 回除算を繰り返す。
11
3. インデックス検索した値を 15 進数に変換する。
56 ÷ 15 = 3 余り 11
3 ÷ 15 = 0 余り 3
56 ÷ 15 = 3 余り 11
3 ÷ 15 = 0 余り 3
:
”11 3 11 3 6 0 2 0 11 3 11 3 6 0 4 0 11 3 11 3 6 0 6 0 11 3 11 3 6 0 8 0 11 3 11 3 6 0 10 0”
4. 暗号化の RSA 計算した値
”11 12 11 12 6 0 8 0 11 12 11 12 6 0 4 0 11 12 11 12 6 0 6 0 11 12 11 12 6 0 2 0 11 12 11 12 6 0 10 0”
5. 復号の RSA 計算した値
”11 3 11 3 6 0 2 0 11 3 11 3 6 0 4 0 11 3 11 3 6 0 6 0 11 3 11 3 6 0 8 0 11 3 11 3 6 0 10 0”
6. 10 進数に変換した値
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
よってインデックス後の値と 10 進数に変換後の値が一致する。
本研究では Base64(UTF-8) 変換法 (10 進数) とし、以下に手順と例を示す。
Base64(UTF-8) 変換法 (10 進数)
(1) 平文を Base64(UTF-8) を用いて数字、アルファべット, +, /, =のみに変換する。(エンコード)
(2)Base64 のコード表 (64 文字) に=を加えた 65 文字の文字列を設定する。
(3)(1) の変換結果を (2) の文字列から検索し、インデックスを得る。(数字のみに変換)
(4)N < 65 の場合は (5) を行う。N ≧ 65 の場合は (6) を行う。
(5)(3) の結果を N 進数に変換する。
(6) 前の結果を RSA 法 (暗号化) を用いて計算する。
(7)(6) の計算結果を Base64(UTF-8) 変換し暗号文を作成する。(エンコード)
(8) 復号化を行うために、暗号文を Base64(UTF-8) を用いて数字, アルファベット, +, /, =のみに変換する。(デ
コード)
(9)(8) の結果を RSA 法を用いて計算する。
(10)N < 65 の場合は (11) を行う。N ≧ 65 の場合は (12) を行う。
(11)(9) の計算結果を 10 進数に変換する。
(12) 前の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(13)(12) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
(例 2)
1. 平文 m を入力する。
”あいうえお”
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの素数 p, q を設定する。(p = 13, q = 11)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
12
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d ≡ 1 mod (13 − 1)(11 − 1)
7d ≡ 1 mod 120
d ≡ 103
8. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 143 c = 56
c = 567 mod 143 c = 56
c = 67 mod 143 c = 85
c = 27 mod 143 c = 128
:
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
9. 暗号文 c を Base64 変換 (エンコード) する。
よって暗号文 c は”NTYgNTYgODUgMTI4IDU2IDU2IDg1IDgyIDU2IDU2IDg1IDg1IDU2IDU2IDg1IDU
3IDU2IDU2IDg1IDEwIA==”(84 文字) となる。
10. 暗号文 c(NTYgNTYgODUgMTI4IDU2IDU2IDg1IDgyIDU2IDU2IDg1IDg1IDU2IDU2IDg1IDU
3IDU2IDU2IDg1IDEwIA==) を Base64 変換 (デコード) する。
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
11. 暗号文 c, d = 103, N (= pq)=143 として平文 m(= cd mod N ) を計算する。
m = 56103 mod 143 m = 56
m = 56103 mod 143 m = 56
m = 85103 mod 143 m = 6
m = 128103 mod 143 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
12. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
13. 復号文 (44GC 44GE 44GG 44GI 44GK) を Base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる。
6.2.2.
暗号文の短縮
上記のプログラムの場合、平文の文字数に対して暗号文の文字数が多いため暗号文の短縮を行うことにした。そ
のためには RSA 法の計算結果を短くする必要があると考えた。10 進数の場合は 9 の次が桁上がりのタイミング
だが、16 進数の場合は F の次が桁上がりのタイミングとなる。10 進数では「9, 10, 11, 12」と表すところが、16
13
進数では「9, A, B, C」と表すことができるため 16 進数の方が少ない桁数で数字を表現することができる。よっ
て RSA 法の計算結果を 10 進数から 16 進数にすることで暗号文の短縮が可能になる。さらに数値の区切りを簡単
に判別できないように、スペースを省きすべての桁数を揃えることでより暗号文の短縮を行うことができる。こ
のとき、16 進数に変換した N (= pq) の数値の桁数に揃えることにする。また、桁数が足りない部分は 0 で補う。
本研究では Base64(UTF-8) 変換法 (16 進数) とし、以下に手順と例を示す。
Base64(UTF-8) 変換法 (16 進数)
(1)∼(4) 同上
(5)(4) の計算結果を 10 進数から 16 進数に変換する。
(6)(5) の結果を Base64(UTF-8) 変換し暗号文を作成する。(エンコード)
(7) 復号化を行うために、暗号文を Base64(UTF-8) を用いて数字, アルファベット, +, /, =のみに変換する。(デ
コード)
(8)(7) の変換結果を 16 進数から 10 進数に変換する。(9)(8) の結果を RSA 法を用いて計算する。
(10)(9) の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(11)(10) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
(例 3)
1. 平文 m を入力する。
”あいうえお”
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの素数 p, q を設定する。(p = 13, q = 11)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d≡ 1 mod (13 − 1)(11 − 1)
7d≡ 1 mod 120
d≡ 103
8. N (= pq) を 16 進数に変換し、長さ (桁数) を調べる。
N = (143)10 = (8f )16
このことから長さ (桁数) は 2 である。
9. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 143 c = 56
c = 567 mod 143 c = 56
c = 67 mod 143 c = 85
c = 27 mod 143 c = 128
:
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
14
10. 暗号文 c を 16 進数に変換する。(桁数:2)
”383855803838555238385555383855393838550a”
11. 暗号文 c を Base64 変換 (エンコード) する。
よって暗号文 c は”MzgzODU1ODAzODM4NTU1MjM4Mzg1NTU1MzgzODU1MzkzODM4NTUwYQ==”(56
文字) となる。
12. 暗号文 c(MzgzODU1ODAzODM4NTU1MjM4Mzg1NTU1MzgzODU1MzkzODM4NTUwYQ==) を Base64
変換 (デコード) する。
”383855803838555238385555383855393838550a”
13. Base64 変換 (デコード) した暗号文 c を 10 進数に変換する。
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
14. 暗号文 c, d = 103, N (= pq)=143 として平文 m(= cd mod N ) を計算する。
m = 56103 mod 143 m = 56
m = 56103 mod 143 m = 56
m = 85103 mod 143 m = 6
m = 128103 mod 143 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
15. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
16. 復号文 (44GC 44GE 44GG 44GI 44GK) を Base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる
例 2 と例 3 より、暗号文の文字数は Base64(UTF-8) 変換法 (10 進数) の場合は 84 文字、Base64(UTF-8) 変換
法 (16 進数) の場合は 56 文字となり 28 文字短縮することができた。また、10 進数を 32 進数に変換することでよ
り暗号文の短縮が可能であると考えた。16 進数の場合は F の次が桁上がりのタイミングだが、32 進数の場合は V
が桁上がりのタイミングとなる。16 進数では「F, 10, 11, 12」と表すところが、32 進数では「F, G, H, I」と表す
ことができるため 32 進数の方が少ない桁数で数字を表現することができる。よって RSA 法の計算結果を 10 進数
から 32 進数にすることで暗号文の短縮が可能になる。本研究では Base64(UTF-8) 変換法 (32 進数) とし、以下に
手順と例を示す。
Base64(UTF-8) 変換法 (32 進数)
(1)∼(6) 同上
(7)(6) の計算結果を 10 進数から 32 進数に変換する。
(8)(7) の結果を Base64(UTF-8) 変換し暗号文を作成する。(エンコード)
(9) 復号化を行うために、暗号文を Base64(UTF-8) を用いて数字, アルファベット, +, /, =のみに変換する。(デ
コード)
(10)(9) の変換結果を 32 進数から 10 進数に変換する。(11)(10) の結果を RSA 法を用いて計算する。
(12)N < 65 の場合は (13) を行う。N ≧ 65 の場合は (14) を行う。
(13)(11) の計算結果を 10 進数に変換する。
(14) 前の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(15)(14) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
(例 4)
15
1. 平文 m を入力する。
”あいうえお”
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの素数 p, q を設定する。(p = 13, q = 11)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d≡ 1 mod (13 − 1)(11 − 1)
7d≡ 1 mod 120
d≡ 103
8. N (= pq) を 16 進数に変換し、長さ (桁数) を調べる。
N = (143)10 = (8f )16
このことから長さ (桁数) は 2 である。
9. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 143 c = 56
c = 567 mod 143 c = 56
c = 67 mod 143 c = 85
c = 27 mod 143 c = 128
:
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
10. 暗号文 c を 32 進数に変換する。(桁数:2)
”1O1O2L401O1O2L2I1O1O2L2L1O1O2L1P1O1O2L0A”
11. 暗号文 c を Base64 変換 (エンコード) する。
よって暗号文 c は”MU8xTzJMNDAxTzFPMkwySTFPMU8yTDJMMU8xTzJMMVAxTzFPMkwwQQ==”(56
文字) となる。
12. 暗号文 c(MU8xTzJMNDAxTzFPMkwySTFPMU8yTDJMMU8xTzJMMVAxTzFPMkwwQQ==) を Base64
変換 (デコード) する。
”1O1O2L401O1O2L2I1O1O2L2L1O1O2L1P1O1O2L0A”
13. Base64 変換 (デコード) した暗号文 c を 10 進数に変換する。
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
16
14. 暗号文 c, d = 103, N (= pq)=143 として平文 m(= cd mod N ) を計算する。
m = 56103 mod 143 m = 56
m = 56103 mod 143 m = 56
m = 85103 mod 143 m = 6
m = 128103 mod 143 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
15. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
16. 復号文 (44GC 44GE 44GG 44GI 44GK) を Base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる
このように平文が短く、p, q が小さい場合は Base64(UTF-8) 変換法 (16 進数) の暗号文も文字数と同じで変化
がみられない。しかし、平文と p, q の値を変化させることで上記のプログラムに比べ暗号文を短縮することが可
能ということがわかった。以下に例を示す。
(例 5) 平文 31 文字、p = 331、q = 373、e = 7 のとき
< 10 進数> 864 文字
< 16 進数> 696 文字
< 32 進数> 556 文字
(10 進数)-(16 進数)=168 文字、(16 進数)-(32 進数)=140 文字、(10 進数)-(32 進数)=308 文字となる。
(例 6) 平文 69 文字、p = 331、q = 373、e = 7 のとき
< 10 進数> 1980 文字
< 16 進数> 1628 文字
< 32 進数> 1304 文字
(10 進数)-(16 進数)=352 文字、(16 進数)-(32 進数)=324 文字、(10 進数)-(32 進数)=676 文字となる。
例 2 と例 3 より、暗号文の文字数は Base64(UTF-8) 変換法 (10 進数) > Base64(UTF-8) 変換法 (16 進数) >
Base64(UTF-8) 変換法 (32 進数) となっている。
6.2.3.
複雑な暗号化
上記のプログラムより暗号化、復号を複雑にして強度をあげることにした。そのために RSA 法の計算の後に
Walsh 変換を行い計算を一段階増やした。Walsh 変換とはフーリエ変換の一般化の 1 つである。直交行列、対称
行列、対合、線形写像にの実数(もしくは複素数、しかしアダマール行列は実数である)上で作用する。アダマー
ル行列とは素が 1 または-1 のいずれかであり、かつ各行が互いに直交であるような正方行列である。以下に示し
たアダマール行列 H を使用してプログラムを作成する。
[
H=
1
1
]
1 −1
復号のときはアダマール行列 H の逆行列 H −1 を使用する。
H
−1
1
=−
2
[
−1 −1
−1
17
1
]
上記に示したアダマール行列 H を使用してプログラムを作成する。本研究では Base64(UTF-8) 変換法 (walsh) と
し、以下に手順と例を示す。
Base64(UTF-8) 変換法 (walsh)
(1)∼(4) 同上
(5)(4) の計算結果を walsh 変換する。
(6)(5) の計算結果を 10 進数から 16 進数に変換する。
(7)(6) の結果を Base64(UTF-8) 変換し暗号文を作成する。(エンコード)
(8) 復号化を行うために、暗号文を Base64(UTF-8) を用いて数字, アルファベット, +, /, =のみに変換する。(デ
コード)
(9)(8) の変換結果を 16 進数から 10 進数に変換する。
(10)(9) の計算結果を walsh 変換する。
(11)(10) の計算結果を RSA 法を用いて計算する。
(12)(11) の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(13)(12) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
(例 5)
1. 平文 m を入力する。
”あいうえお”
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの素数 p, q を設定する。(p = 13, q = 11)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d≡ 1 mod (13 − 1)(11 − 1)
7d≡ 1 mod 120
d≡ 103
8. N (= pq) を 16 進数に変換し、長さ (桁数) を調べる。
N = (143)10 = (8f )16
このことから長さ (桁数) は 2 である。
9. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 143 c = 56
c = 567 mod 143 c = 56
c = 67 mod 143 c = 85
c = 27 mod 143 c = 128
:
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
18
10. 暗号文 c を walsh 変換する。
”112 142 213 99 112 142 167 145 112 142 170 142 112 142 142 170 112 142 95 217 ”
11. 暗号文 c を 16 進数に変換する。(桁数:2)
”708ed563708ea791708eaa8e708e8eaa708e5fd9”
12. 暗号文 c を Base64 変換 (エンコード) する。
よって暗号文 c は”NzA4ZWQ1NjM3MDhlYTc5MTcwOGVhYThlNzA4ZThlYWE3MDhlNWZkOQ==”(56
文字) となる。
13. 暗号文 c(NzA4ZWQ1NjM3MDhlYTc5MTcwOGVhYThlNzA4ZThlYWE3MDhlNWZkOQ==) を Base64
変換 (デコード) する。
”708ed563708ea791708eaa8e708e8eaa708e5fd9”
14. Base64 変換 (デコード) した暗号文 c を 10 進数に変換する。
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
15. Base64 変換 (デコード) した暗号文 c を walsh 変換する。
”112 142 213 99 112 142 167 145 112 142 170 142 112 142 142 170 112 142 95 217 ”
16. 暗号文 c, d = 103, N (= pq)=143 として平文 m(= cd mod N ) を計算する。
m = 56103 mod 143 m = 56
m = 56103 mod 143 m = 56
m = 85103 mod 143 m = 6
m = 128103 mod 143 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
17. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
18. 復号文 (44GC 44GE 44GG 44GI 44GK) を Base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる
walsh 変換を用いると、暗号文が複雑になり解読しにくさが増す。しかし、平文の文字数が増えると Base64(UTF8) 変換法 (16 進数) よりも暗号文の文字数がわずかに増える。
例えば平文の文字数が 225 文字の場合、Base64(UTF-8) 変換法 (16 進数) では暗号文が 1068 文字となる。Base64(UTF-
8) 変換法 (walsh) では 1076 文字となり、8 文字増えたことがわかる。
さらに暗号化を複雑にするためにもう一段階計算を増やすことにした。RSA 法と walsh 変換の間に mod 計算を入
れた。暗号化には下記の計算を使用する。x には RSA 法の計算結果を入れる。
(x + 5) mod N
復号には下記の計算を使用する。また (x − 5) が負の値になるのを防ぐために (x − 5) < 0 の場合、x = x + n と
して計算する。
(x − 5) mod N
本研究では Base64(UTF-8) 変換法 (walsh+mod) とし、以下に手順と例を示す。
19
Base64(UTF-8) 変換法 (walsh+mod)
(1)∼(6) 同上
(7)(6) の計算結果を mod 計算する。
(8)(7) の計算結果を walsh 変換する。
(9)(8) の計算結果を 10 進数から 16 進数に変換する。
(10)(9) の結果を Base64(UTF-8) 変換し暗号文を作成する。(エンコード)
(11) 復号化を行うために、暗号文を Base64(UTF-8) を用いて数字, アルファベット, +, /, =のみに変換する。(デ
コード)
(12)(11) の変換結果を 16 進数から 10 進数に変換する。
(13)(12) の計算結果を walsh 変換する。
(14)(13) の計算結果を mod 計算する。(15)(14) の計算結果を RSA 法を用いて計算する。
(16)N < 65 の場合は (17) を行う。N ≧ 65 の場合は (18) を行う。
(17)(15) の計算結果を 10 進数に変換する。
(18) 前の計算結果をインデックスとし、(2) の文字列に格納されているデータを得る。
(19)(18) の結果を Base64(UTF-8) を用いて変換し復号する。(デコード)
(例 6)
1. 平文 m を入力する。
”あいうえお”
2. 平文 m を base64 変換 (エンコード) する。
”44GC 44GE 44GG 44GI 44GK”
3. 2 つの素数 p, q を設定する。(p = 13, q = 11)
4. 65 個の文字列 str を設定する。(”A-Z, a-z, 0-9, +, /, =”)
5. 平文 m(44GC 44GE 44GG 44GI 44GK) と一致する文字を文字列 str から検索しインデックスを得る。
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
6. GCD((p − 1)(q − 1), e)=1 となる e をランダムに選ぶ。(e = 7)
7. p, q, e を用いて、ed ≡ 1 mod (p − 1)(q − 1) となる秘密鍵 d を求める。
7d≡ 1 mod (13 − 1)(11 − 1)
7d≡ 1 mod 120
d≡ 103
8. N (= pq) を 16 進数に変換し、長さ (桁数) を調べる。
N = (143)10 = (8f )16
このことから長さ (桁数) は 2 である。
9. N (= pq), e を公開鍵と平文 m を入力として、暗号文 c(= me mod N ) を計算する。
c = 567 mod 143 c = 56
c = 567 mod 143 c = 56
c = 67 mod 143 c = 85
c = 27 mod 143 c = 128
:
”56 56 85 128 56 56 85 82 56 56 85 85 56 56 85 57 56 56 85 10 ”
20
10. 暗号文 c を mod 計算する。
”66 66 95 138 66 66 95 92 66 66 95 95 66 66 95 67 66 66 95 20 ”
11. 暗号文 c を walsh 変換する。
”132 142 233 99 132 142 187 145 132 142 190 142 132 142 162 170 132 142 115 217 ”
12. 暗号文 c を 16 進数に変換する。(桁数:2)
”848ee963848ebb91848ebe8e848ea2aa848e73d9”
13. 暗号文 c を Base64 変換 (エンコード) する。
よって暗号文 c は”ODQ4ZWU5NjM4NDhlYmI5MTg0OGViZThlODQ4ZWEyYWE4NDhlNzNkOQ==”(56
文字) となる。
14. 暗号文 c(ODQ4ZWU5NjM4NDhlYmI5MTg0OGViZThlODQ4ZWEyYWE4NDhlNzNkOQ==) を Base64
変換 (デコード) する。
”848ee963848ebb91848ebe8e848ea2aa848e73d9”
15. Base64 変換 (デコード) した暗号文 c を 10 進数に変換する。
”66 66 95 138 66 66 95 92 66 66 95 95 66 66 95 67 66 66 95 20 ”
16. Base64 変換 (デコード) した暗号文 c を walsh 変換する。
”132 142 233 99 132 142 187 145 132 142 190 142 132 142 162 170 132 142 115 217 ”
17. Base64 変換 (デコード) した暗号文 c を mod 計算する。
”66 66 95 138 66 66 95 92 66 66 95 95 66 66 95 67 66 66 95 20 ”
18. 暗号文 c, d = 103, N (= pq)=143 として平文 m(= cd mod N ) を計算する。
m = 56103 mod 143 m = 56
m = 56103 mod 143 m = 56
m = 85103 mod 143 m = 6
m = 128103 mod 143 m = 2
:
”56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10”
19. 文字列 str から (56 56 6 2 56 56 6 4 56 56 6 6 56 56 6 8 56 56 6 10) 番目の文字を表示
”44GC 44GE 44GG 44GI 44GK”
20. 復号文 (44GC 44GE 44GG 44GI 44GK) を Base64 変換 (デコード) する。
よって平文 m は”あいうえお”となる
例 5 と例 6 より暗号文の文字数は変わらない。また、平文の文字数が増えても暗号文の文字数は変わらない。
参考文献
[1] SecurityAkademeia〈http://akademeia.info/index.php?FrontPage〉
[2] IT 用語辞典
e-Words〈http://e-words.jp/〉
[3] シニアエンジニアの庵〈http://sehermitage.web.fc2.com/cmath/ec-calc.html〉
21
[4] マスター IT〈http://www.atmarkit.co.jp/ait/articles/1504/27/news032.html〉
[5] base64ってなんぞ??理解のために実装してみた¡http://qiita.com/PlanetMeron/items/2905e2d0aa7fe46a36d4〉
[6] IT 用語辞典 BINARY〈http://www.sophia-it.com/〉
22