シリアルコードについての妄想

はじめに

 この文章は、完全なリハビリ目的なので、

  • 「半可通な素人の妄想」を
  • はてな記法を思い出しながら」
  • 「ある程度のまとまった量を、ある程度構造化した形で」

 書く、ということに主眼を置いています。
 題材に「シリアルコード」を選んだのは、一時期の自分が「CD 封入特典のシリアルコードでライブのチケットに応募」することをしていて( コロナ禍以降、その機会はめっきり減りましたが )、シリアルコードを利用したり、それについて妄想を巡らせる機会が多かった、というだけです。「半可通の妄想」なので、記述の正確さは保証しません。WEB 上の議論でたまに見かける「議論が深まっ太郎」とか、昔の匿名掲示板でいう「教えてくん」とかの類だと思ってください。

STEP1. 一意な番号類を、必要な件数準備する

 一番簡単な方法は、「1 からインクリメントして必要な数の自然数を得る」だろうか。
 名義尺度っぽいものであれば良いので「重複に注意して、必要な件数の乱数を得る」でも可能。
 「高級ブランド品に職人が一つ一つ手で刻印する」とか「小規模な商店街で、福引券などに利用する」とか、偽造の可能性がごく低い用途なら、ここで事足りるはず。

STEP2. STEP1.で作成した番号類に、チェックディジット類を付与する

 STEP1. で取得した「一意な番号類」を、そのまま使うと問題がある場合、チェックディジット類を付与して、対策を行う。
 問題の例としては、WEB上での抽選応募券などの用途がある。何も対策をしていないと、入力を受け付けるシステム側は、悪意のある人間に総当たり攻撃をされた場合、正規の番号類の入力と見分けがつかない。そこでチェックディジット類を利用して、総当たり攻撃を仕掛けても外れてしまう数が十分に多ければ、被害を減少させることが可能である。

STEP3. STEP2.で作成したものをエンコードする

 俺が見た範囲に限られるけど、実際のシリアルコードにはアルファベットと数字が混在していた。これは、何らかの方法でエンコードをしていると推測している。それが、古式ゆかしい BASE64 とか BASE32 とかなのか、それともどこかの誰かが独自に考えたエンコードなのか、その辺はよくわからない。アルファベットの大文字小文字があることから、BASE64 の可能性は高い。記号類 ( +、/、= )は意図的に回避しているのかもしれない。
 エンコード、と関連して、暗号化しているケースもありうる。案件ごとに( STEP2. の例で言うならば、「先行抽選 1 回目」「先行抽選 2 回目」など )、キーを決めて、暗号化したものを公表している、という可能性もある。

終わりに

 以下、箇条書きっぽく。
 特に、この記事にオチはない。
 この文章を書く際に、自分の中の怨敵が「車輪の再開発みたいなことを……」と囁いてくる場面があったが、華麗にスルーする。妄想だからこまけぇことは良いんだよ。
 STEP2. のチェックディジットの件で、具体的な話をするともうちょっと分量を書けそうではある。

 例えば、

  • 元の一意な番号が 10 進数で 6 桁
  • 「1 桁目と 2 桁目」「3 桁目と 4 桁目」「5 桁目と 6 桁目」「1 桁目と 4 桁目」「2 桁目と 5 桁目」「3 桁目と 6 桁目」加算した結果の 1 の位をとって 6 桁

この合計 12 桁の番号を使うことで、入力を受け付けるシステム側で「元の一意な番号が正しいかどうか」「間違いがあった場合、それは何桁目か」といったことを判別可能になる。
 といったやり方がある。

 とかなんとか。上記は、引用記法を使っているが、自分でテキトーに考えた内容です。
 また、チェックディジット類の付与で「先頭側にまとめて付与」「末尾側にまとめて付与」「元の一意な番号と交互に付与」「更に、適宜、桁の入れ替えを行う」とかいった内容も時数稼ぎには良かったかもしれない。
 また、この辺を、実際に簡単なプログラミングごっこをしながら考えるのに役立つようなおもちゃが欲しい。だが、実行できていない。