以下に添付図面を参照して、この発明にかかるノード、通信方法、および通信システムの実施の形態を詳細に説明する。
(ノードによるアドホックネットワークへの復帰処理例)
図1は、ノードによるアドホックネットワークへの復帰処理例を示す説明図である。図1において、ノードN1、ノードN2およびノードN3は、互いの通信圏内に存在する近隣ノードNである。ノードN1、ノードN2およびノードN3は、アドホックネットワーク内の各ノードNで共有される共通鍵(以下、「固定鍵」という)や、アドホックネットワーク内のノードN間で一定時間ごとに更新される共通鍵(以下、「アクセス鍵」という)を保持している。ノードN1、ノードN2およびノードN3は、固定鍵やアクセス鍵を用いてパケットを暗号化して得られた暗号化パケットEPの送受信を行っている。
ここでは、簡単のため、ノードN1は、暗号化パケットEPを近隣ノードNに送信する送信側のノードNであるとする。また、ノードN2およびノードN3は、暗号化パケットEPを近隣ノードNから受信する受信側のノードNであるとする。
ノードN1は、連結カウンタ値JCを保持している。連結カウンタ値JCは、上位桁のカウンタ値と下位桁のカウンタ値とが連結されたカウンタ値である。ここで、下位桁のカウンタ値は、今までにノードN1が暗号化パケットEPを送信した回数を示す送信カウンタ値Sである。上位桁のカウンタ値は、ノードN1において連結カウンタ値JCが消去された回数を示す消去カウンタ値Rである。図1の例では、ノードN1は、消去カウンタ値R「0x00」と、送信カウンタ値S「0x005678」と、を連結した連結カウンタ値JC「0x00005678」を保持している。なお、「0x」は16進数表記を示す。
ノードN1は、他ノードNを宛先にするデータの送信イベントがあると、連結カウンタ値JCに1を加算する。そして、ノードN1は、他ノードN(例えば、ノードN2,N3)を宛先にするデータと、加算後の連結カウンタ値JCと、を含むパケットを生成し、生成したパケットを暗号化して得られた暗号化パケットEPを、他ノードNに送信する。
また、ノードN1は、連結カウンタ値JCが消去されたことを検知すると、消去カウンタ値Rの取得要求を他ノードNに送信する。ノードN1は、取得要求を送信した結果、消去以前の連結カウンタ値JCの消去カウンタ値Rを他ノードNから受信する。そして、ノードN1は、受信した消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rと、送信カウンタ値Sの初期値と、を連結した連結カウンタ値JCを生成する。このとき、消去カウンタ値Rは上位桁であるから、消去以前の消去カウンタ値Rに1加算した加算後の消去カウンタ値Rから生成された新たな連結カウンタ値JCは、送信カウンタ値Sの大小に関わらず、消去以前の連結カウンタ値JCより大きい値になる。
ノードN2およびノードN3は、他ノードN(例えば、ノードN1)から暗号化パケットEPを受信する。ノードN2およびノードN3は、受信した暗号化パケットEPを復号して得られたパケットから他ノードNでの連結カウンタ値JCを抽出する。そして、ノードN2およびノードN3は、抽出した連結カウンタ値JCを、受信カウンタ値RCとして保持する。
図1の例では、ノードN2は、過去にノードN1から受信した暗号化パケットEPを復号して抽出した連結カウンタ値JC「0x00001230」を、受信カウンタ値RCとして保持している。また、ノードN3は、過去にノードN1から受信した暗号化パケットEPを復号して抽出した連結カウンタ値JC「0x00005678」を、受信カウンタ値RCとして保持している。
ここで、ノードN1では、送信ごとに連結カウンタ値JCに1を加算し、連結カウンタ値JCの消去後には消去前の連結カウンタ値より大きい値になる新たな連結カウンタ値を生成している。そのため、ノードN2およびノードN3が、ノードN1からの正規パケットを受信し続けている限り、今回受信した暗号化パケットEPに含まれる連結カウンタ値JCは、前回受信した暗号化パケットEPに含まれる連結カウンタ値JCより大きくなる。なお、上述したように、前回受信した暗号化パケットEPに含まれていた連結カウンタ値JCは、受信カウンタ値RCとして保持されている。一方で、ノードNが再送攻撃による不正パケットを受信した場合、再送攻撃では過去に送信されたパケットをそのまま送信しているため、ノードNが今回受信したパケットに含まれる連結カウンタ値JCは、受信カウンタ値RC以下となる。
そのため、ノードN2およびノードN3は、今回受信した暗号化パケットEPに含まれていた連結カウンタ値JCが受信カウンタ値RCより大きければ、暗号化パケットEPを正規パケットと判断する。一方、ノードN2およびノードN3は、今回受信した暗号化パケットEPに含まれていた連結カウンタ値JCが受信カウンタ値RC以下であれば、暗号化パケットEPを不正パケットと判断する。
ここで、図1において、停電によりノードN1に電力が供給されず、ノードN1が保持していた連結カウンタ値JC「0x00005678」が消去されてしまったとする。そのため、他ノードN(例えば、ノードN2,N3)に送信するパケットに含むべき連結カウンタ値JCが不明になり、ノードN1は、他ノードNにパケットを送信することができない。
(1)まず、ノードN1は、停電が回復し電力が供給されると、連結カウンタ値JCが消去されたことを検出する。
(2)次に、ノードN1は、連結カウンタ値JCが消去されたことを検出すると、消去カウンタ値Rの取得要求を含むパケットを生成し、生成したパケットを固定鍵を用いて暗号化する。そして、ノードN1は、暗号化により得られた取得要求を含む暗号化パケットEPを他ノードNに送信する。図1の例では、ノードN1は、取得要求を含む暗号化パケットEPを、ノードN2に送信できている。
(3)しかし、ノードN1は、ノードN3と通信不能の状態になっており、取得要求を含む暗号化パケットEPをノードN3に送信できていない。例えば、ノードN3と通信不能の状態になる原因としては、ノードN1とノードN3との間に障害物が存在することが挙げられる。
(4)ノードN2は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPを固定鍵を用いて復号する。次に、ノードN2は、復号により得られたパケットに取得要求が含まれることを検出すると、受信カウンタ値RC「0x00001230」から消去カウンタ値R「0x00」を抽出する。そして、ノードN2は、抽出した消去カウンタ値R「0x00」を含むパケットを生成し、生成したパケットを固定鍵を用いて暗号化する。次に、ノードN2は、暗号化により得られた暗号化パケットEPをノードN1に送信する。
(5)ノードN1は、ノードN2から暗号化パケットEPを受信すると、受信した暗号化パケットEPを固定鍵を用いて復号する。次に、ノードN1は、復号により得られたパケットから、消去カウンタ値R「0x00」を取得する。そして、ノードN1は、連結カウンタ値JCの消去以前での消去カウンタ値Rを示す取得した消去カウンタ値R「0x00」に、1を加算する。次に、ノードN1は、加算後の消去カウンタ値R「0x01」と、送信カウンタ値Sの初期値「0x000000」と、を連結して連結カウンタ値JC「0x01000000」を生成する。
ここで、ノードN1は、ノードN3と通信可能の状態になったとする。例えば、ノードN3と通信可能の状態になる原因としては、ノードN1とノードN3との間に存在した障害物が移動して、ノードN1とノードN3との間に障害物が存在しなくなったことが挙げられる。
(6)ノードN1は、ノードN3を宛先にするデータの送信イベントがあると、連結カウンタ値JC「0x01000000」に1を加算する。次に、ノードN1は、ノードN3を宛先にするデータと、加算後の連結カウンタ値JC「0x01000001」と、を含むパケットを生成し、生成したパケットを固定鍵を用いて暗号化する。そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードN3に送信する。
(7)ノードN3は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPの正当性の判断を行う。具体的には、ノードN3は、受信した暗号化パケットEPを、固定鍵を用いて復号する。次に、ノードN3は、復号により得られたパケットから連結カウンタ値JC「0x01000001」を取得する。そして、ノードN3は、前回受信した暗号化パケットEPに含まれていた連結カウンタ値JCを示す受信カウンタ値RC「0x00005678」と、取得した連結カウンタ値JC「0x01000001」と、の大小比較を行う。
ここで、ノードN3は、取得した連結カウンタ値JCが受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPは正規パケットであると判断する。そして、ノードN3は、受信カウンタ値RC「0x00005678」を取得した連結カウンタ値JC「0x01000001」で更新する。
(8)また、ノードN1は、ノードN2を宛先にするデータの送信イベントがあると、連結カウンタ値JC「0x01000001」に1を加算する。次に、ノードN1は、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x01000002」と、を含むパケットを生成し、生成したパケットを固定鍵を用いて暗号化する。そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードN2に送信する。
(9)ノードN2は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPの正当性の判断を行う。具体的には、ノードN2は、受信した暗号化パケットEPを、固定鍵を用いて復号する。次に、ノードN2は、復号により得られたパケットから連結カウンタ値JC「0x01000002」を取得する。そして、ノードN2は、前回受信した暗号化パケットEPに含まれていた連結カウンタ値JCを示す受信カウンタ値RC「0x00001230」と、取得した連結カウンタ値JC「0x01000002」と、の大小比較を行う。
ここで、ノードN2は、取得した連結カウンタ値JCが受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPは正規パケットであると判断する。そして、ノードN2は、受信カウンタ値RC「0x00001230」を取得した連結カウンタ値JC「0x01000002」で更新する。
このように、ノードN1は、連結カウンタ値JCを保持し、連結カウンタ値JCが消去されると、他ノードNに取得要求を送信することにより、消去以前の消去カウンタ値Rを他ノードNから取得する。そして、ノードN1は、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。これにより、過去にノードN1により送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードN1により生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードN1は、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
結果として、ノードN2およびノードN3は、保持している受信カウンタ値RCより、ノードN1から受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードN1から受信した暗号化パケットEPを正規パケットと判断することができるようになる。そして、ノードN1は、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。
また、従来のように、時刻情報を用いて不正パケットか否かを判断する場合、各ノードNが基準時刻との同期を、定期的または不定期に、アドホックネットワークを介して行う必要がある。この場合、時刻同期用のパケット量がアドホックネットワークに通信負荷をかける。一方、連結カウンタ値JCは自ノードN内の処理のみで更新が可能な相対的な値であるから、各ノードNは、アドホックネットワークへの通信負荷を削減することができる。そのため、ノードN2およびノードN3は、時刻同期を必要とせずに、暗号化パケットEP内の連結カウンタ値JCが受信ごとに増加することを監視して、ノードN1から受信した暗号化パケットEPが不正パケットか否かを判断することができる。よって、アドホックネットワークには、時刻同期用のパケットによる通信負荷が生じない。さらに、不正パケットか否かの判断に時刻同期を必要としないため、時刻同期用のパケットを送信するゲートウェイが、アドホックネットワーク内に存在しなくてもよい。
なお、ノードN1は、送信カウンタ値Sが最大値「0xFFFFFF」になったとき、送信カウンタ値Sを初期値「0x000000」に戻してもよい。このとき、ノードN1は、ノードN2およびノードN3に、送信カウンタ値Sを初期値に戻したことを示すパケットを送信する。そして、ノードN2およびノードN3は、受信カウンタ値RC内の送信カウンタ値Sを、初期値に戻す。また、ノードN1は、消去カウンタ値Rが最大値「0xFF」になったとき、消去カウンタ値Rを初期値「0x00」に戻してもよい。このとき、ノードN1は、ノードN2およびノードN3に、消去カウンタ値Rを初期値に戻したことを示すパケットを送信する。そして、ノードN2およびノードN3は、受信カウンタ値RC内の消去カウンタ値Rを、初期値に戻す。
また、ノードN1は、送信カウンタ値Sが最大値「0xFFFFFF」になり、かつ、消去カウンタ値Rが最大値「0xFF」未満であり増加可能であるとき、送信カウンタ値Sを初期値「0x000000」に戻すとともに、消去カウンタ値Rに1を加算してもよい。これにより、過去にノードN1により送信された暗号化パケットEPに含まれていた連結カウンタ値JCより大きい値で、連結カウンタ値JCを更新することができる。結果として、ノードN1は、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。このとき、ノードN1は、ノードN2およびノードN3に、消去カウンタ値Rを初期値に戻したことを示すパケットを送信しなくて済む。
なお、ノード2およびノード3は、ノードN1から受信した暗号化パケットEPに含まれる連結カウンタ値JCと保持している受信カウンタ値RCとの差がしきい値以上である場合に、受信した暗号化パケットEPを不正パケットと判断してもよい。これにより、ノードN1により過去に送信された暗号化パケットEP内の連結カウンタ値JCを書き換えて攻撃者が再送攻撃に使用した場合に、書き換えにより消去カウンタ値Rが大きく変化していれば、不正パケットと判断することができる。
(ノードNのハードウェア構成例)
図2は、実施の形態にかかるノードNのハードウェア構成例を示すブロック図である。図2において、ノードNは、CPU201と、RAM202と、フラッシュメモリ203と、I/F204と、暗号化回路205と、を備えている。CPU201〜暗号化回路205は、バス200によってそれぞれ接続されている。
ここで、CPU201は、ノードNの全体の制御を司る。RAM202は、CPU201のワークエリアとして使用される。RAM202は、揮発性の記憶装置である。RAM202には、書き換えが頻繁に行われる連結カウンタ値JCや暗号鍵(例えばアクセス鍵)の鍵情報が記憶される。フラッシュメモリ203は、不揮発性の記憶装置である。フラッシュメモリ203には、プログラムや暗号鍵(例えば固定鍵)の鍵情報が記憶される。I/F204は、ユニホップ通信またはマルチホップ通信によりパケットを送受信する。
暗号化回路205は、暗号鍵を用いてデータを暗号化する回路である。また、暗号化回路205は、暗号化されたデータを復号鍵を用いて復号する回路でもある。暗号化および復号をソフトウェア的に実行する場合は、暗号化回路205に相当するプログラムをフラッシュメモリ203に記憶させておくことで、暗号化回路205は不要となる。
(ノードDBの記憶内容)
図3は、ノードDB(DataBase)の記憶内容の一例を示す説明図である。図3に示すように、ノードDB300は、ノード項目のそれぞれに対応付けて、アクセス鍵項目と、受信カウンタ値項目と、を有する。ノードDB300は、ノードNが暗号化パケットEPを受信するごとにレコードを構成する。
ノード項目には、アドホックネットワーク内のノードNを示す識別子が記憶される。例えば、識別子としては、ノード番号が採用できる。また、識別子としては、ノードN固有のネットワークアドレスであるMAC(Media Access Control)アドレスやIP(Internet Protocol)アドレスを採用してもよい。図3の例では、ノードN1が有するノードDBを示している。ここで、ノード項目には、他ノードNのノード番号(N2〜)が記憶されている。
アクセス鍵項目には、ノード項目の識別子が示すノードNから受信したアクセス鍵AKが記憶される。アクセス鍵AKは、ノード項目の識別子が示すノードNへ送信するパケットの暗号化に使用される。アクセス鍵AKは、例えば、128〜256ビット程度のバイナリデータである。受信カウンタ値項目には、ノード項目の識別子が示すノードNから受信した暗号化パケットEPに含まれる連結カウンタ値JCが記憶される。
(ノードNの機能的構成例)
次に、図4および図5を用いて、ノードNの機能的構成例について説明する。ここで、図4は、ノードNの送信側としての機能的構成例を示している。また、図5は、ノードNの受信側としての機能的構成例を示している。ここでは、便宜的に受信側としての機能と送信側としての機能を分けて説明しているが、ノードNは受信側としての機能および送信側としての機能の両方を有する。
図4は、ノードNの送信側としての機能的構成例を示す機能ブロック図である。図4に示すように、ノードNは、第1の記憶部401と、更新部402と、送信部403と、暗号化部404と、乱数生成部405と、検出部406と、受信部407と、復号部408と、生成部409と、保存部410と、第2の記憶部411と、抽出部412と、を備える。更新部402〜保存部410および抽出部412は、具体的には、例えば、図2に示したフラッシュメモリ203などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F204により、その機能を実現する。
第1の記憶部401は、自ノードNでの消去回数を示す消去カウンタ値Rを上位桁とし自ノードNからの送信回数を示す送信カウンタ値Sを下位桁とする連結カウンタ値JCを記憶する。具体的には、例えば、頻繁に書き換えが行われる連結カウンタ値JCを記憶するため、データの読み書きを高速に行うことができる揮発性の記憶装置が採用される。第1の記憶部401は、例えば、上述したRAM202である。例えば、図1では、ノードN1の第1の記憶部401(RAM202)は、連結カウンタ値JC「0x00005678」を保持している。
更新部402は、アドホックネットワーク内の他ノードNにデータを送信する場合、第1の記憶部401に記憶されている連結カウンタ値JCのうち送信カウンタ値Sを1加算する。ここで、データとは、例えば、ノードNが家庭に備え付けられた消費電力計である場合は、当該家庭の消費電力量である。データの送信は、送信イベントの発生をトリガに実行される。送信イベントは、例えば、ノードNのユーザからの他ノードNを宛先にするデータの入力を受けることにより発生する。また、送信イベントは、ノードNが、一定時間ごとに自動的に発生させてもよい。
更新部402は、具体的には、例えば、アドホックネットワーク内の他ノードNを宛先にするデータの送信イベントが検出された場合、RAM202に保持されている連結カウンタ値JCに1を加算する。これにより、更新部402は、RAM202に保持されている連結カウンタ値JCのうち送信カウンタ値Sを、最新の送信カウンタ値Sに更新することができる。例えば、図1の(6)では、ノードN1の更新部402は、送信に先立って、連結カウンタ値JC「0x01000000」に1を加算し、連結カウンタ値JC「0x01000001」に更新している。
送信部403は、データおよび更新部402による更新後の連結カウンタ値JCを他ノードNに送信する。送信部403は、具体的には、例えば、他ノードNを宛先とするデータと更新部402による更新後の連結カウンタ値JCとを含むパケットを生成する。そして、送信部403は、生成したパケットを、データの宛先である他ノードNに送信する。ここで、パケットには、送信元である自ノードNを示す識別子が含まれてもよい。なお、ここでは、送信部403は、生成したパケットを、他ノードNにユニキャスト送信している。例えば、図1の(6)では、ノードN1の送信部403は、暗号化パケットEPを送信しているが、連結カウンタ値JC「0x01000001」を含む暗号化されないパケットをノードN3に送信してもよい。
なお、パケットの他ノードNへのユニキャスト送信は、送信部403がパケットを近隣ノードNに配信し、宛先の他ノードN以外の近隣ノードNが受信したパケットを廃棄し、宛先になる他ノードNが受信したパケットの内容に従って処理を実行することで実現される。ここで、処理としては、例えば、パケットのRAM202やフラッシュメモリ203への保存が挙げられる。これにより、送信部403は、正当性の判断に使用する連結カウンタ値JCを含むパケットを、他ノードNに送信することができる。例えば、図1の(6)で、ノードN1の送信部403は、近隣ノードとなるノードN2およびノードN3に、ノードN3を宛先にする暗号化パケットEPを送信する。そして、ノードN2は、自ノードNが宛先でないため、受信した暗号化パケットEPを廃棄する。また、ノードN3は、受信した暗号化パケットEPの内容に従って処理を行う。
また、送信部403は、暗号化部404と乱数生成部405とを有する。暗号化部404は、自ノードNおよび他ノードNが有する共通鍵を用いて、データおよび更新部402による更新後の連結カウンタ値JCを暗号化する。ここで、自ノードNおよび他ノードNが有する共通鍵とは、例えば、アドホックネットワーク内のノードNで共有される共通鍵(固定鍵)であってもよいし、ノードN間で一定時間ごとに更新される共通鍵(アクセス鍵AK)であってもよい。
ここで、一定時間ごとに更新されるアクセス鍵AKのほうが固定鍵よりセキュアであるため、アクセス鍵AKを有しているときは、アクセス鍵AKが暗号化部404による暗号化に用いられる。一方、アクセス鍵AKを有していないときは、固定鍵が暗号化部404による暗号化に用いられる。例えば、図1で、停電によりノードN1に電力供給されなくなったため、RAM202に保持されていたアクセス鍵AKが消去され、フラッシュメモリ203に保持されていた固定鍵が残っている状態であれば、固定鍵が暗号化部404による暗号化に用いられる。
暗号化部404は、具体的には、例えば、送信部403によって生成されたパケット内の他ノードNを宛先とするデータと更新部402による更新後の連結カウンタ値JCとを、固定鍵またはアクセス鍵AKを用いて暗号化する。例えば、図1の(6)または(8)では、ノードN1の暗号化部404は、連結カウンタ値JCを含むパケットを固定鍵を用いて暗号化している。ここで、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に、送信元である自ノードNを示す識別子が含まれてもよい。
この場合、送信部403は、暗号化部404による暗号化により得られた暗号化パケットEPを、データの宛先である他ノードNに送信する。これにより、送信部403は、正当性の判断に使用する連結カウンタ値JCを含むパケットを、他ノードNに送信することができる。また、送信部403は、暗号化により得られた暗号化パケットEPを送信するため、通信の安全性を担保することができる。例えば、図1の(6)では、ノードN1の送信部403は、連結カウンタ値JC「0x01000001」を含む暗号化パケットEPを、ノードN3に送信している。また、図1の(8)では、送信部403は、連結カウンタ値JC「0x01000002」を含む暗号化パケットEPを、ノードN2に送信している。
乱数生成部405は、第1の識別情報となる乱数を生成する。ここで、第1の識別情報とは、通信ごとに生成される一時的な乱数である。乱数生成部405は、具体的には、例えば、ハードウェア乱数生成器を用いて乱数を生成する。なお、生成された乱数は、例えば、RAM202などの記憶領域に記憶される。例えば、図1の(2)では、乱数が生成されていないが、ノードN1の乱数生成部405は乱数を生成してもよい。
検出部406は、第1の記憶部401での連結カウンタ値JCの消去を検出する。検出部406は、具体的には、例えば、停電によりノードNに電力が供給されずに第1の記憶部401に保持されている連結カウンタ値JCが消去された場合、停電が回復しノードNに電力供給された後に連結カウンタ値JCが消去されていることを検出する。検出部406は、より具体的には、例えば、連結カウンタ値JCの保持先に設定されている記憶領域の記憶内容が、電力供給されたときの初期化処理により「0x00000000」になっていることを検出する。
また、検出部406は、ノードNのユーザによる操作により、第1の記憶部401に保持されている連結カウンタ値JCが初期化されたことを検出してもよい。これにより、検出部406は、以後送信するパケットに含むべき連結カウンタ値JCが不明になったことを検出し、アドホックネットワークへの復帰処理を開始するトリガを発生させることができる。ノードN1の検出部406は、例えば、図1の(1)においては、連結カウンタ値JCが消去されたことを検出している。
検出部406によって連結カウンタ値JCの消去が検出された場合、暗号化パケットEPを他ノードNに正規パケットと判断させるための連結カウンタ値JCが不明であるため、連結カウンタ値JCを復旧する必要がある。復旧する方法としては、例えば、下記の3通りの方法がある。
第1の復旧方法は、他ノードNに消去カウンタ値Rの取得要求を送信することにより、連結カウンタ値JCを復旧する方法である。第2の復旧方法は、取得要求ではなく、消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rの取得を要求する更新要求を送信することにより、連結カウンタ値JCを復旧する方法である。第3の復旧方法は、消去カウンタ値Rを揮発性メモリではなく不揮発性の第2の記憶部411に保存しておくことにより、消去カウンタ値Rを読み出して連結カウンタ値JCを復旧する方法である。ここでは、第1の復旧方法について説明し、第2,第3の復旧方法については後述する。
第1の復旧方法では、送信部403は、検出部406によって消去が検出された場合、消去カウンタ値Rの取得要求をアドホックネットワークに配信する。ここで、取得要求とは、他ノードNに、自ノードNが過去に送信した送信カウンタ値Sを示す他ノードNが保持している受信カウンタ値RCから消去カウンタ値Rを抽出させて、抽出させた消去カウンタ値Rを自ノードNへ送信させるためのリクエストである。
そして、送信部403は、具体的には、例えば、取得要求を含むパケットを生成し、生成したパケットを、他ノードNに送信する。ここで、パケットには、送信元である自ノードNを示す識別子が含まれてもよい。例えば、図1の(2)では、ノードN1の送信部403は、取得要求を含む暗号化パケットEPをノードN2に送信しているが、取得要求を含む暗号化されないパケットを送信してもよい。これにより、送信部403は、消去カウンタ値Rを取得要求元のノードNへ送信するトリガを他ノードNに与えることができる。
ここで、通信の安全性を担保するために、送信部403によって送信されるパケットは、暗号化されていてもよい。また、通信の安全性を担保するために、送信部403によって送信されるパケットは、さらに一時的な識別情報が含まれた上で、暗号化されていてもよい。一時的な識別情報とは、例えば、上述した乱数生成部405によって生成された乱数である。まず、送信部403によって送信されるパケットが暗号化されている場合について説明する。
この場合、暗号化部404は、具体的には、例えば、送信部403によって生成されたパケット内の取得要求を、固定鍵またはアクセス鍵AKを用いて暗号化する。例えば、図1の(2)では、ノードN1の暗号化部404は、取得要求を含むパケットを固定鍵を用いて暗号化している。ここで、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に、送信元である自ノードNを示す識別子が含まれてもよい。
そして、送信部403は、暗号化部404によって暗号化された取得要求をアドホックネットワークに配信する。具体的には、例えば、送信部403は、暗号化部404による暗号化により得られた取得要求を含む暗号化パケットEPを、他ノードNに送信する。例えば、図1の(2)では、ノードN1の送信部403は、取得要求を含む暗号化パケットEPをノードN2に送信している。なお、送信部403は、暗号化パケットEPを、近隣ノードNにマルチキャスト送信してもよいし、他ノードNにユニキャスト送信してもよい。
これにより、送信部403は、消去カウンタ値Rを取得要求元のノードNへ送信するトリガを他ノードNに与えることができる。また、送信部403は、暗号化により得られた暗号化パケットEPを送信するため、通信の安全性を担保することができる。
次に、通信の安全性を担保するために、送信部403によって送信されるパケットが一時的な識別情報を含んだ上で、暗号化されている場合について説明する。この場合、送信部403は、取得要求と乱数生成部405によって生成された乱数とを含むパケットを生成する。例えば、図1の(2)では、取得要求を含むパケットが生成されているが、ノードN1の送信部403は、乱数と取得要求とを含むパケットを生成してもよい。
また、この場合、暗号化部404は、自ノードNおよび他ノードNが有する共通鍵を用いて、自ノードN固有の第1の識別情報を含む取得要求を暗号化する。暗号化部404は、具体的には、例えば、送信部403によって生成された取得要求と乱数とを含むパケットを、固定鍵またはアクセス鍵AKを用いて暗号化する。例えば、図1の(2)では、取得要求を含むパケットが暗号化されているが、ノードN1の暗号化部404は、取得要求と乱数とを含むパケットを固定鍵を用いて暗号化してもよい。
この場合、送信部403は、暗号化部404による暗号化により得られた暗号化パケットEPを他ノードに送信する。例えば、図1の(2)では、取得要求を含む暗号化パケットEPが送信されているが、ノードN1の送信部403は、乱数と取得要求を含む暗号化パケットEPを送信してもよい。
なお、取得要求により消去カウンタ値Rが取得されてから、連結カウンタ値JCが復旧するまでの処理については後述する。
受信部407は、他ノードNから送信されたデータを受信する。受信部407は、具体的には、例えば、送信部403によって送信された要求(例えば、取得要求)に対する他ノードNからの応答を受信する。受信部407は、より具体的には、例えば、送信部403によって取得要求が配信された結果、アドホックネットワークから消去カウンタ値Rを受信する。これにより、受信部407は、新たな連結カウンタ値JCの生成に使用される消去以前の消去カウンタ値Rを取得することができる。
また、受信部407は、復号部408を有する。復号部408は、共通鍵を用いて暗号化されたデータを、共通鍵を用いて復号する。また、復号部408は、アクセス鍵AKを用いて暗号化されたデータを、アクセス鍵AKを用いて復号する。
ここで、通信の安全性を担保するために、受信部407によって受信される消去カウンタ値Rを含むパケットは、暗号化されていてもよい。この場合、復号部408は、受信部407によって受信された消去カウンタ値Rを含む暗号化パケットEPを、共通鍵を用いて復号する。
この場合、受信部407は、復号部408による復号により得られたパケットから、消去カウンタ値Rを取得する。これにより、受信部407は、新たな連結カウンタ値JCの生成に使用される消去以前の消去カウンタ値Rを取得することができる。例えば、図1の(5)では、ノードN1の受信部407は、ノードN2から消去カウンタ値R「0x00」を含む暗号化パケットEPを受信している。なお、復号により得られたパケットは、例えば、RAM202などの記憶領域に記憶される。
また、受信部407は、送信部403によって第1の識別情報を含む暗号化パケットEPが送信された結果、共通鍵を用いて暗号化された消去カウンタ値Rと共通鍵を用いて暗号化された第2の識別情報とを、アドホックネットワークから受信する。ここで、第2の識別情報とは、送信部403によって送信された第1の識別情報を含む暗号化パケットEPを受信したノードNで生成されるデータであり、第1の識別情報がそのまま第2の識別情報として使用される。第2の識別情報とは、例えば、乱数である。
受信部407は、具体的には、例えば、送信部403によって取得要求が配信された結果、固定鍵を用いて暗号化された消去カウンタ値Rと乱数とを含む暗号化パケットEPを受信する。ここで、暗号化パケットEP内の暗号化されない部分(例えば、暗号化パケットEPのヘッダ部分)に、送信元である他ノードNを示す識別子が含まれてもよい。
例えば、図1の(5)では、消去カウンタ値R「0x00」を含む暗号化パケットEPが受信されているが、ノードN1の受信部407は、消去カウンタ値R「0x00」と乱数を含む暗号化パケットEPを受信してもよい。なお、受信された暗号化パケットEPは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、復号部408は、具体的には、例えば、受信部407によって受信された消去カウンタ値Rと第2の識別情報を含む暗号化パケットEPを、共通鍵を用いて復号する。そして、受信部407は、復号部408による復号により得られたパケットから、消去カウンタ値Rと第2の識別情報とを取得する。例えば、図1の(5)では、消去カウンタ値Rを含む暗号化パケットEPを復号したが、ノードN1の復号部408は、消去カウンタ値Rと乱数とを含む暗号化パケットEPを復号してもよい。そして、復号部408は、復号により得られたパケットから、消去カウンタ値Rと乱数とを取得してもよい。
これにより、受信部407は、新たな連結カウンタ値JCの生成に使用される消去以前の消去カウンタ値Rを取得することができる。また、受信部407は、第1の識別情報との一致判断により受信したパケットの正当性判断に使用される第2の識別情報を取得することができる。なお、復号により得られたパケットは、例えば、RAM202などの記憶領域に記憶される。
生成部409は、受信部407によって受信された消去カウンタ値Rに1加算した加算後の消去カウンタ値Rを上位桁とし、消去により送信回数が0になったことを示す消去後の送信カウンタ値Sを下位桁とする連結カウンタ値JCを生成する。生成部409は、具体的には、例えば、受信部407によって受信された消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とし、送信カウンタ値Sの初期値を下位桁とする連結カウンタ値JCを生成する。
例えば、図1の(5)では、ノードN1の生成部409は、受信した消去カウンタ値Rに1を加算した加算後の消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」を連結した連結カウンタ値JC「0x01000000」を生成している。これにより、生成部409は、消去以前の連結カウンタ値JCより大きい値であって、以後送信するパケットに含むべき連結カウンタ値JCを生成することができる。
また、この場合、生成部409は、第1の識別情報と復号部408によって復号された第2の識別情報との一致判断を行う。生成部409は、一致した場合に、復号部408によって復号された消去カウンタ値Rに1加算した加算後の消去カウンタ値Rを上位桁とし消去により送信回数が0になったことを示す消去後の送信カウンタ値Sを下位桁とする連結カウンタ値JCを生成する。
生成部409は、具体的には、例えば、RAM202に保持されている乱数と受信部407によって取得された乱数との一致判断を行う。そして、生成部409は、一致すると判断された場合、受信部407によって取得された消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とし、送信カウンタ値Sの初期値を下位桁とする連結カウンタ値JCを生成する。例えば、図1の(5)では、乱数を用いた暗号化パケットEPの正当性の判断は行わなかったが、ノードN1の生成部409は、送信した暗号化パケットEPに含めた乱数と受信した乱数との一致判断から、暗号化パケットEPが不正パケットか否かを判断してもよい。これにより、生成部409は、消去以前の連結カウンタ値JCより大きい値であって、以後送信するパケットに含むべき連結カウンタ値JCを生成することができる。
保存部410は、生成部409によって生成された連結カウンタ値JCを第1の記憶部401に保存する。保存部410は、具体的には、生成部409によって生成された連結カウンタ値JCを、消去された連結カウンタ値JCの代わりにRAM202に保存する。例えば、図1の(5)では、ノードN1の保存部410は、消去された連結カウンタ値の代わりに、生成した連結カウンタ値JC「0x01000000」を保存している。
第2の記憶部411は、消去カウンタ値Rを記憶する。第2の記憶部411としては、具体的には、例えば、不揮発性の記憶装置が採用される。第2の記憶部411とは、例えば、上述したフラッシュメモリ203である。例えば、図1では、連結カウンタ値JCのみが保持されているが、ノードN1の第2の記憶部411は、消去カウンタ値Rを連結カウンタ値JCとは別に保持していてもよい。これにより、第2の記憶部411は、自ノードNに電力が供給されない状態であっても、消去カウンタ値Rを記憶しておくことができる。
抽出部412は、検出部406によって消去が検出された場合、第2の記憶部411から消去カウンタ値Rを抽出する。抽出部412は、具体的には、例えば、検出部406によって消去が検出された場合、フラッシュメモリ203から消去カウンタ値Rを読み出す。例えば、図1では、他ノードNから消去カウンタ値Rを取得したが、ノードN1の抽出部412は、自ノードN内のフラッシュメモリ203から、消去カウンタ値Rを抽出してもよい。これにより、抽出部412は、消去以前の消去カウンタ値Rを抽出することができる。なお、抽出された消去カウンタ値Rは、例えば、RAM202などの記憶領域に記憶される。
次に、第2の復旧方法について説明する。第2の復旧方法は、取得要求ではなく、消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rの取得を要求する更新要求を送信することにより、連結カウンタ値JCを復旧する方法である。第2の復旧方法は、送信部403と、暗号化部404と、乱数生成部405と、受信部407と、復号部408と、生成部409と、保存部410と、によって実行される。
具体的には、送信部403は、検出部406によって消去が検出された場合、消去カウンタ値Rの更新要求をアドホックネットワークに配信する。ここで、更新要求とは、他ノードNに、自ノードNが過去に送信した送信カウンタ値Sを示す受信カウンタ値RCから、消去カウンタ値Rを抽出させる要求である。また、更新要求とは、他ノードNに、抽出させた消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを自ノードNへ送信させる要求である。
そして、送信部403は、具体的には、例えば、更新要求を含むパケットを生成する。そして、送信部403は、生成したパケットを、他ノードNに送信する。ここで、パケットには、送信元である自ノードNを示す識別子が含まれてもよい。例えば、図1の(2)では、取得要求を含むパケットが生成されたが、ノードN1の送信部403は、取得要求ではなく更新要求を含むパケットを生成してもよい。そして、図1の(2)では、暗号化パケットEPがノードN2に送信されたが、ノードN1の送信部403は、更新要求を含む暗号化されないパケットをノードN2に送信してもよい。これにより、送信部403は、消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを更新要求元のノードNへ送信するトリガを他ノードNに与えることができる。
ここで、通信の安全性を担保するために、送信部403によって送信されるパケットは、暗号化されていてもよい。また、送信部403によって送信されるパケットは、さらに一時的な識別情報が含まれた上で、暗号化されていてもよい。まず、送信部403によって送信されるパケットが暗号化されている場合について説明する。
この場合、暗号化部404は、自ノードNおよび他ノードNが有する共通鍵を用いて、更新要求を暗号化する。暗号化部404は、具体的には、例えば、送信部403によって生成された更新要求を含むパケットを、固定鍵またはアクセス鍵AKを用いて暗号化する。例えば、図1の(2)では、取得要求を含むパケットが暗号化されたが、ノードN1の暗号化部404は、更新要求と乱数を含むパケットを暗号化してもよい。
そして、送信部403は、暗号化部404によって暗号化された更新要求をアドホックネットワークに配信する。送信部403は、具体的には、例えば、暗号化部404による暗号化により得られた更新要求を含む暗号化パケットEPを、他ノードNに送信する。なお、送信部403は、暗号化パケットEPを、近隣ノードNにマルチキャスト送信してもよいし、他ノードNにユニキャスト送信してもよい。例えば、図1の(2)では、取得要求を含む暗号化パケットEPが送信されたが、ノードN1の送信部403は、更新要求を含む暗号化パケットEPをノードN2に送信してもよい。
これにより、送信部403は、消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを更新要求元のノードNへ送信するトリガを他ノードNに与えることができる。また、送信部403は、暗号化により得られた暗号化パケットEPを送信するため、通信の安全性を担保することができる。
また、この場合、受信部407は、送信部403によって更新要求が配信された結果、アドホックネットワークから消去カウンタ値Rに1加算された加算後の消去カウンタ値Rを受信する。受信部407は、具体的には、例えば、送信部403によって更新要求が配信された結果、加算後の消去カウンタ値Rを含む暗号化パケットEPを受信する。ここで、暗号化パケットEP内の暗号化されない部分(例えば、暗号化パケットEPのヘッダ部分)に、送信元である他ノードNを示す識別子が含まれてもよい。なお、受信された暗号化パケットEPは、例えば、RAM202などの記憶領域に記憶される。例えば、図1の(4)では、消去カウンタ値R「0x00」を含む暗号化パケットEPが受信されたが、ノードN1の受信部407は、加算後の消去カウンタ値R「0x01」を含む暗号化パケットEPを受信してもよい。
また、この場合、復号部408は、具体的には、例えば、受信部407によって受信された加算後の消去カウンタ値Rを含む暗号化パケットEPを、共通鍵を用いて復号する。そして、受信部407は、復号部408による復号により得られたパケットから、消去カウンタ値Rを取得する。これにより、受信部407は、新たな連結カウンタ値JCの生成に使用される消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを取得することができる。
なお、復号により得られたパケットは、例えば、RAM202などの記憶領域に記憶される。例えば、図1の(4)では、消去カウンタ値R「0x00」を含む暗号化パケットEPを復号したが、ノードN1の復号部408は、加算後の消去カウンタ値R「0x01」を含む暗号化パケットEPを復号してもよい。そして、ノードN1の受信部407は、復号したパケット内の加算後の消去カウンタ値Rを取得する。
また、この場合、生成部409は、受信部407によって受信された加算後の消去カウンタ値Rを上位桁とし、消去により送信回数が0になったことを示す消去後の送信カウンタ値Sを下位桁とする連結カウンタ値JCを生成する。
具体的には、例えば、生成部409は、受信部407によって取得された加算後の消去カウンタ値Rを上位桁とし、送信カウンタ値Sの初期値を下位桁とする連結カウンタ値JCを生成する。例えば、図1の(5)では、受信した消去カウンタ値R「0x00」に1を加算して得た加算後の消去カウンタ値R「0x01」を用いて連結カウンタ値を生成したが、ノードN1の生成部409は、受信した加算後の消去カウンタ値R「0x01」を用いて連結カウンタ値を生成してもよい。これにより、生成部409は、消去以前の連結カウンタ値JCより大きい値であって、以後送信するパケットに含むべき連結カウンタ値JCを生成することができる。なお、生成された連結カウンタ値JCは、例えば、RAM202などの記憶領域に記憶される。
この場合、保存部410は、生成部409によって生成された連結カウンタ値JCを第1の記憶部401に保存する。保存部410は、具体的には、生成部409によって生成された連結カウンタ値JCを、消去された連結カウンタ値JCの代わりにRAM202に保存する。
上述のように、送信部403によって送信されるパケットは、暗号化されていてもよいが、さらに一時的な識別情報を含んでもよい。次に、送信部403によって送信されるパケットが一時的な識別情報を含んだ上で、暗号化されている場合について説明する。
この場合、送信部403は、乱数生成部405によって生成された一時的な識別情報になる乱数と更新要求とを含むパケットを生成する。例えば、図1の(2)では、取得要求を含むパケットが生成されたが、ノードN1の送信部403は、乱数と更新要求とを含むパケットを生成してもよい。
そして、暗号化部404は、自ノードNおよび他ノードNが有する共通鍵を用いて、自ノードN固有の第1の識別情報を含む更新要求を暗号化する。暗号化部404は、具体的には、例えば、送信部403によって生成された更新要求と乱数とを含むパケットを、固定鍵またはアクセス鍵AKを用いて暗号化する。例えば、図1の(2)では、取得要求を含むパケットが暗号化されたが、ノードN1の暗号化部404は、乱数と更新要求を含むパケットを暗号化してもよい。
そして、送信部403は、暗号化部404による暗号化により得られた暗号化パケットEPを他ノードNに送信する。例えば、図1の(2)では、取得要求を含む暗号化パケットEPが送信されたが、ノードN1の送信部403は、乱数と更新要求を含む暗号化パケットEPを送信してもよい。
これにより、送信部403は、消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを更新要求元のノードNへ送信するトリガを他ノードNに与えることができる。また、送信部403は、暗号化により得られた暗号化パケットEPを送信するため、通信の安全性を担保することができる。また、送信部403は、送信するパケットに一時的な識別情報を含むことにより、通信の安全性を担保することができる。
また、この場合、受信部407は、共通鍵を用いて暗号化された加算後の消去カウンタ値Rと共通鍵を用いて暗号化された第2の識別情報とを、アドホックネットワークから受信する。具体的には、例えば、受信部407は、送信部403によって更新要求が配信された結果、固定鍵を用いて暗号化された加算後の消去カウンタ値Rと乱数とを含む暗号化パケットEPを受信する。ここで、暗号化パケットEP内の暗号化されない部分(例えば、暗号化パケットEPのヘッダ部分)に、送信元である他ノードNを示す識別子が含まれてもよい。例えば、図1の(5)では、消去カウンタ値R「0x00」を含む暗号化パケットEPが受信されたが、ノードN1の受信部407は、加算後の消去カウンタ値R「0x01」と乱数を含む暗号化パケットEPを受信してもよい。なお、受信された暗号化パケットEPは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、復号部408は、具体的には、例えば、受信部407によって受信された加算後の消去カウンタ値Rと第2の識別情報を含む暗号化パケットEPを、共通鍵を用いて復号する。そして、受信部407は、復号部408による復号により得られたパケットから、加算後の消去カウンタ値Rと第2の識別情報とを取得する。例えば、図1の(5)では、消去カウンタ値Rを含む暗号化パケットEPが復号されたが、ノードN1の復号部408は、加算後の消去カウンタ値Rと乱数とを含む暗号化パケットEPを復号してもよい。そして、復号部408は、復号により得られたパケットから、加算後の消去カウンタ値R「0x01」と乱数とを取得してもよい。
これにより、受信部407は、新たな連結カウンタ値JCの生成に使用される消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを取得することができる。また、受信部407は、第1の識別情報との一致判断により受信したパケットの正当性判断に使用される第2の識別情報を取得することができる。なお、復号により得られたパケットは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、生成部409は、第1の識別情報と復号部408によって復号された第2の識別情報との一致判断を行う。そして、生成部409は、一致した場合に、復号部408によって復号された加算後の消去カウンタ値Rを上位桁とし、消去により送信回数が0になったことを示す消去後の送信カウンタ値Sを下位桁とする連結カウンタ値JCを生成する。
また、この場合、生成部409は、具体的には、例えば、RAM202に保持されている乱数と受信部407によって取得された乱数との一致判断を行う。そして、生成部409は、一致すると判断された場合、受信部407によって受信された加算後の消去カウンタ値Rを上位桁とし、送信カウンタ値Sの初期値を下位桁とする連結カウンタ値JCを生成する。
例えば、図1の(5)では、乱数を用いた暗号化パケットEPの正当性の判断を行わなかったが、ノードN1の生成部409は、受信した暗号化パケットEPに含まれている乱数と保持しておいた乱数との一致判断を行ってもよい。そして、生成部409は、一致した場合、暗号化パケットEPが正規パケットと判断して、受信した消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」を連結した連結カウンタ値JC「0x01000000」を生成する。
これにより、生成部409は、消去以前の連結カウンタ値JCより大きい値であって、以後送信するパケットに含むべき連結カウンタ値JCを生成することができる。なお、生成された連結カウンタ値JCは、例えば、RAM202などの記憶領域に記憶される。
この場合、保存部410は、生成部409によって生成された連結カウンタ値JCを第1の記憶部401に保存する。保存部410は、具体的には、生成部409によって生成された連結カウンタ値JCを、消去された連結カウンタ値JCの代わりにRAM202に保存する。
次に、第3の復旧方法について説明する。第3の復旧方法は、消去カウンタ値Rを揮発性メモリではなく不揮発性の第2の記憶部411に保存しておくことにより、消去カウンタ値Rを読み出して連結カウンタ値JCを復旧する方法である。第3の復旧方法は、生成部409と、保存部410と、第2の記憶部411と、抽出部412と、により実行される。
抽出部412は、具体的には、例えば、検出部406によって消去が検出された場合、第2の記憶部411から消去カウンタ値Rを抽出する。抽出部412は、具体的には、例えば、検出部406によって消去が検出された場合、フラッシュメモリ203から消去カウンタ値Rを読み出す。例えば、図1では、他ノードNから消去カウンタ値Rを取得したが、ノードN1の抽出部412は、自ノードN内のフラッシュメモリ203から、消去カウンタ値Rを抽出してもよい。これにより、抽出部412は、消去以前の消去カウンタ値Rを抽出することができる。なお、抽出された消去カウンタ値Rは、例えば、RAM202などの記憶領域に記憶される。
この場合、生成部409は、抽出部412によって抽出された消去カウンタ値Rに1加算した加算後の消去カウンタ値Rを上位桁とし消去により送信回数が0になったことを示す消去後の送信カウンタ値Sを下位桁とする連結カウンタ値JCを生成する。
具体的には、例えば、生成部409は、抽出部412によって抽出された消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とし、送信カウンタ値Sの初期値を下位桁とする連結カウンタ値JCを生成する。例えば、ノードN1の生成部409は、図1の(5)で、他ノードNから受信した消去カウンタ値Rではなく、抽出した消去カウンタ値R「0x00」に1を加算する。そして、生成部409は、加算後の消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」を連結した連結カウンタ値JC「0x01000000」を生成する。
これにより、生成部409は、消去以前の連結カウンタ値JCより大きい値であって、以後送信するパケットに含むべき連結カウンタ値JCを生成することができる。なお、生成された連結カウンタ値JCは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、保存部410は、生成部409によって生成された連結カウンタ値JCを第1の記憶部401に保存するとともに、第2の記憶部411に記憶されている消去カウンタ値Rに対し加算後の消去カウンタ値Rを上書き保存する。例えば、図1の(5)で、ノードN1の保存部410は、消去された連結カウンタ値の代わりに、生成した連結カウンタ値JC「0x01000000」を保存してもよい。これにより、保存部410は、以後送信するパケットに含むべき連結カウンタ値JCを保存することができる。また、保存部410は、フラッシュメモリ203に保持されている消去カウンタ値Rを、最新の消去カウンタ値Rに更新することができる。
また、受信部407は、上述した暗号化部404による暗号化または復号部408による復号に使用されるアクセス鍵AKを、他ノードNから受信する。このとき、アクセス鍵AKは、他ノードNにより一定時間ごとに更新されてノードNに送信される。そして、更新後には、更新前のアクセス鍵AKを用いて暗号化された暗号化パケットEPは、不正パケットと判断されるようになる。そのため、攻撃者がアクセス鍵AKを解析しても、一定時間経過後には当該アクセス鍵AKを使用した通信が不可能になり、通信の安全性を担保することができる。
この場合、受信部407は、アドホックネットワーク内の近隣ノードNが有する第1の共通鍵を用いて暗号化された近隣ノードNが有する第2の共通鍵を、近隣ノードNから受信する。ここで、第1の共通鍵とは、上述した固定鍵である。第2の共通鍵とは、上述したアクセス鍵AKである。
具体的には、例えば、受信部407は、固定鍵を用いて暗号化されたアクセス鍵AKを含む暗号化パケットEPを受信する。例えば、図1で、ノードN1の受信部407は、ノードN2からアクセス鍵AK2を含む暗号化パケットEPを受信してもよい。これにより、受信部407は、近隣ノードNへパケットを送信する際に、パケットの暗号化に使用するアクセス鍵AKを含む暗号化パケットEPを受信することができる。なお、受信された暗号化パケットEPは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、復号部408は、受信部407によって受信された暗号化された第2の共通鍵を、第1の共通鍵を用いて復号する。復号部408は、具体的には、例えば、アクセス鍵AKを含む暗号化パケットEPを固定鍵を用いて復号する。そして、復号部408は、復号により得られたパケットからアクセス鍵AKを取得する。例えば、図1で、ノードN1の復号部408は、アクセス鍵AK2を含む暗号化パケットEPを復号してもよい。そして、ノードN1の復号部408は、アクセス鍵AK2を取得してもよい。
これにより、復号部408は、近隣ノードNへパケットを送信する際に、パケットの暗号化に使用するアクセス鍵AKを取得することができる。なお、復号により得られたパケットは、例えば、RAM202などの記憶領域に記憶される。なお、取得されたアクセス鍵AKは、送信元を示す識別子と関連付けてノードDB300に記憶される。
このとき、送信元を示す識別子と関連付けてノードDB300にアクセス鍵AKが保持されている場合、保持されているアクセス鍵AKが取得されたアクセス鍵AKで更新される。また、送信元を示す識別子と関連付けてノードDB300にアクセス鍵AKが保持されていない場合、送信元を示す識別子と取得されたアクセス鍵AKとを関連付けたレコードがノードDB300に追加される。
図5は、ノードNの受信側としての機能的構成例を示す機能ブロック図である。図5に示すように、ノードNは、第1の受信部501と、第1の保存部502と、第2の受信部503と、判断部504と、第2の保存部505と、データ処理部506と、第3の受信部507と、抽出部508と、送信部509と、を備える。第1の受信部501〜データ処理部506は、具体的には、例えば、図2に示したフラッシュメモリ203などの記憶装置に記憶されたプログラムをCPU201に実行させることにより、または、I/F204により、その機能を実現する。
第1の受信部501は、他ノードNでの消去回数を示す消去カウンタ値Rを上位桁とし他ノードNからの送信回数を示す送信カウンタ値Sを下位桁とする第1の連結カウンタ値JCを、他ノードNから受信する。具体的には、例えば、第1の受信部501は、連結カウンタ値JCを含むパケットを受信する。そして、第1の受信部501は、受信したパケットから連結カウンタ値JCを取得する。これにより、第1の受信部501は、以後に受信するパケットの正当性の判断に使用する受信カウンタ値RCになる連結カウンタ値JCを取得することができる。
また、第1の受信部501によって受信されるパケットは、暗号化により得られた暗号化パケットEPであってもよい。このとき、第1の受信部501は、暗号化パケットEPを固定鍵FKまたはアクセス鍵AKを用いて復号する。例えば、ノードN2の第1の受信部501は、図1でノードN2に保持されている受信カウンタ値RCになる連結カウンタ値JCを含む暗号化パケットEPを、過去に受信している。
第1の保存部502は、第1の受信部501によって受信された連結カウンタ値JCを記憶装置に保存する。ここで、記憶装置とは、例えば、上述したRAM202である。具体的には、例えば、第1の保存部502は、第1の受信部501によって取得された連結カウンタ値JCを、受信カウンタ値RCとしてRAM202に保存する。例えば、図1では、ノードN2の第1の保存部502は、過去にノードN1から受信した暗号化パケットEPを復号して抽出した連結カウンタ値JC「0x00001230」を、受信カウンタ値RCとして保持している。これにより、第1の保存部502は、以後に受信するパケットの正当性の判断に使用する連結カウンタ値JCを、以後にパケットが受信されるまで受信カウンタ値RCとしてRAM202に保持しておくことができる。
第2の受信部503は、第2の連結カウンタ値JCを他ノードNから受信する。具体的には、例えば、第2の受信部503は、第1の受信部501によってパケットが受信された後に、連結カウンタ値JCを含むパケットを受信する。そして、第2の受信部503は、受信したパケットから連結カウンタ値JCを取得する。なお、受信されたパケットは、例えば、RAM202などの記憶領域に記憶される。例えば、図1の(9)では、暗号化パケットEPを受信しているが、ノードN2の第2の受信部503は、連結カウンタ値JC「0x01000002」を含む暗号化されないパケットを受信してもよい。これにより、第2の受信部503は、受信したパケットの正当性の判断に使用される連結カウンタ値JCを取得することができる。
また、第2の受信部503によって受信されるパケットは、暗号化により得られた暗号化パケットEPであってもよい。このとき、第2の受信部503は、暗号化パケットEPを固定鍵FKまたはアクセス鍵AKを用いて復号する。例えば、図1の(9)では、ノードN2の第2の受信部503は、連結カウンタ値JC「0x01000002」を含む暗号化パケットEPを受信している。そして、第2の受信部503は、暗号化パケットEPを固定鍵を用いて復号している。
判断部504は、第2の受信部503によって受信された第2の連結カウンタ値JCが第1の連結カウンタ値JCよりも大きいか否かを判断する。ここで、第1の連結カウンタ値JCとは、上述した受信カウンタ値RCである。具体的には、例えば、判断部504は、第2の受信部503によって取得された連結カウンタ値JCが、RAM202に保持されている受信カウンタ値RCよりも大きいか否かを判断する。そして、判断部504は、判断結果から、第2の受信部503によって受信されたパケットが不正パケットであるか否かを判断する。なお、判断結果は、例えば、RAM202などの記憶領域に記憶される。
ここで、送信元のノードNでは、送信ごとに連結カウンタ値JCに1を加算し、連結カウンタ値JCの消去後には消去前の連結カウンタ値より大きい値になる新たな連結カウンタ値を生成している。そのため、ノードNが、ある送信元のノードNからの正規パケットを受信し続けている限り、今回受信したパケットに含まれる連結カウンタ値JCは、前回受信したパケットに含まれる連結カウンタ値JC(すなわち、受信カウンタ値RC)より大きくなる。一方で、ノードNが再送攻撃による不正パケットを受信した場合、再送攻撃では過去に送信されたパケットをそのまま送信しているため、ノードNが今回受信したパケットに含まれる連結カウンタ値JCは、受信カウンタ値RC以下となる。
そのため、判断部504は、第2の受信部503によって取得された連結カウンタ値JCが、RAM202に保持されている受信カウンタ値RCよりも大きい場合、第2の受信部503によって受信されたパケットを正規パケットと判断する。一方、判断部504は、第2の受信部503によって取得された連結カウンタ値JCが、RAM202に保持されている受信カウンタ値RC以下の場合、第2の受信部503によって受信されたパケットを不正パケットと判断する。例えば、図1の(9)では、ノードN2の判断部504は、受信カウンタ値RC「0x00005678」と、取得した連結カウンタ値JC「0x01000002」と、の大小比較を行っている。そして、ノードN2の判断部504は、連結カウンタ値JCが受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPは正規パケットであると判断している。これにより、判断部504は、第2の受信部503によって受信されたパケットが、不正パケットであるか否かを判断することができる。
第2の保存部505は、判断部504によって大きいと判断された場合、第1の連結カウンタ値JCに第2の連結カウンタ値JCを上書保存する。具体的には、第2の保存部505は、判断部504によって大きいと判断された場合、RAM202に保持されている受信カウンタ値RCに、第2の受信部503によって取得された連結カウンタ値JCを上書き保存する。例えば、図1の(9)では、ノードN2の第2の保存部505は、受信カウンタ値RC「0x00005678」を、取得した連結カウンタ値JC「0x01000002」で更新している。これにより、第2の保存部505は、受信カウンタ値RCを、最新の受信カウンタ値RCに更新することができる。
データ処理部506は、判断部504によって大きくないと判断された場合、第2の連結カウンタ値JCとともに受信されたデータを廃棄する。具体的には、例えば、データ処理部506は、判断部504によって大きくないと判断され、第2の受信部503によって受信されたパケットが不正パケットであると判断された場合、不正パケットの内容が処理要求であっても処理を実行しない。また、データ処理部506は、不正パケットの内容が転送要求であってもマルチホップ通信せずに廃棄する。
例えば、図1の(9)で、ノードN2のデータ処理部506は、不正パケットと判断された場合、受信した暗号化パケットEPを廃棄する。これにより、データ処理部506は、不正パケットが他ノードNへ転送されることを防止でき、また、不正パケットの内容を実行することによるノードNの処理負担を軽減できる。
また、データ処理部506は、判断部504によって大きいと判断された場合、第2の連結カウンタ値JCとともに受信されたデータを処理する。具体的には、例えば、データ処理部506は、判断部504によって大きいと判断され、第2の受信部503によって受信されたパケットが正規パケットであると判断された場合、正規パケットの内容が処理要求であれば、処理要求に従って処理を行う。また、データ処理部506は、正規パケットの内容が転送要求であれば、マルチホップ通信により他ノードNへ正規パケットを転送する。これにより、データ処理部506は、正規パケットにはパケットの内容に応じた処理を行うことができる。
第3の受信部507は、消去カウンタ値Rについての取得要求や更新要求を受信する。まず、第3の受信部507が取得要求を受信する場合について説明する。ここで、取得要求とは、他ノードNに、自ノードNが過去に送信した送信カウンタ値Sを示す他ノードNが保持している受信カウンタ値RCから消去カウンタ値Rを抽出させて、抽出させた消去カウンタ値Rを自ノードNへ送信させる要求である。
この場合、第3の受信部507は、他ノードNから消去カウンタ値Rの取得要求を受信する。具体的には、例えば、第3の受信部507は、他ノードNから、取得要求を含むパケットを受信する。例えば、図1の(2)では、暗号化パケットEPを受信しているが、ノードN2の第3の受信部507は、取得要求を含む暗号化されないパケットを受信してもよい。これにより、第3の受信部507は、RAM202に保持されている受信カウンタ値RCの中から、消去カウンタ値Rを抽出するトリガを発生させることができる。なお、受信されたパケットは、例えば、RAM202などの記憶領域に記憶される。
また、第3の受信部507によって受信されるパケットは、暗号化により得られた暗号化パケットEPであってもよい。このとき、第3の受信部507は、暗号化パケットEPを固定鍵FKまたはアクセス鍵AKを用いて復号する。例えば、図1の(9)では、ノードN2の第3の受信部507は、取得要求を含む暗号化パケットEPを受信している。そして、第3の受信部507は、暗号化パケットEPを固定鍵を用いて復号している。
また、この場合、抽出部508は、第3の受信部507によって取得要求が受信された場合、記憶装置に記憶されている連結カウンタ値JCの中の消去カウンタ値Rを抽出する。具体的には、例えば、抽出部508は、第3の受信部507によって取得要求が取得された場合、RAM202に保持されている受信カウンタ値RCの中から、消去カウンタ値Rを抽出する。例えば、図1の(4)では、ノードN2の抽出部508は、保持している受信カウンタ値RC「0x00001230」の中から、消去カウンタ値R「0x00」を抽出している。これにより、抽出部508は、他ノードNに送信する消去カウンタ値Rを抽出することができる。なお、抽出された消去カウンタ値Rは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、送信部509は、抽出部508によって抽出された消去カウンタ値Rを他ノードNに送信する。具体的には、送信部509は、抽出部508によって抽出された消去カウンタ値Rを含むパケットを生成する。そして、送信部509は、生成したパケットを他ノードNに送信する。
なお、ここでは、送信部509は、生成したパケットを、他ノードNにユニキャスト送信している。なお、パケットの他ノードNへのユニキャスト送信は、送信部509がパケットを近隣ノードに配信し、宛先の他ノードN以外の近隣ノードNが受信したパケットを廃棄し、宛先になる他ノードNが受信したパケットを処理することで実現される。例えば、図1の(4)では、ノードN2の送信部509は、消去カウンタ値R「0x00」を含む暗号化パケットEPを送信している。これにより、送信部509は、他ノードNでの連結カウンタ値JCの生成に使用される消去カウンタ値Rを送信することができる。
次に、第3の受信部507が更新要求を受信する場合について説明する。ここで、更新要求とは、他ノードNに、自ノードNが過去に送信した送信カウンタ値Sを示す受信カウンタ値RCから、消去カウンタ値Rを抽出させる要求である。また、更新要求とは、他ノードNに、抽出させた消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを自ノードNへ送信させる要求である。
この場合、第3の受信部507は、他ノードNから消去カウンタ値Rの更新要求を受信する。具体的には、例えば、第3の受信部507は、他ノードNから、更新要求を含むパケットを受信する。なお、受信されたパケットは、例えば、RAM202などの記憶領域に記憶される。例えば、図1の(2)では、取得要求を含む暗号化パケットEPを受信しているが、ノードN2の第3の受信部507は、取得要求を含む暗号化されないパケットを受信してもよい。これにより、第3の受信部507は、RAM202に保持されている受信カウンタ値RCの中から、消去カウンタ値Rを抽出するトリガを発生させることができる。
また、第3の受信部507によって受信されるパケットは、暗号化により得られた暗号化パケットEPであってもよい。このとき、第3の受信部507は、暗号化パケットEPを固定鍵FKまたはアクセス鍵AKを用いて復号する。例えば、図1の(2)では、ノードN2の第3の受信部507は、取得要求を含む暗号化パケットEPを受信している。そして、第3の受信部507は、暗号化パケットEPを固定鍵を用いて復号している。
また、この場合、抽出部508は、第3の受信部507によって更新要求が受信された場合、記憶装置に記憶されている連結カウンタ値JCの中の消去カウンタ値Rを抽出する。ここで、記憶装置とは、RAM202である。具体的には、例えば、抽出部508は、第3の受信部507によって更新要求が取得された場合、RAM202に保持されている受信カウンタ値RCの中から、消去カウンタ値Rを抽出する。例えば、図1の(4)では、ノードN2の抽出部508は、保持している受信カウンタ値RC「0x00001230」の中から、消去カウンタ値R「0x00」を抽出している。これにより、抽出部508は、他ノードNに送信する消去カウンタ値Rを抽出することができる。なお、抽出された消去カウンタ値Rは、例えば、RAM202などの記憶領域に記憶される。
また、この場合、送信部509は、抽出部508によって抽出された消去カウンタ値Rに1加算した加算後の消去カウンタ値Rを他ノードNに送信する。具体的には、送信部509は、抽出部508によって抽出された消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを含むパケットを生成する。そして、送信部509は、生成したパケットを他ノードNに送信する。なお、ここでは、送信部509は、生成したパケットを、他ノードNにユニキャスト送信している。
例えば、図1の(4)では、ノードN2の送信部509は、生成したパケットをノードN1に送信している。これにより、送信部509は、他ノードNでの連結カウンタ値JCの生成に使用される加算後の消去カウンタ値Rを送信することができる。また、送信部403によって送信されるパケットは、暗号化されてもよい。このとき、送信部403は、パケットを固定鍵FKまたはアクセス鍵AKを用いて暗号化する。
(アクセス鍵AKを用いた暗号化通信)
次に、図6および図7を用いて、アクセス鍵AKを用いた暗号化通信の一例について説明する。
図6は、アクセス鍵AKを用いた暗号化通信の一例を示す説明図である。なお、図1で説明した箇所と同様の箇所についての説明は省略する。図6の例では、ノードN1は、ノードN2へ送信するパケットの暗号化に使用されるアクセス鍵AK2と、ノードN3へ送信するパケットの暗号化に使用されるアクセス鍵AK3と、を保持している。
また、ノードN1は、連結カウンタ値JC「0x00001230」を保持している。ノードN2は、過去にノードN1から受信した暗号化パケットEPを復号して得られたパケットから抽出した連結カウンタ値JC「0x00001230」を、受信カウンタ値RCとして保持している。ノードN3は、過去にノードN1から受信した暗号化パケットEPを復号して得られたパケットから抽出した連結カウンタ値JC「0x00001229」を、受信カウンタ値RCとして保持している。
ここでは、ノードN1からノードN2およびノードN3に、アクセス鍵AKを用いて暗号化された暗号化パケットEPが送信される場合を例に挙げて、アクセス鍵AKを用いた暗号化通信について説明する。
(11)ノードN1は、ノードN2を宛先にするデータの送信イベントがあると、連結カウンタ値JC「0x00001230」に1を加算する。
(12)次に、ノードN1は、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x00001231」と、を含むパケットを生成し、生成したパケットをアクセス鍵AK2を用いて暗号化する。そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードN2に送信する。
(13)ノードN2は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPを、アクセス鍵AK2を用いて復号する。そして、ノードN2は、復号により得られたパケットに含まれる連結カウンタ値JC「0x00001231」と、前回受信した連結カウンタ値JCを示す受信カウンタ値RC「0x00001230」と、の大小比較を行う。
ここで、ノードN2は、復号により得られたパケットに含まれる連結カウンタ値JCが受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。そして、ノードN2は、受信カウンタ値RC「0x00001230」を、復号により得られたパケットに含まれる連結カウンタ値JC「0x00001231」で更新する。
(14)また、ノードN1は、ノードN3を宛先にするデータの送信イベントがあると、連結カウンタ値JC「0x00001231」に1を加算する。
(15)次に、ノードN1は、ノードN3を宛先にするデータと、加算後の連結カウンタ値JC「0x00001232」と、を含むパケットを生成し、生成したパケットをアクセス鍵AK3を用いて暗号化する。そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードN3に送信する。
(16)ノードN3は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPを、アクセス鍵AK3を用いて復号する。そして、ノードN3は、復号により得られたパケットに含まれる連結カウンタ値JC「0x00001232」と、前回受信した連結カウンタ値JCを示す受信カウンタ値RC「0x00001229」と、の大小比較を行う。ここで、ノードN3は、復号により得られたパケットに含まれる連結カウンタ値JCが受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。そして、ノードN3は、受信カウンタ値RC「0x00001299」を、復号により得られたパケットに含まれる連結カウンタ値JC「0x00001232」で更新する。
(アクセス鍵AKを用いた暗号化通信の詳細)
次に、図7を用いて、図6に示したアクセス鍵AKを用いた暗号化通信の詳細について説明する。
図7は、アクセス鍵AKを用いた暗号化通信の詳細を示す説明図である。図7では、図6に示したノードN1とノードN2との間の暗号化通信の詳細について説明する。
(21)ノードN1は、ノードN1のユーザからのノードN2を宛先にするデータの入力を受けると、ノードN2との暗号化通信を開始する。ここでは、ノードN1は、ユーザからのデータの入力をトリガにして暗号化通信を開始したが、ノードN1が自動的に発生させたデータ送信イベントをトリガにして暗号化通信を開始してもよい。(22)次に、ノードN1は、ノードN2を宛先にするデータの入力を受けると、連結カウンタ値JC「0x00001230」に1を加算する。
(23)そして、ノードN1は、送信元を示す識別子「N1」と、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x00001231」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。以下の説明においても、同様に、送信元を示す識別子はパケット内の暗号化されない部分に含まれる。また、パケット内の暗号化される部分に、さらに送信元を示す識別子を含んでもよい。
(24)次に、ノードN1は、生成したパケット内のノードN2を宛先にするデータと加算後の連結カウンタ値JC「0x00001231」とをアクセス鍵AK2を用いて暗号化する。
(25)そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードN2に送信する。
(26)ノードN2は、ノードN1から暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPをアクセス鍵AK2を用いて復号する。そして、ノードN2は、復号により得られたパケットから、ノードN2を宛先にするデータと連結カウンタ値JC「0x00001231」とを取得する。
(27)次に、ノードN2は、取得した「N1」が示す送信元のノードN1に関連付けられた受信カウンタ値RCを、ノードDB300から抽出する。(28)そして、ノードN2は、取得した連結カウンタ値JC「0x00001231」と、抽出した受信カウンタ値RC「0x00001230」との大小比較を行う。ここで、ノードN2は、取得した連結カウンタ値JCが、抽出した受信カウンタ値RCよりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。
(29)次に、ノードN2は、暗号化パケットEPが正規パケットであると判断されると、ノードDB300の受信カウンタ値RC「0x00001230」を連結カウンタ値JC「0x00001231」で更新する。そして、ノードN2は、暗号化パケットEPが正規パケットであると判断されると、正規パケットの内容が処理要求であれば、処理要求に従って処理を行う。また、データ処理部は、正規パケットの内容が転送要求であれば、マルチホップ通信により他ノードNへ正規パケットを転送する。これにより、ノードN2は、正規パケットには、パケットの内容に応じた処理を行うことができる。
一方、ノードN2は、取得した連結カウンタ値JCが、抽出した受信カウンタ値RC以下である場合は、受信した暗号化パケットEPが不正パケットであると判断する。そして、ノードN2は、不正パケットであると判断されると、復号により得られたパケットを廃棄する。
具体的には、ノードN2は、不正パケットの内容が処理要求であっても処理を実行せずに、復号により得られたパケットを廃棄する。また、ノードN2は、不正パケットの内容が転送要求であってもマルチホップ通信せずに、復号により得られたパケットを廃棄する。これにより、ノードN2は、不正パケットが他ノードNへ転送されることを防止でき、また、不正パケットの内容を実行することによるノードNの処理負担を軽減できる。そして、ノードN2は、通信の安全性を担保することができる。
(パケット送信処理の処理内容)
次に、図8を用いて、図6および図7に示した暗号化通信におけるパケット送信処理について説明する。パケット送信処理は、図6および図7に示したノードN1が実行する処理である。ここでは、例としてノードN1を実行主体として説明する。
図8は、暗号化通信におけるパケット送信処理の詳細な処理手順を示すフローチャートである。まず、ノードN1は、他ノードNを宛先にするデータの送信イベントが発生したか否かを判定する(ステップS801)。ここで、送信イベントが発生していない場合(ステップS801:No)、CPU201は、ステップS801に戻り、送信イベントの発生を待つ。
一方、送信イベントが発生した場合(ステップS801:Yes)、ノードN1は、連結カウンタ値JCに1を加算する(ステップS802)。次に、ノードN1は、送信元になる自ノードNを示す識別子と、他ノードNを宛先にするデータと、加算後の連結カウンタ値JCと、を含むパケットを生成する(ステップS803)。
そして、ノードN1は、データの宛先になるノードNの識別子に関連付けてノードDB300に保持されているアクセス鍵AKがあるか否かを判定する(ステップS804)。ここで、アクセス鍵AKがある場合(ステップS804:Yes)、ノードN1は、生成したパケットを、アクセス鍵AKを用いて暗号化する(ステップS805)。
一方、アクセス鍵AKがない場合(ステップS804:No)、ノードN1は、生成したパケットを、固定鍵を用いて暗号化する(ステップS806)。そして、ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先になるノードNに送信し(ステップS807)、パケット送信処理を終了する。これにより、ノードNは、送信するパケットを暗号化して、通信の安全性を担保することができる。
(パケット受信処理の処理内容)
次に、図9を用いて、図6および図7に示した暗号化通信におけるパケット受信処理について説明する。パケット受信処理は、図6および図7に示したノードN2またはノードN3が実行する処理である。ここでは、例としてノードN2を実行主体として説明する。
図9は、暗号化通信におけるパケット受信処理の詳細な処理手順を示すフローチャートである。まず、ノードN2は、暗号化パケットEPを受信したか否かを判定する(ステップS901)。ここで、暗号化パケットEPを受信していない場合(ステップS901:No)、ノードN2は、ステップS901に戻り、暗号化パケットEPの受信を待つ。
一方、暗号化パケットEPを受信した場合(ステップS901:Yes)、ノードN2は、暗号化パケットEP内の暗号化されない部分(例えば、パケットのヘッダ部分)から、送信元を示す識別子を取得する(ステップS902)。
次に、ノードN2は、自ノードNのアクセス鍵AKまたは固定鍵を用いて、受信した暗号化パケットEPを復号する(ステップS903)。次に、ノードN2は、正常に復号できたか否かを判定する(ステップS904)。ここで、正常に復号できない場合(ステップS904:No)、ノードN2は、受信した暗号化パケットEPが不正パケットであると判断して、暗号化パケットEPを廃棄し(ステップS907)、パケット受信処理を終了する。
一方、正常に復号できた場合(ステップS904:Yes)、ノードN2は、復号により得られたパケット内の連結カウンタ値JCが、送信元を示す識別子に関連付けてノードDB300に保持されている受信カウンタ値RCより大きいか否かを判定する(ステップS905)。
ここで、受信カウンタ値RC以下の場合(ステップS905:No)、ノードN2は、受信した暗号化パケットEPが不正パケットであるとして、暗号化パケットEPを廃棄し(ステップS907)、パケット受信処理を終了する。
一方、受信カウンタ値RCより大きい場合(ステップS905:Yes)、ノードN2は、受信した暗号化パケットEPが正規パケットであると判断する。そして、ノードN2は、送信元を示す識別子に関連付けてノードDB300に保持されている受信カウンタ値RCを、復号により得られたパケット内の連結カウンタ値JCに更新して(ステップS906)、パケット受信処理を終了する。これにより、ノードNは、受信した暗号化パケットEPが不正パケットであるか否かを判断して、暗号化パケットEPが不正パケットと判断された場合、暗号化パケットEPを廃棄し、通信の安全性を担保する。
(連結カウンタ値JCが消去された場合の処理)
次に、連結カウンタ値JCが消去された場合について説明する。例えば、連結カウンタ値JCが消去された場合とは、停電によりノードNに電力が供給されず、RAM202に保持されている連結カウンタ値JCが消去された場合である。また、連結カウンタ値JCが消去された場合とは、ノードNのユーザからの操作によってRAM202の記憶内容が初期化された場合であってもよい。
この場合、ノードNは、以後送信する暗号化パケットEPに含むべき連結カウンタ値JCが不明であるため、以後送信する暗号化パケットEPを他ノードNで正規パケットと判断させることができず、アドホックネットワークへ復帰することができない。以下では、新たな連結カウンタ値JCを生成してアドホックネットワークに復帰する際のノードNの動作例について説明する。
(ノードNの連結カウンタ値JCが消去された場合の動作例1)
まず、図10〜図13を用いて、ノードNの連結カウンタ値JCが消去された場合の動作例1について説明する。
図10〜図13は、ノードNの連結カウンタ値JCが消去された場合の動作例1を示す説明図である。なお、図1で説明した箇所と同様の箇所についての説明は省略する。図10の例では、ノードN1は、ノードN2から受信され、ノードN2へ送信するパケットの暗号化に使用されるアクセス鍵AK2「0x2222」を保持している。
また、ノードN1は、連結カウンタ値JC「0x00001230」を保持している。ノードN2は、過去にノードN1から受信した暗号化パケットEPを復号して得られたパケットから連結カウンタ値JCを抽出し、抽出した連結カウンタ値JC「0x00001230」を、受信カウンタ値RCとして保持している。
図10において、停電によりノードN1に電力が供給されず、ノードN1が保持していた連結カウンタ値JC「0x00001230」およびアクセス鍵AK2が消去されてしまったとする。そのため、他ノードNに送信するパケットに含むべき連結カウンタ値JCが不明になり、ノードN1は、他ノードNにパケットを送信することができない。
(31)ここで、ノードN1は、停電が回復し電力が供給されると、保持していた連結カウンタ値JCが消去されたことを検出する。
(32)ノードN1は、連結カウンタ値JCが消去されたことを検出すると、一時的な識別情報になる乱数を生成する。図10の例では、ノードN1は、乱数として「0x5819」を生成する。このとき、ノードN1は、生成した乱数「0x5819」をRAM202に保持しておく。
(33)ノードN1は、乱数を生成すると、送信元を示す識別子「N1」と、消去カウンタ値Rの取得要求を示す連結カウンタ値JCとして設定されている「0x00000000」と、生成した乱数「0x5819」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(34)ノードN1は、パケットを生成すると、生成したパケット内の連結カウンタ値JC「0x00000000」と乱数「0x5819」とを、固定鍵FKを用いて暗号化する。(35)そして、ノードN1は、暗号化により得られた暗号化パケットEPを、ノードN2を含む近隣ノードNに送信する。次に、図11に移る。
(36)ノードN2は、(35)でノードN1から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPを固定鍵FKを用いて復号する。そして、ノードN2は、復号により得られたパケットから、連結カウンタ値JC「0x00000000」と乱数「0x5819」とを取得する。
(37)ノードN2は、取得した連結カウンタ値JCが、消去カウンタ値Rの取得要求を示す連結カウンタ値JCとして設定されている「0x00000000」であることを検出する。そして、ノードN2は、取得した送信元を示す識別子「N1」に関連付けられた受信カウンタ値RCをノードDB300から抽出し、抽出した受信カウンタ値RCから消去カウンタ値R「0x00」を抽出する。
(38)ノードN2は、消去カウンタ値Rを抽出すると、送信元を示す識別子「N2」と、抽出した消去カウンタ値R「0x00」と、取得した乱数「0x5819」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(39)ノードN2は、生成したパケット内の消去カウンタ値R「0x00」と乱数「0x5819」とを固定鍵FKを用いて暗号化する。
(40)ノードN2は、暗号化により得られた暗号化パケットEPを、取得した識別子「N1」が示すノードN1に送信する。次に、図12に移る。
(41)ノードN1は、(40)でノードN2から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N2」を取得し、受信した暗号化パケットEPを、固定鍵FKを用いて復号する。そして、ノードN1は、復号により得られたパケットから、消去カウンタ値R「0x00」と乱数「0x5819」とを取得する。
(42)ノードN1は、乱数を取得すると、取得した乱数と(32)でRAM202に保持しておいた乱数との一致判断を行う。ここで、ノードN1は、取得した乱数「0x5819」とRAM202に保持しておいた乱数「0x5819」とが一致するため、(41)で受信した暗号化パケットEPは正規パケットであると判断する。
(43)ノードN1は、正規パケットであると判断されると、連結カウンタ値JCが消去される以前の消去カウンタ値Rを示す取得した消去カウンタ値R「0x00」に、1を加算する。そして、ノードN1は、加算後の消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」とを連結して、連結カウンタ値JC「0x01000000」を生成する。これにより、ノードN1は、消去された連結カウンタ値JCの代わりに、新たな連結カウンタ値JCを生成する。
一方、ノードN1は、取得した乱数と(32)でRAM202に保持しておいた乱数とが一致しない場合は、(41)で受信した暗号化パケットEPは不正パケットであると判断する。そして、ノードN1は、不正パケットであると判断されると、復号により得られたパケットを廃棄することで、通信の安全性を担保する。次に、図13に移る。
(44)ノードN1は、ノードN1のユーザからのノードN2を宛先にするデータの入力を受けると、ノードN2との暗号化通信を開始する。ここでは、ノードN1は、ユーザからのデータの入力をトリガにして暗号化通信を開始したが、ノードN1が自動的に発生させたデータ送信イベントをトリガにして暗号化通信を開始してもよい。
(45)ノードN1は、ノードN2を宛先にするデータの入力を受けると、(43)で生成された新たな連結カウンタ値JC「0x01000000」に1を加算する。
(46)ノードN1は、送信元を示す識別子「N1」と、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x01000001」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(47)ノードN1は、パケットを生成すると、生成したパケット内のノードN2を宛先にするデータと加算後の連結カウンタ値JC「0x01000001」とを固定鍵FKを用いて暗号化する。
(48)ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先であるノードN2に送信する。
(49)ノードN2は、ノードN1から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPを、固定鍵FKを用いて復号する。そして、ノードN2は、復号により得られたパケットから、ノードN2を宛先にするデータと連結カウンタ値JC「0x01000001」とを取得する。
(50)ノードN2は、連結カウンタ値JC「0x01000001」を取得すると、取得した送信元を示す識別子「N1」に関連付けられた受信カウンタ値RCをノードDB300から抽出する。
(51)そして、ノードN2は、取得した連結カウンタ値JC「0x01000001」と、抽出した受信カウンタ値RC「0x00001230」と、の大小比較を行う。ここで、ノードN2は、取得した連結カウンタ値JC「0x01000001」が、抽出した受信カウンタ値RC「0x00001230」よりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。
(52)ノードN2は、正規パケットであると判断されると、ノードDB300において識別子「N1」に関連付けられた受信カウンタ値RC「0x00001230」を、取得した連結カウンタ値JC「0x01000001」で更新する。
一方、ノードN2は、取得した連結カウンタ値JCが、抽出した受信カウンタ値RC以下である場合は、受信した暗号化パケットEPが不正パケットであると判断する。そして、ノードN2は、不正パケットであると判断されると、復号により得られたパケットを廃棄することで、通信の安全性を担保する。
このように、ノードN1は、消去カウンタ値Rを上位桁とし、送信カウンタ値Sを下位桁として連結した連結カウンタ値JCを保持し、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを他ノードNから取得する。そして、ノードN1は、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。
これにより、過去にノードN1により送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードN1により生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードN1は、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
これにより、ノードN2は、保持している受信カウンタ値RCより、ノードN1から受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードN1から受信した暗号化パケットEPを正規パケットと判断することができる。そして、ノードN1は、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。
また、ノードN1は、取得要求を含むパケットを、固定鍵FKを用いて暗号化するため、固定鍵FKを有さない攻撃者による要求パケットの解析を防止することができる。また、ノードN1は、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードN1は、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードN1は、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードN1は、一度使用した乱数に有効期間を設定しておくことで、今回の通信で近隣ノードNが応答した暗号化パケットEPを攻撃者が再送攻撃に利用した場合に、有効期間を過ぎていれば不正パケットと判断でき、通信の安全性を担保することができる。
(動作例1における連結カウンタ値生成処理の処理内容)
次に、図14を用いて、図10〜図13に示した動作例1における連結カウンタ値生成処理の詳細な処理手順について説明する。連結カウンタ値生成処理は、図10〜図13に示したノードN1が実行する処理である。ここでは、例としてノードN1を実行主体として説明する。
図14は、動作例1における連結カウンタ値生成処理の詳細な処理手順を示すフローチャートである。まず、ノードN1は、連結カウンタ値JCの消去が検出されたか否かを判定する(ステップS1401)。ここで、連結カウンタ値JCの消去が検出されていない場合(ステップS1401:No)、ノードN1は、ステップS1401に戻り、連結カウンタ値JCの消去が検出されるのを待つ。
一方、連結カウンタ値JCの消去が検出された場合(ステップS1401:Yes)、ノードN1は、一時的な識別情報になる乱数を生成する(ステップS1402)。次に、ノードN1は、送信元になる自ノードNを示す識別子と、生成した乱数と、送信カウンタ値Sの取得要求と、を含むパケットを生成する(ステップS1403)。
そして、ノードN1は、生成したパケットを固定鍵FKを用いて暗号化する(ステップS1404)。次に、CPU201は、暗号化により得られた暗号化パケットEPを近隣ノードNに送信する(ステップS1405)。
そして、ノードN1は、取得要求に対する応答になる暗号化パケットEPを近隣ノードNから受信したか否かを判定する(ステップS1406)。ここで、暗号化パケットEPを受信していない場合(ステップS1406:No)、ノードN1は、ステップS1406に戻り、暗号化パケットEPの受信を待つ。
一方、暗号化パケットEPを受信した場合(ステップS1406:Yes)、ノードN1は、受信した暗号化パケットEPを固定鍵FKを用いて復号する(ステップS1407)。そして、ノードN1は、復号により得られたパケットから乱数を抽出し、抽出した乱数が、ステップS1402で生成した乱数と一致するか否かを判定する(ステップS1408)。
ここで、一致する場合(ステップS1408:Yes)、ノードN1は、復号により得られたパケットから消去カウンタ値Rを抽出し、抽出した消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rと送信カウンタ値Sの初期値とを連結して連結カウンタ値JCを生成する(ステップS1409)。そして、ノードN1は、生成した連結カウンタ値JCをRAM202に保存して(ステップS1410)、連結カウンタ値生成処理を終了する。
一方、一致しない場合(ステップS1408:No)、ノードN1は、受信した暗号化パケットEPが不正パケットであると判断して、復号により得られたパケットを廃棄し(ステップS1411)、連結カウンタ値生成処理を終了する。
これにより、ノードNは、連結カウンタ値JCが消去された場合であっても、消去された連結カウンタ値JCより大きい値の新たな連結カウンタ値JCを生成することができる。そして、ノードNは、送信するパケットが他ノードNに廃棄されないようになり、アドホックネットワークに復帰できる。
また、ノードNは、取得要求を含むパケットを固定鍵FKを用いて暗号化するため、固定鍵FKを有さない攻撃者による要求パケットの解析を防止できる。また、ノードNは、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードNは、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードNは、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードNは、一度使用した乱数に有効期間を設定しておくことで、今回の通信で近隣ノードNが応答した暗号化パケットEPを攻撃者が再送攻撃に利用した場合に、有効期間を過ぎていれば不正パケットと判断でき、通信の安全性を担保することができる。
(ノードNの連結カウンタ値JCが消去された場合の動作例2)
次に、図15〜図18を用いて、ノードNの連結カウンタ値JCが消去された場合の動作例2について説明する。図10〜図13に示した動作例1では、消去カウンタ値Rの取得要求を含むパケットを、固定鍵FKを用いて暗号化したが、動作例2では、消去カウンタ値Rの取得要求を含むパケットをアクセス鍵AKを用いて暗号化する。これにより、暗号化により得られた消去カウンタ値Rの取得要求を含む暗号化パケットEPが、固定鍵を用いて暗号化する場合よりセキュアになり、通信の安全性を担保することができる。
図15〜図18は、ノードNの連結カウンタ値JCが消去された場合の動作例2を示す説明図である。なお、図1で説明した箇所と同様の箇所についての説明は省略する。図15の例では、また、ノードN1は、ノードN2から受信され、ノードN2へ送信するパケットの暗号化に使用されるアクセス鍵AK2「0x2222」を保持している。
また、ノードN1は、連結カウンタ値JC「0x00001230」を保持している。ノードN2は、過去にノードN1から受信した暗号化パケットEPを復号して得られたパケットから連結カウンタ値JCを抽出し、抽出した連結カウンタ値JC「0x00001230」を受信カウンタ値RCとして保持している。
図15において、停電によりノードN1に電力が供給されず、ノードN1が保持していた連結カウンタ値JC「0x00001230」およびアクセス鍵AK2が消去されてしまったとする。そのため、他ノードNに送信するパケットに含むべき連結カウンタ値JCが不明になり、ノードN1は、他ノードNにパケットを送信することができない。
(61)ここで、ノードN1は、停電が回復し電力が供給されると、保持していた連結カウンタ値JCが消去されたことを検出する。このとき、ノードN1は、近隣ノードNからアクセス鍵AKが送信されてくるまで待機する。
(62)一方、ノードN2は、一定時間ごとにノードN2自体が自動的に発生させるアクセス鍵AK生成イベントをトリガにして、新たなアクセス鍵AK2「0x6666」を生成する。
(63)ノードN2は、アクセス鍵AK2を生成すると、送信元を示す識別子「N2」と、ノードN2の連結カウンタ値JC「0x00002222」と、生成したアクセス鍵AK2「0x6666」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(64)ノードN2は、パケットを生成すると、生成したパケット内の連結カウンタ値JC「0x00002222」とアクセス鍵AK2「0x6666」とを、固定鍵FKを用いて暗号化する。
(65)そして、ノードN2は、暗号化により得られた暗号化パケットEPを、ノードN1を含む近隣ノードNに送信する。
(66)ノードN1は、ノードN2から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N2」を取得し、受信した暗号化パケットEPを固定鍵FKを用いて復号する。そして、ノードN1は、復号により得られたパケットから、連結カウンタ値JC「0x00002222」とアクセス鍵AK2「0x6666」とを取得する。
このとき、停電によりノードDB300の記憶内容が消去されており、ノードDB300にノードN2についてのレコードが存在しない。
(67)そのため、ノードN1は、取得した連結カウンタ値JC「0x00002222」とアクセス鍵AK2「0x6666」とを、取得した識別子「N2」に関連付けたレコードを、ノードDB300に追加しておく。
(68)ノードN1は、ノードDB300にレコードを追加すると、一時的な識別情報になる乱数を生成する。図15の例では、ノードN1は、乱数として「0x5819」を生成する。このとき、ノードN1は、生成した乱数「0x5819」をRAM202に保持しておく。
(69)ノードN1は、乱数を生成すると、送信元を示す識別子「N1」と、消去カウンタ値Rの取得要求を示す連結カウンタ値JCとして設定されている「0x00000000」と、生成した乱数「0x5819」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(70)ノードN1は、パケットを生成すると、生成したパケット内の連結カウンタ値JC「0x00000000」と乱数「0x5819」とを、アクセス鍵AK2を用いて暗号化する。
(71)そして、ノードN1は、暗号化により得られた暗号化パケットEPをノードN2に送信する。次に、図16に移る。
(72)ノードN2は、(71)でノードN1から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPをアクセス鍵AK2を用いて復号する。そして、ノードN2は、復号により得られたパケットから、連結カウンタ値JC「0x00000000」と乱数「0x5819」とを取得する。
(73)ノードN2は、取得した連結カウンタ値JCが、消去カウンタ値Rの取得要求を示す連結カウンタ値JCとして設定されている「0x00000000」であることを検出する。そして、ノードN2は、取得した送信元を示す識別子「N1」に関連付けられた受信カウンタ値RCをノードDB300から抽出し、抽出した受信カウンタ値RCから消去カウンタ値R「0x00」を抽出する。
(74)ノードN2は、消去カウンタ値Rを抽出すると、送信元を示す識別子「N2」と、抽出した消去カウンタ値R「0x00」と、取得した乱数「0x5819」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(75)ノードN2は、生成したパケット内の消去カウンタ値R「0x00」と乱数「0x5819」とを固定鍵FKを用いて暗号化する。
(76)ノードN2は、暗号化により得られた暗号化パケットEPを、取得した識別子「N1」が示すノードN1に送信する。次に、図17に移る。
(77)ノードN1は、(76)でノードN2から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N2」を取得し、受信した暗号化パケットEPを固定鍵FKを用いて復号する。そして、ノードN1は、復号により得られたパケットから、消去カウンタ値R「0x00」と乱数「0x5819」とを取得する。
(78)ノードN1は、乱数を取得すると、取得した乱数と(68)でRAM202に保持しておいた乱数との一致判断を行う。ここで、ノードN1は、取得した乱数「0x5819」とRAM202に保持しておいた乱数「0x5819」とが一致するため、(77)で受信した暗号化パケットEPは正規パケットであると判断する。
(79)ノードN1は、正規パケットであると判断されると、連結カウンタ値JCが消去される以前の消去カウンタ値Rを示す取得した消去カウンタ値R「0x00」に、1を加算する。そして、ノードN1は、加算後の消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」とを連結して、連結カウンタ値JC「0x01000000」を生成する。これにより、ノードN1は、消去された連結カウンタ値JCの代わりに、新たな連結カウンタ値JCを生成する。
一方、ノードN1は、取得した乱数と(68)でRAM202に保持しておいた乱数とが一致しない場合は、(77)で受信した暗号化パケットEPは不正パケットであると判断する。そして、ノードN1は、不正パケットであると判断されると、復号により得られたパケットを廃棄することで、通信の安全性を担保する。次に、図18に移る。
(80)ノードN1は、ノードN1のユーザからのノードN2を宛先にするデータの入力を受けると、ノードN2との暗号化通信を開始する。ここでは、ノードN1は、ユーザからのデータの入力をトリガにして暗号化通信を開始したが、ノードN1が自動的に発生させたデータ送信イベントをトリガにして暗号化通信を開始してもよい。
(81)ノードN1は、ノードN2を宛先にするデータの入力を受けると、(79)で生成された新たな連結カウンタ値JC「0x01000000」に1を加算する。
(82)ノードN1は、送信元を示す識別子「N1」と、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x01000001」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(83)ノードN1は、パケットを生成すると、データの宛先であるノードN2を示す識別子「N2」に関連付けられたアクセス鍵AK2「0x6666」を、ノードDB300から取得する。そして、ノードN1は、生成したパケット内のノードN2を宛先にするデータと加算後の連結カウンタ値JC「0x01000001」とを、アクセス鍵AK2を用いて暗号化する。
(84)ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先であるノードN2に送信する。
(85)ノードN2は、ノードN1から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPをアクセス鍵AK2を用いて復号する。そして、ノードN2は、復号により得られたパケットから、ノードN2を宛先にするデータと連結カウンタ値JC「0x01000001」とを取得する。
(86)ノードN2は、連結カウンタ値JC「0x01000001」を取得すると、取得した送信元を示す識別子「N1」に関連付けられた受信カウンタ値RCをノードDB300から抽出する。
(87)そして、ノードN2は、取得した連結カウンタ値JC「0x01000001」と、抽出した受信カウンタ値RC「0x00001230」と、の大小比較を行う。ここで、ノードN2は、取得した連結カウンタ値JC「0x01000001」が、抽出した受信カウンタ値RC「0x00001230」よりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。
(88)ノードN2は、正規パケットであると判断されると、ノードDB300において識別子「N1」に関連付けられた受信カウンタ値RC「0x00001230」を、取得した連結カウンタ値JC「0x01000001」で更新する。
一方、ノードN2は、取得した連結カウンタ値JCが、抽出した受信カウンタ値RC以下である場合は、受信した暗号化パケットEPが不正パケットであると判断する。そして、ノードN2は、不正パケットであると判断されると、復号により得られたパケットを廃棄することで、通信の安全性を担保する。
このように、ノードN1は、消去カウンタ値Rを上位桁とし、送信カウンタ値Sを下位桁として連結した連結カウンタ値JCを保持し、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを他ノードNから取得する。そして、ノードN1は、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。
これにより、過去にノードN1により送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードN1により生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードN1は、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
そして、ノードN2は、前回受信した暗号化パケットEPに含まれていた連結カウンタ値JCを示す受信カウンタ値RCより、今回受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、正規パケットと判断することができる。なお、前回受信した暗号化パケットEPに含まれていた連結カウンタ値JCは、受信カウンタ値RCとして保持されている。そして、ノードN1は、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。
また、ノードN1は、取得要求を含むパケットをアクセス鍵AKを用いて暗号化するため、アクセス鍵AKを有さない攻撃者による要求パケットの解析を防止することができる。また、ノードN1は、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードN1は、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードN1は、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードN1は、一度使用した乱数に有効期間を設定しておくことで、今回の通信で近隣ノードNが応答した暗号化パケットEPを攻撃者が再送攻撃に利用した場合に、有効期間を過ぎていれば不正パケットと判断でき、通信の安全性を担保することができる。
(動作例2における連結カウンタ値生成処理の処理内容)
次に、図19および図20を用いて、図15〜図18に示した動作例2における連結カウンタ値生成処理の詳細な処理手順について説明する。連結カウンタ値生成処理は、図15〜図18に示したノードN1が実行する処理である。ここでは、例としてノードN1を実行主体として説明する。
図19および図20は、動作例2における連結カウンタ値生成処理の詳細な処理手順を示すフローチャートである。まず、ノードN1は、連結カウンタ値JCの消去が検出されたか否かを判定する(ステップS1901)。ここで、連結カウンタ値JCの消去が検出されていない場合(ステップS1901:No)、ノードN1は、ステップS1901に戻り、連結カウンタ値JCの消去が検出されるのを待つ。
一方、連結カウンタ値JCの消去が検出された場合(ステップS1901:Yes)、ノードN1は、アクセス鍵AKを含む暗号化パケットEPを近隣ノードNから受信したか否かを判定する(ステップS1902)。ここで、アクセス鍵AKを含む暗号化パケットEPを受信していない場合(ステップS1902:No)、ノードN1は、ステップS1902に戻り、アクセス鍵AKを含む暗号化パケットEPの受信を待つ。
一方、アクセス鍵AKを含む暗号化パケットEPを受信した場合(ステップS1902:Yes)、ノードN1は、暗号化パケットEP内の暗号化されない部分(例えば、パケットのヘッダ部分)から、送信元を示す識別子を取得する(ステップS1903)。
そして、ノードN1は、受信した暗号化パケットEPを固定鍵FKを用いて復号する(ステップS1904)。次に、ノードN1は、復号により得られたパケットからアクセス鍵AKを抽出し、抽出したアクセス鍵AKと取得した送信元を示す識別子と関連付けたレコードを、ノードDB300に追加する(ステップS1905)。
そして、ノードN1は、一時的な識別情報になる乱数を生成する(ステップS1906)。次に、ノードN1は、送信元になる自ノードNを示す識別子と、生成した乱数と、送信カウンタ値Sの取得要求と、を含むパケットを生成する(ステップS1907)。
そして、ノードN1は、生成したパケットを、ステップS1905で抽出されたアクセス鍵AKを用いて暗号化する(ステップS1908)。次に、CPU201は、暗号化により得られた暗号化パケットEPを、ステップS1903で取得された識別子が示すノードNに送信する(ステップS1909)。そして、ノードN1は、図20のステップS2001に移行する。
図20において、ノードN1は、取得要求に対する応答になる暗号化パケットEPを、ステップS1903で取得された識別子が示すノードNから受信したか否かを判定する(ステップS2001)。ここで、暗号化パケットEPを受信していない場合(ステップS2001:No)、ノードN1は、ステップS2001に戻り、暗号化パケットEPの受信を待つ。
一方、暗号化パケットEPを受信した場合(ステップS2001:Yes)、ノードN1は、暗号化パケットEP内の暗号化されない部分(例えば、パケットのヘッダ部分)から、送信元を示す識別子を取得する(ステップS2002)。
次に、ノードN1は、受信した暗号化パケットEPを固定鍵FKを用いて復号する(ステップS2003)。そしてノードN1は、復号により得られたパケットから乱数を抽出し、抽出した乱数が、ステップS1906で生成した乱数と一致するか否かを判定する(ステップS2004)。
ここで、一致する場合(ステップS2004:Yes)、ノードN1は、復号により得られたパケットから消去カウンタ値Rを抽出し、抽出した消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rと送信カウンタ値Sの初期値とを連結して連結カウンタ値JCを生成する(ステップS2005)。そして、ノードN1は、生成した連結カウンタ値JCをRAM202に保存して(ステップS2006)、連結カウンタ値生成処理を終了する。
一方、一致しない場合(ステップS2004:No)、ノードN1は、受信した暗号化パケットEPが不正パケットであると判断して、復号により得られたパケットを廃棄し(ステップS2007)、連結カウンタ値生成処理を終了する。
これにより、ノードNは、連結カウンタ値JCが消去された場合であっても、消去された連結カウンタ値JCより大きい値の新たな連結カウンタ値JCを生成することができる。そして、ノードNは、送信するパケットが他ノードNに廃棄されないようになり、アドホックネットワークに復帰できる。
また、ノードNは、取得要求を含むパケットをアクセス鍵AKを用いて暗号化するため、アクセス鍵AKを有さない攻撃者による要求パケットの解析を防止することができる。また、ノードNは、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードNは、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードNは、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードNは、一度使用した乱数に有効期間を設定しておくことで、今回の通信で近隣ノードNが応答した暗号化パケットEPを攻撃者が再送攻撃に利用した場合に、有効期間を過ぎていれば不正パケットと判断でき、通信の安全性を担保することができる。
(ノードNの連結カウンタ値JCが消去された場合の動作例3)
次に、図21および図22を用いて、ノードNの連結カウンタ値JCが消去された場合の動作例3について説明する。動作例1および動作例2は自ノードNに電力供給されなくなると連結カウンタ値JCとともに消去カウンタ値Rも消去されたが、動作例3は自ノードNに電力供給されない状態でも消去されないように不揮発性メモリに消去カウンタ値Rを保持しておく。これにより、他ノードNから消去カウンタ値Rを取得しないため、再送攻撃の危険性を低減し、通信の安全性を担保することができる。
図21および図22は、ノードNの連結カウンタ値JCが消去された場合の動作例3を示す説明図である。なお、図1で説明した箇所と同様の箇所についての説明は省略する。図21において、ノードN1は、ノードN2から受信され、ノードN2へ送信するパケットの暗号化に使用されるアクセス鍵AK2「0x2222」を保持している。
また、ノードN1は、連結カウンタ値JC「0x00001230」を保持している。ここで、連結カウンタ値JCは、頻繁に書き換えが行われるため、揮発性であるRAM202に保持されている。ノードN1は、連結カウンタ値JCとは別に、消去カウンタ値R「0x00」を保持している。ここで、消去カウンタ値Rは、不揮発性であるフラッシュメモリ203に保持されている。
ノードN2は、過去にノードN1から受信した暗号化パケットEPを復号して得られたパケットから連結カウンタ値JCを抽出し、抽出した連結カウンタ値JC「0x00001230」を受信カウンタ値RCとして保持している。
図21において、停電によりノードN1に電力が供給されず、ノードN1が保持していた連結カウンタ値JC「0x00001230」およびアクセス鍵AK2が消去されてしまったとする。そのため、他ノードNに送信するパケットに含むべき連結カウンタ値JCが不明になり、ノードN1は、他ノードNにパケットを送信することができない。
(91)ここで、ノードN1は、停電が回復し電力が供給されると、保持していた連結カウンタ値JCが消去されたことを検出する。
(92)ノードN1は、連結カウンタ値JCが消去されたことを検出すると、フラッシュメモリ203に保持されている消去カウンタ値R「0x00」に1を加算する。
(93)そして、ノードN1は、フラッシュメモリ203に保持されている加算後の消去カウンタ値R「0x01」と送信カウンタ値Sの初期値「0x000000」とを連結して、連結カウンタ値JC「0x01000000」を生成する。これにより、ノードN1は、消去された連結カウンタ値JCの代わりに、新たな連結カウンタ値JCを生成する。次に、図22に移る。
(94)ノードN1は、ノードN1のユーザからのノードN2を宛先にするデータの入力を受けると、ノードN2との暗号化通信を開始する。ここでは、ノードN1は、ユーザからのデータの入力をトリガにして暗号化通信を開始したが、ノードN1が自動的に発生させたデータ送信イベントをトリガにして暗号化通信を開始してもよい。
(95)ノードN1は、ノードN2を宛先にするデータの入力を受けると、(93)で生成された新たな連結カウンタ値JC「0x01000000」に1を加算する。
(96)ノードN1は、送信元を示す識別子「N1」と、ノードN2を宛先にするデータと、加算後の連結カウンタ値JC「0x01000001」と、を含むパケットを生成する。このとき、送信元を示す識別子は、パケット内の暗号化されない部分(例えば、パケットのヘッダ部分)に含まれる。
(97)ノードN1は、パケットを生成すると、生成したパケット内のノードN2を宛先にするデータと加算後の連結カウンタ値JC「0x01000001」とを固定鍵FKを用いて暗号化する。
(98)ノードN1は、暗号化により得られた暗号化パケットEPを、データの宛先であるノードN2に送信する。
(99)ノードN2は、ノードN1から送信された暗号化パケットEPを受信すると、受信した暗号化パケットEPから送信元を示す識別子「N1」を取得し、受信した暗号化パケットEPを、固定鍵FKを用いて復号する。そして、ノードN2は、復号により得られたパケットから、ノードN2を宛先にするデータと連結カウンタ値JC「0x01000001」とを取得する。
(100)ノードN2は、連結カウンタ値JC「0x01000001」を取得すると、取得した送信元を示す識別子「N1」に関連付けられた受信カウンタ値RCをノードDB300から抽出する。
(101)そして、ノードN2は、取得した連結カウンタ値JC「0x01000001」と、抽出した受信カウンタ値RC「0x00001230」と、の大小比較を行う。ここで、ノードN2は、取得した連結カウンタ値JC「0x01000001」が、抽出した受信カウンタ値RC「0x00001230」よりも大きいため、受信した暗号化パケットEPが正規パケットであると判断する。
(102)ノードN2は、正規パケットであると判断されると、ノードDB300において識別子「N1」に関連付けられた受信カウンタ値RC「0x00001230」を、取得した連結カウンタ値JC「0x01000001」で更新する。
一方、ノードN2は、取得した連結カウンタ値JCが、抽出した受信カウンタ値RC以下である場合は、受信した暗号化パケットEPが不正パケットであると判断する。そして、ノードN2は、不正パケットであると判断されると、復号により得られたパケットを廃棄することで、通信の安全性を担保する。
このように、ノードN1は、揮発性メモリ(例えばRAM202)に連結カウンタ値JCを保持しておくことで、送信時の連結カウンタ値JCの読み出し処理や、受信時の連結カウンタ値JCの更新処理を高速に実行できる。
また、ノードN1は、不揮発性メモリ(例えばフラッシュメモリ203)に、書き換え頻度の低い消去カウンタ値Rのみを、連結カウンタ値JCとは別に保持しておく。ノードN1は、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを不揮発性メモリから取得する。そして、ノードN1は、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。これにより、過去にノードN1により送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードN1により生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードN1は、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
これにより、ノードN2は、保持している受信カウンタ値RCより、ノードN1から受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードN1から受信した暗号化パケットEPを正規パケットと判断することができる。そして、ノードN1は、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。また、他ノードNから消去カウンタ値Rを取得しないため、再送攻撃の危険性を低減し、通信の安全性を担保することができる。
(動作例3における連結カウンタ値生成処理の処理内容)
次に、図23を用いて、図21および図22に示した動作例3における連結カウンタ値生成処理の詳細な処理手順を示すフローチャートである。連結カウンタ値生成処理は、図21および図22に示したノードN1が実行する処理である。ここでは、例としてノードN1を実行主体として説明する。
図23は、動作例3における連結カウンタ値生成処理の詳細な処理手順を示すフローチャートである。まず、ノードN1は、連結カウンタ値JCの消去が検出されたか否かを判定する(ステップS2301)。連結カウンタ値JCの消去が検出されていない場合(ステップS2301:No)、ノードN1は、ステップS2301に戻り、連結カウンタ値JCの消去が検出されるのを待つ。
一方、連結カウンタ値JCの消去が検出された場合(ステップS2301:Yes)、ノードN1は、不揮発性メモリから消去カウンタ値Rを読み出す(ステップS2302)。そして、ノードN1は、読み出した消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rと送信カウンタ値Sの初期値とを連結した連結カウンタ値JCを生成する(ステップS2303)。
そして、ノードN1は、生成した連結カウンタ値JCをRAM202に保存して(ステップS2304)、連結カウンタ値生成処理を終了する。これにより、ノードNは、連結カウンタ値JCが消去された場合であっても、消去された連結カウンタ値JCより大きい値の新たな連結カウンタ値JCを生成することができる。そして、ノードNは、送信するパケットが他ノードNに廃棄されないようになり、アドホックネットワークに復帰できる。
以上説明したように、ノードNは、連結カウンタ値JCを保持し、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを他ノードNから取得する。そして、ノードNは、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。これにより、過去にノードNにより送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、新たな連結カウンタ値JCが大きい値になる。そのため、ノードNは、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
これにより、他ノードNは、保持している受信カウンタ値RCより、ノードNから受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードNから受信した暗号化パケットEPを正規パケットと判断することができる。そして、ノードNは、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。このように、連結カウンタ値JCが復旧されるため、時刻同期パケットによる同期が不要になり、アドホックネットワーク内の通信負荷の低減を図ることができる。
また、ノードNは、取得要求を含むパケットを固定鍵FKを用いて暗号化するため、固定鍵FKを有さない攻撃者による要求パケットの解析を防止することができる。また、ノードNは、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードNは、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードNは、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードNは、連結カウンタ値JCを保持し、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを他ノードNから取得する。そして、ノードNは、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。これにより、過去にノードNにより送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードNにより生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードNは、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
これにより、他ノードNは、保持している受信カウンタ値RCより、ノードNから受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードNから受信した暗号化パケットEPを正規パケットと判断することができる。そして、ノードNは、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。
また、ノードNは、取得要求を含むパケットをアクセス鍵AKを用いて暗号化するため、アクセス鍵AKを有さない攻撃者による要求パケットの解析を防止できる。また、ノードNは、取得要求を含むパケットに、近隣ノードNとの通信ごとに生成した一時的な識別情報になる乱数を含める。これにより、ノードNは、自ノードNが送信した暗号化パケットEPに含めた乱数と受信した暗号化パケットEPに含まれる乱数との一致判断により、正規パケットか否かを通信ごとに判断することができる。
ここで、通信ごとに異なる乱数が生成されるため、前回の取得要求に対する応答として近隣ノードNが送信した暗号化パケットEPを今回の取得要求に対する応答と偽って攻撃者が再送攻撃に使用しても、それぞれの暗号化パケットEPに含まれる乱数は不一致になる。そのため、ノードNは、乱数の不一致から、今回の取得要求に対する応答として受信された暗号化パケットEPが再送攻撃による不正パケットと判断でき、通信の安全性を担保することができる。
また、ノードNは、揮発性メモリ(例えばRAM202)に連結カウンタ値JCを保持しておくことで、送信時の連結カウンタ値JCの読み出し処理や、受信時の連結カウンタ値JCの更新処理を高速に実行できる。また、ノードNは、不揮発性メモリ(例えばフラッシュメモリ203)に、書き換え頻度の低い消去カウンタ値Rのみを、連結カウンタ値JCとは別に保持しておく。
ノードNは、連結カウンタ値JCが消去されると、消去以前の消去カウンタ値Rを不揮発性メモリから取得する。そして、ノードNは、消去以前の消去カウンタ値Rに1を加算した加算後の消去カウンタ値Rを上位桁とする新たな連結カウンタ値JCを生成する。これにより、過去にノードNにより送信された暗号化パケットEPに含まれていた連結カウンタ値JCより、ノードNにより生成された新たな連結カウンタ値JCが大きい値になる。そのため、ノードNは、他ノードNが保持している受信カウンタ値RCより大きい値になっている連結カウンタ値JCを、他ノードNに送信する暗号化パケットEPに含むことができる。
これにより、他ノードNは、保持している受信カウンタ値RCより、ノードNから受信した暗号化パケットEPに含まれる連結カウンタ値JCが大きいため、ノードNから受信した暗号化パケットEPを正規パケットと判断することができる。そして、ノードNは、他ノードNに送信する暗号化パケットEPが、他ノードNで不正パケットと判断されないようになるため、アドホックネットワークに復帰することができる。また、他ノードNから消去カウンタ値Rを取得しないため、再送攻撃の危険性を低減し、通信の安全性を担保することができる。
なお、本実施の形態で説明した通信方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本通信プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本通信プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)アドホックネットワーク内のノードであって、
自ノードでの消去回数を示す消去カウンタ値を上位桁とし前記自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記データおよび前記更新手段による更新後の連結カウンタ値を前記他ノードに送信する送信手段と、
前記記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記消去カウンタ値の取得要求を前記アドホックネットワークに配信する配信手段と、
前記配信手段によって前記取得要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値を受信する受信手段と、
前記受信手段によって受信された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記記憶手段に保存する保存手段と、
を備えることを特徴とするノード。
(付記2)アドホックネットワーク内のノードであって、
自ノードでの消去回数を示す消去カウンタ値を上位桁とし前記自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記データおよび前記更新手段による更新後の連結カウンタ値を前記他ノードに送信する送信手段と、
前記記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記消去カウンタ値の更新要求を前記アドホックネットワークに配信する配信手段と、
前記配信手段によって前記更新要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値に1加算された加算後の消去カウンタ値を受信する受信手段と、
前記受信手段によって受信された加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記記憶手段に保存する保存手段と、
を備えることを特徴とするノード。
(付記3)アドホックネットワーク内のノードであって、
自ノードでの消去回数を示す消去カウンタ値を上位桁とし前記自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する揮発性の第1の記憶手段と、
前記消去カウンタ値を記憶する不揮発性の第2の記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記第1の記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記データおよび前記更新手段による更新後の連結カウンタ値を前記他ノードに送信する送信手段と、
前記第1の記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記第2の記憶手段から前記消去カウンタ値を抽出する抽出手段と、
前記抽出手段によって抽出された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記第1の記憶手段に保存するとともに、前記第2の記憶手段に記憶されている前記消去カウンタ値に対し前記加算後の消去カウンタ値を上書き保存する保存手段と、
を備えることを特徴とするノード。
(付記4)自ノードおよび前記他ノードが有する共通鍵を用いて、自ノード固有の第1の識別情報を含む前記取得要求を暗号化する暗号化手段と、
前記共通鍵を用いて暗号化されたデータを、前記共通鍵を用いて復号する復号手段と、を備え、
前記配信手段は、
前記暗号化手段によって暗号化された前記取得要求を前記アドホックネットワークに配信し、
前記受信手段は、
前記共通鍵を用いて暗号化された前記消去カウンタ値と前記共通鍵を用いて暗号化された第2の識別情報とを、前記アドホックネットワークから受信し、
前記復号手段は、
前記受信手段によって受信された暗号化された前記消去カウンタ値と暗号化された前記第2の識別情報を、前記共通鍵を用いて復号し、
前記生成手段は、
前記第1の識別情報と前記復号手段によって復号された前記第2の識別情報とが一致した場合に、前記復号手段によって復号された前記消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成することを特徴とする付記1に記載のノード。
(付記5)自ノードおよび前記他ノードが有する共通鍵を用いて、自ノード固有の第1の識別情報を含む前記更新要求を暗号化する暗号化手段と、
前記共通鍵を用いて暗号化されたデータを、前記共通鍵を用いて復号する復号手段と、を備え、
前記配信手段は、
前記暗号化手段によって暗号化された前記更新要求を前記アドホックネットワークに配信し、
前記受信手段は、
前記共通鍵を用いて暗号化された前記加算後の消去カウンタ値と前記共通鍵を用いて暗号化された第2の識別情報とを、前記アドホックネットワークから受信し、
前記復号手段は、
前記受信手段によって受信された暗号化された前記加算後の消去カウンタ値と暗号化された前記第2の識別情報を、前記共通鍵を用いて復号し、
前記生成手段は、
前記第1の識別情報と前記復号手段によって復号された前記第2の識別情報とが一致した場合に、前記復号手段によって復号された前記加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成することを特徴とする付記2に記載のノード。
(付記6)前記第1の識別情報は乱数であることを特徴とする付記4または5に記載のノード。
(付記7)アドホックネットワーク内のノードであって、
他ノードでの消去回数を示す消去カウンタ値を上位桁とし前記他ノードからの送信回数を示す送信カウンタ値を下位桁とする第1の連結カウンタ値を、前記他ノードから受信する第1の受信手段と、
前記第1の受信手段によって受信された連結カウンタ値を記憶装置に保存する第1の保存手段と、
第2の連結カウンタ値を前記他ノードから受信する第2の受信手段と、
前記第2の受信手段によって受信された第2の連結カウンタ値が前記第1の連結カウンタ値よりも大きいか否かを判断する判断手段と、
前記判断手段によって大きいと判断された場合、前記第1の連結カウンタ値に前記第2の連結カウンタ値を上書保存する第2の保存手段と、
を備えることを特徴とするノード。
(付記8)前記他ノードから前記消去カウンタ値の取得要求を受信する第3の受信手段と、
前記第3の受信手段によって前記取得要求が受信された場合、前記記憶装置に記憶されている前記連結カウンタ値の中の消去カウンタ値を抽出する抽出手段と、
前記抽出手段によって抽出された消去カウンタ値を前記他ノードに送信する送信手段と、
を備えることを特徴とする付記7に記載のノード。
(付記9)前記他ノードから前記消去カウンタ値の更新要求を受信する第3の受信手段と、
前記第3の受信手段によって前記更新要求が受信された場合、前記記憶装置に記憶されている前記連結カウンタ値の中の消去カウンタ値を抽出する抽出手段と、
前記抽出手段によって抽出された消去カウンタ値に1加算した加算後の消去カウンタ値を前記他ノードに送信する送信手段と、
を備えることを特徴とする付記7に記載のノード。
(付記10)前記判断手段によって大きくないと判断された場合、前記第2の連結カウンタ値とともに受信されたデータを廃棄する廃棄手段を備えることを特徴とする付記7〜9のいずれか一つに記載のノード。
(付記11)アドホックネットワークを構成するノードにおける通信方法であって、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記ノードでの消去回数を示す消去カウンタ値を上位桁とし自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段に記憶されている連結カウンタ値のうち、前記送信カウンタ値を1加算し、
前記データおよび加算後の連結カウンタ値を前記他ノードに送信し、
前記記憶手段での前記連結カウンタ値の消去を検出し、
消去が検出された場合、前記消去カウンタ値の取得要求を前記アドホックネットワークに配信し、
前記取得要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値を受信し、
受信された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成し、
生成された連結カウンタ値を前記記憶手段に保存する、
ことを特徴とする通信方法。
(付記12)アドホックネットワークを構成するノードにおける通信方法であって、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記ノードでの消去回数を示す消去カウンタ値を上位桁とし自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段に記憶されている連結カウンタ値のうち、前記送信カウンタ値を1加算し、
前記データおよび加算後の連結カウンタ値を前記他ノードに送信し、
前記記憶手段での前記連結カウンタ値の消去を検出し、
消去が検出された場合、前記消去カウンタ値の更新要求を前記アドホックネットワークに配信し、
前記更新要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値に1加算された加算後の消去カウンタ値を受信し、
受信された加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成し、
生成された連結カウンタ値を前記記憶手段に保存する、
ことを特徴とする通信方法。
(付記13)アドホックネットワークを構成するノードにおける通信方法であって、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記ノードでの消去回数を示す消去カウンタ値を上位桁とし自ノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する揮発性の第1の記憶手段に記憶されている連結カウンタ値のうち、前記送信カウンタ値を1加算し、
前記データおよび加算後の連結カウンタ値を前記他ノードに送信し、
前記第1の記憶手段での前記連結カウンタ値の消去を検出し、
消去が検出された場合、前記消去カウンタ値を記憶する不揮発性の第2の記憶手段から前記消去カウンタ値を抽出し、
抽出された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成し、
生成された連結カウンタ値を前記第1の記憶手段に保存するとともに、前記第2の記憶手段に記憶されている前記消去カウンタ値に対し前記加算後の消去カウンタ値を上書き保存する、
ことを特徴とする通信方法。
(付記14)アドホックネットワークを構成するノードにおける通信方法であって、
他ノードでの消去回数を示す消去カウンタ値を上位桁とし前記他ノードからの送信回数を示す送信カウンタ値を下位桁とする第1の連結カウンタ値を、前記他ノードから受信し、
受信された連結カウンタ値を記憶装置に保存し、
第2の連結カウンタ値を前記他ノードから受信し、
前記第2の連結カウンタ値が前記第1の連結カウンタ値よりも大きいか否かを判断し、
大きいと判断された場合、前記第1の連結カウンタ値に前記第2の連結カウンタ値を上書保存する、
ことを特徴とする通信方法。
(付記15)アドホックネットワーク内の第1のノードと第2のノードとが通信するシステムであって、
前記第1のノードは、
前記第1のノードでの消去回数を示す消去カウンタ値を上位桁とし前記第1のノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記第2のノードを宛先にする第1のデータおよび前記更新手段による更新後の第1の連結カウンタ値を前記第2のノードに送信する第1の送信手段と、
前記記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記消去カウンタ値の取得要求を前記アドホックネットワークに配信する配信手段と、
前記配信手段によって前記取得要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値を受信する応答受信手段と、
前記応答受信手段によって受信された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記記憶手段に保存する生成値保存手段と、
前記生成値保存手段によって保存された後に、前記第2のノードを宛先にする第2のデータおよび前記記憶手段に記憶されている最新の連結カウンタ値について前記更新手段によって更新された第2の連結カウンタ値を、前記第2のノードに送信する第2の送信手段と、を備え、
前記第2のノードは、
前記第1の連結カウンタ値を、前記第1のノードから受信する第1の受信手段と、
前記第1の受信手段によって受信された第1の連結カウンタ値を記憶装置に保存する第1の保存手段と、
前記第2の連結カウンタ値を、前記第1のノードから受信する第2の受信手段と、
前記第2の受信手段によって受信された第2の連結カウンタ値が前記第1の連結カウンタ値よりも大きいか否かを判断する判断手段と、
前記判断手段によって大きいと判断された場合、前記第1の連結カウンタ値を前記第2の連結カウンタ値に上書保存する第2の保存手段と、
を備えることを特徴とする通信システム。
(付記16)アドホックネットワーク内の第1のノードと第2のノードとが通信するシステムであって、
前記第1のノードは、
前記第1のノードでの消去回数を示す消去カウンタ値を上位桁とし前記第1のノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記第2のノードを宛先にする第1のデータおよび前記更新手段による更新後の第1の連結カウンタ値を前記第2のノードに送信する第1の送信手段と、
前記記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記消去カウンタ値の更新要求を前記アドホックネットワークに配信する配信手段と、
前記配信手段によって前記更新要求が配信された結果、前記アドホックネットワークから前記消去カウンタ値に1加算された加算後の消去カウンタ値を受信する応答受信手段と、
前記応答受信手段によって受信された加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記記憶手段に保存する生成値保存手段と、
前記生成値保存手段によって保存された後に、前記第2のノードを宛先にする第2のデータおよび前記記憶手段に記憶されている最新の連結カウンタ値について前記更新手段によって更新された第2の連結カウンタ値を前記第2のノードに送信する第2の送信手段と、を備え、
前記第2のノードは、
前記第1の連結カウンタ値を、前記第1のノードから受信する第1の受信手段と、
前記第1の受信手段によって受信された第1の連結カウンタ値を記憶装置に保存する第1の保存手段と、
前記第2の連結カウンタ値を、前記第1のノードから受信する第2の受信手段と、
前記第2の受信手段によって受信された第2の連結カウンタ値が前記第1の連結カウンタ値よりも大きいか否かを判断する判断手段と、
前記判断手段によって大きいと判断された場合、前記第1の連結カウンタ値を前記第2の連結カウンタ値に上書保存する第2の保存手段と、
を備えることを特徴とする通信システム。
(付記17)アドホックネットワーク内の第1のノードと第2のノードとが通信するシステムであって、
前記第1のノードは、
前記第1のノードでの消去回数を示す消去カウンタ値を上位桁とし前記第1のノードからの送信回数を示す送信カウンタ値を下位桁とする連結カウンタ値を記憶する揮発性の第1の記憶手段と、
前記消去カウンタ値を記憶する不揮発性の第2の記憶手段と、
前記アドホックネットワーク内の他ノードにデータを送信する場合、前記第1の記憶手段に記憶されている連結カウンタ値のうち前記送信カウンタ値を1加算する更新手段と、
前記第2のノードを宛先にする第1のデータおよび前記更新手段による更新後の第1の連結カウンタ値を前記第2のノードに送信する第1の送信手段と、
前記第1の記憶手段での前記連結カウンタ値の消去を検出する検出手段と、
前記検出手段によって消去が検出された場合、前記第2の記憶手段から前記消去カウンタ値を抽出する抽出手段と、
前記抽出手段によって抽出された消去カウンタ値に1加算した加算後の消去カウンタ値を上位桁とし前記消去により送信回数が0になったことを示す消去後の送信カウンタ値を下位桁とする連結カウンタ値を生成する生成手段と、
前記生成手段によって生成された連結カウンタ値を前記第1の記憶手段に保存するとともに、前記第2の記憶手段に記憶されている前記消去カウンタ値に対し前記加算後の消去カウンタ値を上書き保存する生成値保存手段と、
前記生成値保存手段によって保存された後に、前記第2のノードを宛先にする第2のデータおよび前記第1の記憶手段に記憶されている最新の連結カウンタ値について前記更新手段によって更新された第2の連結カウンタ値を前記第2のノードに送信する第2の送信手段と、を備え、
前記第2のノードは、
前記第1の連結カウンタ値を、前記第1のノードから受信する第1の受信手段と、
前記第1の受信手段によって受信された第1の連結カウンタ値を記憶装置に保存する第1の保存手段と、
前記第2の連結カウンタ値を、前記第1のノードから受信する第2の受信手段と、
前記第2の受信手段によって受信された第2の連結カウンタ値が前記第1の連結カウンタ値よりも大きいか否かを判断する判断手段と、
前記判断手段によって大きいと判断された場合、前記第1の連結カウンタ値を前記第2の連結カウンタ値に上書保存する第2の保存手段と、
を備えることを特徴とする通信システム。