基本情報技術者 2013年 春期 午前(科目A) 問37
問題文
手順に示す処理を実施したとき、メッセージの改ざんの検知の他に、受信者Bがセキュリティ上できることはどれか。
〔手順〕
送信者Aの処理
(1)メッセージから、ハッシュ関数を使ってダイジェストを生成する。
(2)秘密に保持していた自分の署名生成鍵を用いて、(1)で生成したダイジェストからメッセージの署名を生成する。
(3)メッセージと、(2)で生成したデータを受信者Bに送信する。
受信者Bの処理
(4)受信したメッセージから、ハッシュ関数を使ってダイジェストを生成する。
(5)受信したデータ、(4)で生成したダイジェスト及び送信者Aの署名検証鍵を用いて、署名を検証する。
選択肢
ア:メッセージが送信者Aからのものであることの確認(正解)
イ:メッセージの改ざん部位の特定
ウ:メッセージの盗聴の検知
エ:メッセージの漏えいの防止
🔒 解説は解答すると表示されます
電子署名と認証【午前解説】
正解の理由
正解: ア
手順では送信者Aがメッセージのダイジェストを自分の秘密鍵で署名し、受信者Bがその署名を送信者の公開鍵で検証しています。この仕組みは次を満たします。
- 署名検証に成功すれば、メッセージは署名を作成した秘密鍵の所有者(=送信者A)によるものであると確認できます(真正性)。
- 同時に、ダイジェストと署名の不一致は改ざんの検出を意味します(整合性)。
しかし、通信路での盗聴検知やメッセージの漏えい防止(機密性)は公開鍵/署名方式そのものの機能ではありません。したがって選択肢のうち正しいのは「送信者Aからのものであることの確認(ア)」です。
解法ステップ
- 手順を読み、用いられている機能を整理する:ハッシュ(ダイジェスト)生成+秘密鍵での署名+公開鍵での検証。
- それぞれの技術が提供するセキュリティサービスを対応付ける:ハッシュ=整合性確認、署名(秘密鍵)=真正性(署名者の確認)、公開鍵=検証手段。
- 選択肢を照合する:真正性(送信者確認)は提供されるが、機密性(盗聴検知・漏えい防止)は提供されない。
- よって「送信者Aからのものであることの確認(ア)」を選択する。
選択肢別の誤答解説
- ア(正解)
送信者Aの秘密鍵で生成した署名を公開鍵で検証することで、送信者の真正性を確認できます。ダイジェストと署名の一致により改ざんも検知できます。 - イ(誤り)
署名検証が失敗すれば改ざんは検出できますが、どの位置が改ざんされたかまでは分かりません。ハッシュ比較は全体整合性の検証であり、差分位置の特定は別手法が必要です。 - ウ(誤り)
盗聴(傍受)はメッセージが第三者に読まれることを指しますが、署名検証だけでは傍受の有無は分かりません。盗聴検知にはチャネル監視やTLSのような通信保護が必要です。 - エ(誤り)
漏えい防止=機密性の確保は暗号化(公開鍵暗号や共通鍵暗号)によって行います。署名は暗号化を伴わないため、情報の漏えいを防ぎません。
よくある誤解
- デジタル署名は「暗号化」と同義だと考える誤解:署名は認証と整合性を提供しますが、内容を秘匿するものではありません。
- 署名の不一致で「どの箇所が改ざんされたか」が分かると誤解する点:署名検証は改ざんの有無を示すだけで、変更箇所の特定はできません。
- 署名により「盗聴が検知できる」と考える誤り:盗聴(第三者が通信を傍受すること)は検知できず、検出には通信レイヤや監査が必要です。
補足コラム
- 非否認性(後に送信者が否認できないこと):署名は一般に非否認性を提供しますが、鍵管理(秘密鍵の保護)や鍵の帰属確認(証明書)が適切でないと完全ではありません。
- ハッシュ関数の役割:ハッシュは可変長データを固定長に要約し、効率的に署名可能にします。衝突耐性が弱いハッシュを使うと整合性保証が脆弱になります。
- 実務的対策:認証と機密性を両立したい場合は「署名+暗号化」の組合せや、先に暗号化してから署名(あるいは逆)する運用方針を明確にします。
- 用語整理:整合性(Integrity)、真正性(Authentication / Origin Authentication)、機密性(Confidentiality)、非否認性(Non-repudiation)。
簡単なPythonイメージ(概念示例、ライブラリの仮定あり):
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import rsa, padding
# 署名生成(概念)
digest = hashes.Hash(hashes.SHA256())
digest.update(message)
h = digest.finalize()
signature = private_key.sign(h, padding.PSS(...), hashes.SHA256())
# 署名検証(概念)
public_key.verify(signature, h_received, padding.PSS(...), hashes.SHA256())
FAQ
Q1: 署名が成功すればメッセージが改ざんされていないと断言できますか?
A1: 基本的にははい。ただし使用ハッシュ関数や署名アルゴリズム、鍵の安全性(秘密鍵の漏洩)が前提条件です。脆弱なアルゴリズムや鍵漏洩があると保証は崩れます。
A1: 基本的にははい。ただし使用ハッシュ関数や署名アルゴリズム、鍵の安全性(秘密鍵の漏洩)が前提条件です。脆弱なアルゴリズムや鍵漏洩があると保証は崩れます。
Q2: 署名と暗号化はどちらを先に行えばよいですか?
A2: 要件により異なります。一般に機密性を優先するなら先に暗号化してから署名、署名の検証を優先するなら署名後に暗号化する運用もあります。運用方針とプロトコルに従ってください。
A2: 要件により異なります。一般に機密性を優先するなら先に暗号化してから署名、署名の検証を優先するなら署名後に暗号化する運用もあります。運用方針とプロトコルに従ってください。
Q3: 署名で非否認性は完全に保証されますか?
A3: 完全ではありません。非否認性を主張するには鍵管理(秘密鍵保護)、鍵の者帰属(証明書・CA)、時刻情報(タイムスタンプ)などが必要です。
A3: 完全ではありません。非否認性を主張するには鍵管理(秘密鍵保護)、鍵の者帰属(証明書・CA)、時刻情報(タイムスタンプ)などが必要です。
関連キーワード: 電子署名、ハッシュ関数、公開鍵暗号、整合性、真正性、非否認性、機密性、署名検証、暗号化、鍵管理

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

