ITパスポート 2009年 秋期 問62
問題文
小文字の英字からなる文字列の暗号化を考える。次表で英字を文字番号に変換し、変換後の文字番号について1文字目分には1を、2文字目分には2を、…、n文字目分にはnを加える。それぞれの数を26で割った余りを新たに文字番号とみなし、表から対応する英字に変換する。
例 fax → 6, 1, 24 → 6+1, 1+2, 24+3 → 7, 3, 27 → 7, 3, 1 → gca
この手続で暗号化した結果が“tmb“であるとき、元の文字列はどれか。

選択肢
ア:she
イ:shy
ウ:ski
エ:sky(正解)
🔒 解説は解答すると表示されます
逐次加算による文字列の暗号化【ITパスポート 解説】
正解の理由
暗号化のルールは「各文字を 1–26 の番号に置き換え、1文字目は +1、2文字目は +2、… を加え、26で割った余りを新しい文字番号とする」です。暗号文が "tmb"(t=20, m=13, b=2)ならば、元の文字番号は各位置で「暗号番号 − 位置」を26で調整したものになります。計算すると元は s(19), k(11), y(25) になり、元の文字列は "sky"、よって正解は エ です。
解法ステップ
- 文字と番号の対応を確認
a=1, b=2, …, z=26 を使います(アルファベット小文字 → 1〜26)。 - 暗号文 "tmb" を番号に置き換える
t = 20、m = 13、b = 2。 - 各文字位置 i(1始まり)について「元の番号 = 暗号番号 − i」を計算し、範囲外になれば26を足す(つまり26で割った余りの扱いをする)。
- 1文字目: 20 − 1 = 19 → 19 = s
- 2文字目: 13 − 2 = 11 → 11 = k
- 3文字目: 2 − 3 = −1 → −1 + 26 = 25 → 25 = y
- 結果を文字に戻すと "sky"。選択肢の中ではエが一致します。
数学的にまとめると、暗号化は
(ただし a=1 とする扱いのため、剰余が0になったら26として扱う)で、復号は
です。
選択肢別の誤答解説
- ア: she
s(19)+1=20→t、 h(8)+2=10→j、 e(5)+3=8→h となり暗号文は "tjh"。したがって不適。 - イ: shy
s(19)+1=20→t、 h(8)+2=10→j、 y(25)+3=28→28≡2→b で暗号文は "tjb"。不適。 - ウ: ski
s(19)+1=20→t、 k(11)+2=13→m、 i(9)+3=12→l で暗号文は "tml"。不適。 - エ: sky
s(19)+1=20→t、 k(11)+2=13→m、 y(25)+3=28→28≡2→b で暗号文は "tmb"。一致 → 正解。
よくある誤解
- a を 0 として扱う(a=0, b=1…)してしまう誤り
本問題は a=1, z=26 の対応です。0始まりにすると位置ずれで全ての計算がずれます。 - 26で割った余りが 0 の扱いを忘れる
例えば合計が 26 のとき余りは 0 になりますが、文字番号は 1–26 なので 0 は 26(z)として扱います。 - 位置の数え方を 0 始まりにする(1文字目を0とする)
問題文は「1文字目分には1を…」なので位置は 1 から数えます。ここを間違えると ±1 の誤差が生じます。
補足コラム
- この暗号は「各文字を位置に応じてずらす」手法で、簡単な可変シフト暗号の一種です。1文字目は+1、2文字目は+2、… と増えていく点が特徴です。古典的なシーザー暗号(一定のずらし)とは違い、ずらす量が文字位置に依存します。
- 覚え方のコツ:暗号化は「足す」、復号は「引く」。位置は1から数える。余りが負や0なら26を足して1〜26に直す。
FAQ
Q1: 余りが 0 のときはどうする?
A1: 0 は 26 と同じ意味で z に対応します。計算実務では「結果が ≤ 0 なら 26 を足す」を使うと分かりやすいです。
A1: 0 は 26 と同じ意味で z に対応します。計算実務では「結果が ≤ 0 なら 26 を足す」を使うと分かりやすいです。
Q2: 長い文字列でも同じルール?
A2: はい。i が文字位置(1,2,3,…)であれば同じルールで各文字に加えます。ただし i が大きくなれば加算値が26を超えることがあり、その場合も剰余を取ります。
A2: はい。i が文字位置(1,2,3,…)であれば同じルールで各文字に加えます。ただし i が大きくなれば加算値が26を超えることがあり、その場合も剰余を取ります。
Q3: 実際にプログラムでやるには?(サンプル)
A3: 以下は復号(暗号文→平文)の簡単な Python 例です。
A3: 以下は復号(暗号文→平文)の簡単な Python 例です。
def char_to_num(ch):
return ord(ch) - ord('a') + 1 # a->1, b->2, ..., z->26
def num_to_char(n):
return chr((n-1) % 26 + ord('a')) # 1->a, ..., 26->z
def decrypt(cipher):
result = []
for i, ch in enumerate(cipher, start=1):
c = char_to_num(ch)
p = c - i
if p <= 0:
p += 26
result.append(num_to_char(p))
return ''.join(result)
print(decrypt("tmb")) # 出力: sky
関連キーワード: 暗号化、剰余算(モジュロ演算)、シーザー暗号、復号、アルファベット番号変換

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

