立命館の学生証番号の話
こんにちは、M1のYukimuraです。研究室のブログなので流石にそろそろ真面目に技術的なことを書きます。
お題はタイトルの通り(「お題はタイトルの通り」には「画像はイメージです」みたいなおかしさを感じますが)、学生証番号(のチェックデジット)の話です。
ちなみに弊研の上原教授も同じようなネタでデジタル・フォレンジック協会のコラムに寄稿されています。('22年6月6日追記:上原先生にお話を伺ったところKMCの部誌にも似たような内容で寄稿したとのことでしたのですごく二番煎じです本当にありがとうございました。)
(この記事は、立命館コンピュータクラブのRCC会誌2021に私が寄稿した内容を再構成・加筆して公開するものです)
学生証番号の話
弊学学生には、(関係者なら)御存知の通り、11桁の学生証番号が付与されています。
この11桁、普通に学生生活をしていれば、学部ごと・入学年度ごとに規則性があることに気づくと思いますが、この規則性は実は「立命館大学学び支援サイト」なるサイトに書かれています。
以下引用
入学を許可した者に学生証番号を付与します。学生証番号は、原則として在籍中も卒業後も変わりません。
学生証番号 | 学び支援サイト | 立命館大学
<学生証番号の仕組み>
学生証番号(11ケタ)の構成(各記号は、次の内容を指します)
○○●●△△□□□□―■
○○:学部、●●:学科・専攻等、△△:適用年度(*)、□□□□:個人番号、■:チェックデジット
※ 転籍、再入学した場合は学生証番号が変わることがあります。
(*)「適用年度」は、適用されるカリキュラムが何年度入学生用のものであるかを示しています。通常は「入学年度」と同じですが、編入学、転入学、再入学した場合は「入学年度」と異なります。ただし、再入学においては、場合によって「入学年度」と同じになることもあります。
引用終わり
つまり例えば(以降例示する学生証番号は実在しません)、「2600180892-2」という学生証番号の場合、26が学部を表し、00が学科・専攻等、18が適用(入学)年度、0892が個人番号で、2がチェックデジットとなります。
ちなみに学部の番号対応は以下です。(今回の記事の趣旨から外れるので詳しい説明は省きます)
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 |
法 | 経済 | 経営 | 産社 | 国関 | 文 | 文 | 政策 | 映像 | 総心 | 理工 | 理工 | 理工 | 欠番 | 食マ | 情理 | 生命 | 薬 | スポ |
下段:学部
個人番号は、入学者のあいうえお順通し番号のよう(筆者推測)で、ここから上記の2600180892-2という番号は存在しないことがわかるかと思います(情報理工学部の2018年度入学者は約400人)。
そして最後のチェックデジットが今回の記事の主題になります。
チェックデジット
そもそもチェックデジットとは何かという話で、これは簡単に言うと「入力誤りを機械的に検知するために本来の文字列に付与される文字」です。つまり学生証で言えば、上10桁の入力が間違ってないか、ということを一定の数式で計算していて、それをハイフンの次に書いているということになります。
その計算式が以下
$$11-\sum_{n=1}^{10}(P_{n}Q_n)\bmod11$$
ただし
Pn:チェックデジットを除いた学生証番号の上10桁の最下位を1桁目と見たときのn桁目
Qn:1≦n≦6でn+1、7≦n≦10でn-5
チェックデジット≧10の時0と扱う
です。この方法はどうやらモジュラス11ウェイト2~7という手法のようで、上で紹介した上原先生の記事内で触れられている、マイナンバーでも用いられています。このモジュラス11ウェイト2~7なるアルゴリズムは、通常であれば一桁誤りや入れ替え誤りを検知できるチェックデジット手法になっています。
さて、この手法をもう少し具体的に説明すると、学生証番号をabcdefghij-kであるとした時に
$$k=11-(a\times5+b\times4+c\times3+d\times2+e\times7+f\times6+g\times5+h\times4+i\times3+j\times2)\bmod11$$
ただしk≧10の時0と扱う
です。(以下ではチェックデジット計算結果=K,学生証番号の11桁目=kと扱います)。
これを計算してみると、どんな学生証番号でもキチッとこの法則に則ってチェックデジットが振られていることがわかります。合わないときは、記憶違い書き間違い読み間違い聞き間違いのどれかです。
しかしここでおやおや?と思うのが、「チェックデジット≧10の時0と扱う」ということです。こういうことをしてしまうと、abcdefghij-0の学生証番号の一桁誤りすら検知出来ない場合が発生してしまいます。
言い換えると「一桁しか違わない学生証が(理論上)出来得る」ということになり、これって結構厄介な問題なんじゃないかな〜と筆者は思います。
具体的にどのようなシーンで一桁誤りを検知できないかというと、K=10であって5桁目を-2もしくは10桁目or4桁目を+2間違った場合、もしくはK=11であって5桁目を+2もしくは10桁目or4桁目を-2間違った場合です。
(入れ替え誤りは例を考えるのが面倒難しかったので許してください)
例えばk=0でK=11となる学生証番号「2600150969-0」で考えます。
上のルールに則れば、
- 2600170969-0
- 0600150969-0
- 2600159969-0
は1文字誤りであるのにも関わらず、(チェックデジット的に)成立する学生証番号であるということになります。ちなみに0-9はmod 11なので2です。
流石に手計算するのは面倒ですね。こんなところに筆者謹製の学生証番号チェッカーというツールがあるのでこれで確認してみましょう。
ということで、しっかり正しいと認識されました。
これで何が一番厄介かというと、5桁目を間違える場合です。10桁目は先述の通り学部を表していて、一桁違うと存在しない学部を指すことになりますし、4桁目は個人番号(通し番号)の千の位なのでそんなに(2000人以上)同じ学科の同期は居ないだろという話になります。
しかし5桁目の±2は、入学年の1の位なので、存在し得ます。(流石にここだけ違う人は見たことがないので、既に大学で対策済みであれば存在しませんが。)
同じ学部学科であれば、当然同じ授業を受けてる可能性もありますし、提出物とかであれば、うっかり書き間違ってもチェックデジットで検知されないどころか違う人物の提出とみなされてしまうんじゃないか、テストだったらもっと悲惨だ、と不安が尽きない筆者であります。
話のオチとしては、k=0の学生は、学生証番号の書き損じには気をつけましょうというところになるのですが、きっと本来はチェックデジットが0になる学生証番号は除外して付与するべきだったのではないか?と思います。
K=10,11の場合でk=0になるので、超超概算で18%の学生はk=0であり、テストのときに余計な気を使わないといけません(当然k=1~9の学生も学生証番号の書き損じに緩慢であって良いという話ではありません)。
ただし、そもそも学生証番号を書くときは普通名前も書くし、チェックデジットだけで実際に検査してるところを見たわけではない(学内DBみたいなのと照合してるのでは?と予想>筆者)ので、これだけで直ちに大問題!というわけでもありません。設計的にもう少しやりようがあったのでは?という話なので、テストのときに学生証番号の書き損じにばかり集中しないようには、気をつけてくださいね。
当然もちろん、私も全ての学生証番号を見たわけでもなんでも無いので、もし大学側にて対策がされているようなら本件は一件落着です(が実際問題、サークル内で見てみてもk=0の学生は有意に多いので対策されているような印象は受けません)。
おわりに
というわけで学生証のチェックデジットの計算式と、現行手法の問題提起を絡めた記事でした。
研究室でも2020年度卒業論文で「日本に最適化されたDammアルゴリズムの表の選択」という論文が出ていますし、誤り検知というのは悪意の有無に関わらずセキュリティ的には重要な課題なのかな〜な〜んてことを、身近な学生証番号から感じました。
学生証といえば、学生証リーダーを作った話もあるのですが、それはまた次の機会('22年6月13日追記:書きました->立命館の学生証の話)に。
(文責:2022年度M1 木村 悠生)