「IchigoJam Advent Calendar 2020」で換字式暗号のネタがあったので、私も簡単なプログラムを作ってみました。
短いプログラムなので、教室でやってみても面白いと思います。
暗号化プログラム
- 元の文字列をA~Zとスペースで入力します。「”」(ダブルクォーテーション)で囲って入力してください。
- 暗号キーの数字を何か決めて入力します。
- 暗号化された文字列が表示されます。
10 CLS:?"*** アンゴウカ ***":? 20 FOR I=0 TO 25 30 [I]=I 40 NEXT 50 ?"*モトノモジレツ(A-Z)?" 60 INPUT "",Z 70 INPUT "*キーナンバー?",S 80 SRND S 90 FOR I=1 TO 100 100 A=RND(26):B=RND(26) 110 C=[A]:[A]=[B]:[B]=C 120 NEXT 130 ?:?"*アンゴウ" 140 FOR I=0 TO LEN(Z)-1 150 C=PEEK(Z+I):E=C 160 IF E>64 && E<91 E=[C-65]+65 170 ?CHR$(E); 180 NEXT:?
復号化プログラム
- 暗号の文字列をA~Zとスペースで入力します。「”」(ダブルクォーテーション)で囲って入力してください。
- 暗号キーの数字を入力します。
- 元の文字列が表示されます。
10 CLS:?"*** フクゴウカ ***":? 20 FOR I=0 TO 25 30 [I]=I 40 NEXT 50 ?"*アンゴウ(A-Z)?" 60 INPUT "",Z 70 INPUT "*キーナンバー?",S 80 SRND S 90 FOR I=1 TO 100 100 A=RND(26):B=RND(26) 110 C=[A]:[A]=[B]:[B]=C 120 NEXT 130 FOR I=0 TO 25 140 [30+[I]]=I 150 NEXT 160 ?:?"*モトノモジレツ" 170 FOR I=0 TO LEN(Z)-1 180 C=PEEK(Z+I):D=C 190 IF D>64 && D<91 D=[C-35]+65 200 ?CHR$(D); 210 NEXT:?
プログラムの説明
換字式(かんじしき)暗号は、例えば「A」~「Z」のアルファベット26文字だったら、それらを別のアルファベットに変換する暗号です。
※文字を変換する換字表の一例。ここでの「S」のように、たまたま同じ文字に変換されることもあります。
このプログラムでは「A」~「Z」は暗号化されますが、それ以外の文字は変換されずにそのまま出力されます。ですので元の文字列にはアルファベット以外の数字や記号が入っても構いません。
ここでは「暗号キー」(キーナンバー)と言っている数字ですが、要はSRND命令のシード(種)の数字を設定しています(80行)。この数字が同じなら、その後にRND関数で出てくる乱数は必ず同じになり、作られる換字表も同じになります。
換字表の作り方は、最初に20~40行でA~Zの26文字(0~25の数字)が順番に並んだ表を配列変数[0]~[25]に作り、90~120行で「乱数で2個の配列変数を取り出してその値を交換する」を100回くり返して、ランダムな換字表にしています。
(復号化プログラムでは逆引きの換字表が必要なので、さらに130~150行で[30]~[55]に逆引きの換字表を作っています)
それ以降は2つともほぼ同じプログラムで、換字表を元に1文字ずつ変換しています。