応用情報技術者 2020年 秋期 午前2 問40
問題文
送信者Aからの文書ファイルと、その文書ファイルのディジタル署名を受信者 Bが受信したとき、受信者Bができることはどれか。ここで、受信者B は送信者 Aの署名検証鍵 X を保有しており、受信者B と第三者は送信者Aの署名生成鍵Yを知らないものとする。
選択肢
ア:ディジタル署名、文書ファイル及び署名検証鍵 Xを比較することによって、文書ファイルに改ざんがあった場合、その部分を判別できる。
イ:文書ファイルが改ざんされていないこと、及びディジタル署名が署名生成鍵 Y によって生成されたことを確認できる。(正解)
ウ:文書ファイルがマルウェアに感染していないことを認証局に問い合わせて確認できる。
エ:文書ファイルとディジタル署名のどちらかが改ざんされた場合、どちらが改ざんされたかを判別できる。
🔒 解説は解答すると表示されます
ディジタル署名の保証内容【午前2解説】
正解の理由
受信者が送信者Aの公開鍵(署名検証鍵)Xを用いて署名を検証すると、受信者は「文書ファイルが受信時点で改ざんされていないこと」と「その署名が対応する秘密鍵で生成されたこと(=公開鍵に対応する署名生成鍵で作られたこと)」を確認できます。したがって、正解はイです。
検証処理は受信した文書からハッシュ値 を計算し、署名値を公開鍵で復号(または検算)して得られる値と比較することにより行われます。復号した値が と一致すれば、文書の整合性と署名者(秘密鍵の所有者)に由来することが保証されます。
検証処理は受信した文書からハッシュ値 を計算し、署名値を公開鍵で復号(または検算)して得られる値と比較することにより行われます。復号した値が と一致すれば、文書の整合性と署名者(秘密鍵の所有者)に由来することが保証されます。
解法ステップ
- 受信者は受け取った文書 M のハッシュ をハッシュ関数で算出する。例えば SHA-256: 。
- 受信したディジタル署名 S を送信者の公開鍵 X で検証する(RSA の場合は を計算してハッシュと比較、ECDSA 等は別の検証アルゴリズム)。
- 復号・検算結果と が一致すれば、文書は改ざんされておらず、署名は公開鍵 X に対応する秘密鍵で生成されたと判断する(イに該当)。
- 一致しない場合は「整合性が失われた」または「署名が有効でない」と判断するが、何が改ざんされたかの特定はこの手順だけではできない。
選択肢別の誤答解説
- ア: 「文書の改ざん部分を判別できる」とあるが誤りです。ディジタル署名の検証は文書全体の整合性を示すのみで、どの部分が改ざんされたかはわかりません。改ざん箇所の特定には、ファイルをブロック単位でハッシュ化して比較する方法(Merkle木など)や、差分比較ツール/バイナリ差分解析が必要です。単一のハッシュや署名だけでは変更箇所の位置は特定できません。
- イ: 正解。前述のとおり、検証により整合性(改ざんがないこと)と、署名が対応する秘密鍵で生成されたこと(署名の由来)を確認できます。
- ウ: ディジタル署名はマルウェアの有無を保証しません。署名はファイルの作成者(または秘密鍵所有者)による署名の正当性と文書の整合性を保証するのみで、マルウェア検査はウイルススキャンやサンドボックスなど別途の手段が必要です。よって誤りです。
- エ: 「どちらが改ざんされたかを判別できる」とありますが、署名検証の結果が不一致でもそれがファイルか署名のどちらの改ざんによるものかは確定できません。例えば署名自体が改ざんされている、ファイルが改ざんされている、あるいは受信者が誤った公開鍵を使っているなど複数の原因が考えられ、単独の検証で判別はできません。したがって誤りです。
よくある誤解
- 単一のハッシュやディジタル署名で「改ざん箇所が分かる」と思い込むこと。実際は改ざんの有無しか分からず、箇所特定にはブロック単位のハッシュ化(Merkle木)や差分解析が必要です。
- ディジタル署名が「マルウェアの有無」や「ファイルの安全性」そのものを保証すると思う誤解。署名は整合性と署名者証明に関する保証であり、ウイルススキャンとは目的が異なります。
- 署名検証が成功すれば送信者の「本人確認」になると過信すること。公開鍵と実際の個人・組織の結びつきが信頼できるか(証明書や信頼できる配布経路)が別途必要です。
補足コラム
- 改ざん箇所の特定手法:大きなファイルで改ざん箇所を知りたい場合、ファイルを固定長ブロックに分け各ブロックのハッシュを作成して比較する方法があります。Merkle木はこれを効率的に行う構造で、部分的な変更を特定・証明する際に有用です。
- 署名の信頼性:公開鍵 X が本当に送信者Aに帰属するかは、公開鍵を証明する仕組み(証明書とCA、鍵の配布方法)の信頼性に依存します。タイムスタンプ付き署名は署名時点の状態を証明する点で有益です。
- 技術差:RSA、ECDSA、EdDSA 等で署名・検証のアルゴリズムは異なりますが、概念は同じで「ハッシュ値と署名値を対応付けて検証する」点にあります。
参考:簡単なハッシュ計算(Python)
import hashlib
with open('document.bin','rb') as f:
h = hashlib.sha256()
while True:
chunk = f.read(8192)
if not chunk:
break
h.update(chunk)
print(h.hexdigest())
FAQ
Q: 署名検証に失敗した場合、まず何を確認すべきですか?
A: 公開鍵が正しい送信者のものか、伝送途中でデータが破損していないか、署名データ自体が完全に受信されているか、使用している検証アルゴリズムが正しいかを順に確認します。
A: 公開鍵が正しい送信者のものか、伝送途中でデータが破損していないか、署名データ自体が完全に受信されているか、使用している検証アルゴリズムが正しいかを順に確認します。
Q: 署名検証で「真正性」は完全に保証されますか?
A: 署名の技術的意義としては「公開鍵に対応する秘密鍵の所有者が署名した」ことを示しますが、その公開鍵と実在の人物・組織の結び付け(アイデンティティ確認)は別途の信頼手段が必要です。
A: 署名の技術的意義としては「公開鍵に対応する秘密鍵の所有者が署名した」ことを示しますが、その公開鍵と実在の人物・組織の結び付け(アイデンティティ確認)は別途の信頼手段が必要です。
Q: 部分的な改ざんを検出して位置を特定したいときは?
A: Merkle木やブロックごとのハッシュ比較、あるいは差分解析(バイナリ比較ツール)などを用います。単一の全体ハッシュや単一署名だけでは位置特定はできません。
A: Merkle木やブロックごとのハッシュ比較、あるいは差分解析(バイナリ比較ツール)などを用います。単一の全体ハッシュや単一署名だけでは位置特定はできません。
関連キーワード: ディジタル署名、公開鍵暗号、ハッシュ関数、整合性、真正性、Merkle木、タイムスタンプ、非否認

\ せっかくなら /
応用情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

