戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

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“であるとき、元の文字列はどれか。
ITパスポート 2009年 秋期  問62の問題画像

選択肢

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"、よって正解は です。

解法ステップ

  1. 文字と番号の対応を確認
    a=1, b=2, …, z=26 を使います(アルファベット小文字 → 1〜26)。
  2. 暗号文 "tmb" を番号に置き換える
    t = 20、m = 13、b = 2。
  3. 各文字位置 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
  4. 結果を文字に戻すと "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"。一致 → 正解。

よくある誤解

  1. a を 0 として扱う(a=0, b=1…)してしまう誤り
    本問題は a=1, z=26 の対応です。0始まりにすると位置ずれで全ての計算がずれます。
  2. 26で割った余りが 0 の扱いを忘れる
    例えば合計が 26 のとき余りは 0 になりますが、文字番号は 1–26 なので 0 は 26(z)として扱います。
  3. 位置の数え方を 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 を足す」を使うと分かりやすいです。
Q2: 長い文字列でも同じルール?
A2: はい。i が文字位置(1,2,3,…)であれば同じルールで各文字に加えます。ただし i が大きくなれば加算値が26を超えることがあり、その場合も剰余を取ります。
Q3: 実際にプログラムでやるには?(サンプル)
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クイズ機能

\ せっかくなら /

ITパスポート
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について